使用docker搭建nginx,flask,gunicorn運行環(huán)境

時間 2016-07-23

1.簡介

docker:非常流行的容器技術(shù),本文是用其搭建ubuntu虛擬環(huán)境
nginx:高性能反向代理服務(wù)器
flask:微型web框架,可快速編寫web應(yīng)用
gunicorn: 異步處理框架

2.安裝docker

https://www.docker.com/products/docker上有各平臺的docker安裝方法,本文不再贅述。

3.啟動ubuntu容器

啟動docker后執(zhí)行命令:

docker run -ti -p 80:80 -p 5000:5000 --name flask_nginx ubuntu:16.04 bash

其中80端口分配給nginx,5000端口分配給flask應(yīng)用。

4.安裝nginx,python相關(guān)包

進入容器后執(zhí)行命令

apt-get update -y
apt-get install python3-pip python3-dev nginx vim -y
pip3 install gunicorn flask gevent

5.編寫flask測試應(yīng)用

創(chuàng)建目錄/var/www/demo,創(chuàng)建文件myproject.py

mkdir /var/www/demo
cd /var/www/demo
vim myproject.py

創(chuàng)建flask應(yīng)用

# -*- coding:utf-8 -*-

from flask import Flask
import time

app = Flask(__name__)

@app.route('/')
def index():
    time.sleep(0.01) # 模擬程序阻塞
    return 'hello world!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

啟動應(yīng)用

python3 myproject.py

打開http://127.0.0.1:5000,如果能看到 hello world!,證明實例應(yīng)用已啟動。

6.使用gunicorn啟動flask應(yīng)用,并將通訊綁定到myproject.sock上

Ctrl + c 停止flask應(yīng)用,創(chuàng)建文件wsgi.py

vim wsgi.py
# -*- coding:utf-8 -*-

from myproject import app

if __name__ == "__main__":
    app.run()

執(zhí)行命令

gunicorn --workers 3 --bind unix:myproject.sock --daemon -m 007 --user www-data --worker-class gevent wsgi:app

--worker-class 進行工作模式,默認是sync,會造成程序阻塞,這里使用gevent。
--workers 指定啟動多少個進程,根據(jù)機器cpu核數(shù)來定。
--bind 指定通訊綁定到哪個.sock文件上。
--daemon 指定后臺啟動。
--user 指定用哪個用戶啟動這個進程,由于ubuntu采用apt-get安裝的nginx默認啟動用戶是www-data,所以這里使用www-data,以免nginx沒有權(quán)限訪問.sock文件。
可使用top指令查看gunicorn程序啟動情況:

如圖所示,gunicorn啟動了3個工作進程和1個主進程。從圖中也可以看出docker容器只啟動了必要的進程,對資源的占用非常小。

7.配置nginx配置文件,啟動nginx

移除默認nginx配置文件,創(chuàng)建nginx配置文件myproject

rm -y /etc/nginx/sites-enabled/default
vim /etc/nginx/sites-available/myproject
server {
    listen 80;
    server_name server_domain_or_IP;

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/demo/myproject.sock;
    }
}

鏈接到配置文件路徑

ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

啟動nginx

nginx

打開http://127.0.0.1,如果能看到 hello world!,證明配置正確。

8.Dockerfile及docker image

如果上述文章沒有描述清楚,請在https://github.com/zhanghongnian/docker_nginx_gunicorn_flask下載Dockerfile,自行build,
或者執(zhí)行中dockr pull zhnliving/nginx_flask下載docker鏡像,并運行
后臺運行容器請執(zhí)行docker run -d -p 80:80 zhnliving/nginx_flask
進入容器內(nèi)部請執(zhí)行docker run -ti -p 80:80 zhnliving/nginx_flask bash
歡迎加qq:453039449,一起學(xué)習(xí)。

9.參考

9.1.如何在ubuntu16.04上使用nginx和gunicorn部署flask應(yīng)用
9.2.用gunicorn和gevent提高python-web框架的性能
9.3.使用gevent為IO繁忙型wsgi服務(wù)打個性能補丁

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容