Python Flask应用在Docker+Nginx环境中的容器化部署全流程

1. 项目结构准备
flask-app/
├── app.py              # Flask主程序
├── requirements.txt    # 依赖列表
├── Dockerfile          # Docker构建文件
├── nginx/
│   └── nginx.conf      # Nginx配置文件
└── static/             # 静态资源目录

2. Flask应用示例 (app.py)
from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/')
def home():
    return jsonify(status="running", message="Flask in Docker + Nginx")

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

3. 依赖文件 (requirements.txt)
Flask==2.2.3
gunicorn==20.1.0


4. Docker镜像构建

Dockerfile 内容:

# 基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 5000

# 启动命令(使用Gunicorn)
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]

构建镜像命令:

docker build -t flask-app:1.0 .


5. Nginx反向代理配置

nginx/nginx.conf 内容:

server {
    listen 80;
    server_name localhost;

    # 静态文件代理
    location /static {
        alias /app/static;
    }

    # Flask应用代理
    location / {
        proxy_pass http://flask-app:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}


6. Docker Compose集成部署

docker-compose.yml 内容:

version: '3.8'
services:
  flask-app:
    image: flask-app:1.0
    volumes:
      - ./static:/app/static
    networks:
      - app-network

  nginx:
    image: nginx:1.23-alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./static:/app/static
    depends_on:
      - flask-app
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

启动命令:

docker-compose up -d


7. 部署验证
  1. 访问应用:
    浏览器打开 http://localhost,返回JSON响应:
{"status":"running","message":"Flask in Docker + Nginx"}

  1. 静态文件测试:
    static/目录放置test.txt,访问 http://localhost/static/test.txt 应显示文件内容。

  2. 容器状态检查:

docker ps -a  # 查看运行中的容器
docker logs <container_id>  # 检查日志


8. 关键优化点
  1. Gunicorn参数调优:
    在Dockerfile中调整Gunicorn工作进程数(根据CPU核心数):
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "app:app"]

  1. Nginx缓存配置:
    nginx.conf中添加静态文件缓存:
location /static {
  expires 30d;
  add_header Cache-Control "public";
}

  1. 多阶段构建(减少镜像体积):
# 第一阶段:构建依赖
FROM python:3.9-slim as builder
COPY requirements.txt .
RUN pip install --user -r requirements.txt

# 第二阶段:复制依赖到轻量镜像
FROM python:3.9-slim
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local/bin:$PATH
# ...后续步骤相同


9. 完整部署流程总结
步骤 操作 验证方式
1. 代码准备 编写Flask应用和依赖 python app.py 本地运行
2. Docker化 构建镜像并测试 docker run -p 5000:5000 flask-app:1.0
3. Nginx配置 设置反向代理和静态文件路由 检查配置文件语法 nginx -t
4. 编排部署 通过Compose启动完整服务栈 docker-compose up -d
5. 生产调优 调整Gunicorn/Nginx参数 压力测试(如ab工具)

通过此流程,可实现:

  • 流量分发:Nginx处理静态请求,动态请求转发至Flask
  • 资源隔离:Docker容器化保障环境一致性
  • 弹性扩展:通过Compose快速扩展服务实例
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐