0%

FastAPI自学教程(84) - Docker部署指南

1.基础Dockerfile

1
2
3
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
COPY ./app /app
EXPOSE 80
  • 使用官方预构建镜像,内置Gunicorn+Uvicorn组合
  • 项目文件需放置在/app目录,自动加载main.py中的app对象
  • 默认暴露80端口,支持WebSocket和HTTP/2协议
  • 流程图:
    graph TD
      A[编写Dockerfile] --> B[构建镜像]
      B --> C[运行容器]
      C --> D[访问网站]

2.多阶段构建优化

1
2
3
4
5
6
7
8
9
10
FROM python:3.9-slim as builder
WORKDIR /app
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
COPY ./app /app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
  • 第一阶段安装依赖,第二阶段仅复制必要文件
  • 镜像体积减少约60%(从1.2GB → 450MB)
  • 使用--user参数避免全局安装污染系统路径

3.生产环境配置

3.1 环境变量管理

1
2
3
ENV MAX_WORKERS=8
ENV TIMEOUT=120
CMD ["gunicorn", "app.main:app", "-k", "uvicorn.workers.UvicornWorker", "-w", "${MAX_WORKERS}"]
  • 通过环境变量动态调整worker数量
  • 推荐参数配置:
    参数 推荐值 说明
    –workers (-w) CPU核心数×2 例如4核CPU设置8 workers
    –timeout 120秒 防止慢请求阻塞整个进程

3.2 健康检查

1
2
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/health || exit 1
  • 每30秒检查/health端点,超时3秒视为失败
  • 容器状态可通过docker inspect --format='{{.State.Health.Status}}'查看

4.生产建议

  1. 安全加固
    • 使用非root用户运行容器
      1
      2
      RUN useradd -m appuser && chown -R appuser /app
      USER appuser
  2. 日志管理
    • 挂载日志卷避免容器重启丢失数据
      1
      docker run -v ./logs:/var/log/gunicorn fastapi-app
  3. 资源限制
    1
    docker run --memory=512m --cpus=2 fastapi-app
  4. 镜像更新
    • 使用语义化版本标签(如fastapi-app:v1.2.3
    • 定期扫描镜像漏洞(Trivy/Clair)

测试命令示例:

1
2
3
4
5
6
7
8
# 构建镜像
docker build -t fastapi-app .

# 运行容器
docker run -d -p 8000:80 --name myapp fastapi-app

# 查看日志
docker logs -f myapp