使用uWSGI、Nginx與Docker Compose部署Python Web Application(Flask, Django) — 最終章
上一個章節,已經說明了關於uWSGI與Nginx的參數配置,可以參考這裡。本節我們將透過Docker Compose來進行Python的Web Application的最終部署,由於篇幅的關係,關於Docker與Docker Compose的下載安裝便不贅述,請讀者自行參考其他文章。
Docker Compose的參數配置
我們來創建docker-compose.yml,存放Docker相關的配置。
$ vim docker_develop/docker-compose.yml
version: "3"services:
flask:
container_name: flask
build:
context: ../
dockerfile: Dockerfile
command: uwsgi — ini uwsgi.ini
env_file: hotel.env
expose:
- "8700"
sysctls:
- net.core.somaxconn=4096
ports:
- "8700:8700"
# uwsgitop
- "5002:5002" nginx:
container_name: nginx
image: nginx:1.19.5-alpine
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/sites-enabled/nginx.conf
- ./nginx/site_enabled/default.conf:/etc/nginx/conf.d/default.conf
restart: always
關於Flask的Container,我們會撰寫Dockerfile以Build出Flask的Image,而Nginx的Container則會自動去Docker Hub下載nginx:1.19.5-alpine image。
Flask的Container會暴露8700 Port,作為uWSGI接收Nginx轉發HTTP請求的管道;5002 Port則是方便我們查看每個process的狀況。Nginx容器則預設開啟80 Port,接收前端發送的請求。
透過env_file的參數配置,我們可以創建XXX.env檔案,將Secret Key、Password等敏感的環境變量設定於此(不能放到GitHub);Python的Web Application可以透過os.environ.get
獲取所設定的環境變量。
net.core.somaxconn則是指Flask的Container能夠被外界同時訪問的上限次數,默認是128個,如服務流量相當高,則需調高預設值以處理高併發的狀況,同時該值必須大於uwsgi.ini中listen的參數。
待flask的容器建置完畢後,便會執行uwsgi --ini uwsgi.ini
,啟動Web Application。
接著,我們創建Dockerfile文件vim Dockerfile
。
FROM python:3.6-onbuild
RUN pip install — upgrade pip
RUN pip install — upgrade setuptools
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app/
RUN pip install — no-cache-dir -r requirements.txt
COPY . /usr/src/app
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
請注意requirements.txt由讀者們依專案需求自行配置(需添加uWSGI與uwsgitop這兩個Python套件),接著配置entrypoint.sh vim entrypoint.sh
。
#!/bin/bash
set -e
exec "$@"
至此便已經完成程序部署的前置作業,如對目錄結構不清楚者,可查看上篇文章,或者是以下GitHub專案(Flask部署, Django部署)。
Web 部署
首先,我們進入docker_develop的目錄下,就可以透過Docker Compose進行部署了!
$ cd docker_develop
$ sudo docker-compose up --build -d
輸入上述命令後,Docker Compose便會自動建立Flask與Nginx的Container,至此,部署完成,讓我們熟悉Docker的簡單操作。
# 查看當前docker進程
$ sudo docker ps# 查看flask container最近20筆的log
$ sudo docker-compose logs --tail=20 -f flask# 停止flask容器進程
$ sudo docker stop flask# 重啟flask容器進程
$ sudo docker restart flask#進入容器
$ sudo docker exec -it flask /bin/bash
我們可以查看每個進程處理請求的狀況。
$ uwsgitop 127.0.0.1:5002

至此便介紹完Python Web Application的部署,關於如何透過supervisor套件對uWSGI進行後台管理,以及透過Prometheus蒐集Web Application處理狀況,筆者會再找時間和大家分享。如讀者認為該篇文章有所助益,可多多分享並且拍手,表示對我的支持與鼓勵。