一、準備工作
確保已經安裝以下軟件:
- Docker
- Docker Compose
- Python 3.x
二、創建 Flask 應用
首先,創建一個簡單的 Flask 應用。創建一個新的目錄并在其中創建以下文件:
1. app.py
python
fromflask importFlask, jsonifyapp = Flask(__name__)@app.route('/')defhello_world():returnjsonify(message='Hello, World!')if__name__ == '__main__':app.run(host='0.0.0.0')
2. requirements.txt
txt
Flask==2.0.1
gunicorn==20.1.0
三、創建 Dockerfile
在同一目錄中創建一個 Dockerfile 文件:
Dockerfile
# 使用官方的 Python 基礎鏡像
FROM python:3.9-slim
# 設置工作目錄
WORKDIR /app
# 復制依賴文件并安裝依賴
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# 復制項目文件到工作目錄
COPY . .
# 暴露應用程序端口
EXPOSE 8000
# 啟動應用程序
CMD ["gunicorn", "--workers=3", "--bind=0.0.0.0:8000", "app:app"]
四、創建 Docker Compose 文件
在同一目錄中創建一個 docker-compose.yml 文件:
yaml
version:'3'services:web:build:.ports:-"8000:8000"environment:-ENV=production
五、構建和運行 Docker 容器
在項目目錄下運行以下命令來構建和啟動容器:
bash
docker-compose up --build
六、優化 Gunicorn 配置
為了更好地處理高并發請求,可以根據服務器的性能和應用需求調整 Gunicorn 的配置。這里是一些常見的優化參數:
- --workers:設置工作進程數,通常建議為 (2 x $num_cores) + 1
- --threads:設置每個工作進程的線程數,適合 IO 密集型應用
- --worker-class:選擇工作類型,如 gevent 或 asyncio 適合處理異步任務
更新 Dockerfile 中的 Gunicorn 啟動命令:
Dockerfile
CMD ["gunicorn", "--workers=4", "--threads=2", "--worker-class=gthread", "--bind=0.0.0.0:8000", "app:app"]
七、設置 Nginx 作為反向代理(可選)
為了進一步提升性能和處理靜態文件,可以使用 Nginx 作為反向代理。創建以下文件:
1. nginx.conf
nginx
server {
??? listen 80;
location / {
??????? proxy_pass http://web:8000;
??????? proxy_set_header Host $host;
??????? proxy_set_header X-Real-IP $remote_addr;
??????? proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
??????? proxy_set_header X-Forwarded-Proto $scheme;
??? }
}
2. 更新 docker-compose.yml
yaml
version:'3'services:web:build:.expose:-"8000"environment:-ENV=productionnginx:image:nginx:latestports:-"80:80"volumes:-./nginx.conf:/etc/nginx/conf.d/default.confdepends_on:-web
八、測試和部署
重新構建和啟動容器:
bash
docker-compose up --build
通過訪問 http://localhost,可以看到 Flask 應用被成功部署并通過 Nginx 進行代理。
九、總結
通過結合使用 Flask、Gunicorn 和 Docker,配合 Nginx 反向代理,可以創建一個高性能、高并發處理能力的 Web 應用部署方案。這種配置不僅提高了應用的可擴展性,還簡化了部署和管理流程。