Flask項目Docker容器化部署原理與實現

本文將介紹Flask的部署方案:Flask + Nginx + uWSGI,並使用docker進行容器化部署,部署的實例來源 Flask開發初探,操作系統爲ubuntu。

Flask系列文章

  1. Flask開發初探
  2. WSGI到底是什麼
  3. Flask源碼分析一:服務啓動
  4. Flask路由內部實現原理

部署方案

在開發時,我們使用flask run命令啓動的開發服務器是werkzeug提供的,但是這種方式目的是爲了開發,不能很好的擴展,不適合生產部署。生產部署,我們需要一個更強健,性能更高的WSGI服務器(關於WSGI,可參考WSGI到底是什麼 ,常用的服務器有:uWSGI、Gunicorn等,本文以uWSGI舉例。

像uWSGI這類WSGI服務器內置了Web服務器,所以我們不需要web服務器也可以與客戶端交換數據,處理請求和響應,但是內置的web服務器不夠強健,一般情況下都會使用一個常規的web服務器運行在前端,爲WSGI服務器提供反向代理,web服務器選擇Nginx,Nginx會把外部的請求轉發給uWSGI處理,接收到響應後再返回給客戶端,這樣做的好處有:

  1. 提高靜態文件的效率,因爲Nginx處理靜態文件的速度非常快
  2. 提升系統安全性,避免直接暴露WSGI服務器
  3. 提升程序處理能力,通過設置反向代理,配置負載均衡可以實現。

uWSGI配置

在使用uwsgi部署flask應用時,一定要記得將app.run()方法放在if __name__ == '__main__': 內部或者單獨文件內,這樣就可以保證其不會被調用,從而不會啓動本地服務器。

uwsgi是一個服務器,使用前一定要安裝:

pip install uwsgi

配置文件:

socket=/tmp/app.sock
chmod-socket=666
pidfile=/etc/nginx/uwsgi.pid
chdir=/home/**/mygithub/learn_flask/app
master=true
wsgi-file=serve.py
http=127.0.0.1:8005
callable=app
processes=8
threads=4
lazy-apps=true

對所配置的參數進行說明:

  • callable:Flask項目的實例名稱
  • module:可調用對象的名稱
  • processes:開啓多少個子進程處理請求。
  • threads:每個進程的線程數

更多參數詳情可見:uwsgi中文文檔

在命令行中啓動uwsgi服務器:

uwsgi --ini uwsgi.ini

在瀏覽器中輸入 http://127.0.0.1:8005,可以驗證服務啓動。

nginx配置

安裝nginx:

apt-get install nginx

啓動nginx:

service nginx start

重啓

service nginx restart

nginx配置:

server{
    listen  8080;
    server_name localhost;
    
    access_log /var/log/nginx/app_access.log;
    error_log /var/log/nginx/app_error.log;
    
    location / {
    	include uwsgi_params;
    	uwsgi_pass unix:/tmp/app.sock
	}
}

nginx配置文件nginx.conf通過include引用了conf.d和site_enabled這兩個文件夾中的配置文件,所以我們可將配置文件放在這兩個路徑任意一處。

重啓nginx和uwsgi,在瀏覽器中輸入 http://127.0.0.1:8088 ,可以驗證服務啓動。

這樣,就完成基礎的nginx+uwsgi完成了Flask的部署。

容器化部署

接下來,介紹使用docker進行容器化部署。

docker配置

建議瞭解docker基本操作,首先,創建Dockerfile:

FROM ubuntu:16.04

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
RUN apt update && apt install -y iputils-ping python3 python3-pip python3-tk libffi-dev libssl-dev
RUN apt install -y nginx && pip3 install uwsgi

ADD ['./', "/app"]
ADD ['./build', "/app"]
WORKDIR /app

RUN pip3 install -r requirements.txt

RUN chmod + x start_script.sh
CMD ['/start_script.sh']

注意:

  1. 該鏡像的基礎鏡像爲ubuntu:16.04,可自行docker pull
  2. 編寫服務啓動腳本start_script.sh
ln -s /app/nginx.conf /etc/nginx/conf.d/
nginx && uwsgi --ini uwsgi.ini

python3 serve.py

使用命令:

docker build -t image .

以上,就打包完成了鏡像 (imagename),接下來執行docker run -d --name test imagename啓動容器,執行docker ps -a 可以看到剛纔啓動的容器,執行docker logs -f 可查看日誌。

另外,推薦使用k8s對docker容器進行編排管理,具體使用後續博客介紹。

代碼可參照:my github

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章