一、实现原理
-
容器化核心逻辑
Docker 通过将应用代码、运行环境和依赖项打包成镜像,实现环境一致性。Flask 应用容器化需包含:- Python 基础运行环境
- 项目代码及依赖库(
requirements.txt
) - WSGI服务器(如 Gunicorn)
- 配置文件和环境变量
-
网络通信机制
- 容器默认隔离网络,需通过
-p
参数映射端口(如5000:5000
) - 多容器协作时使用 Docker Network 或 Docker Compose
- 容器默认隔离网络,需通过
-
分层构建优化
Docker 镜像采用分层存储,合理编写 Dockerfile 可提升构建速度和减少镜像体积。
二、详细操作步骤
1. 项目准备
/myflaskapp
├── app.py
├── requirements.txt
└── Dockerfile
app.py 示例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Dockerized Flask!"
requirements.txt:
flask==3.0.0
gunicorn==21.2.0
2. 编写 Dockerfile
# 基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc python3-dev \
&& rm -rf /var/lib/apt/lists/*
# 复制依赖清单
COPY requirements.txt .
# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 5000
# 设置启动命令(使用 Gunicorn 生产服务器)
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
3. 构建 Docker 镜像
docker build -t myflask:1.0 .
4. 运行容器
# 基础运行
docker run -d -p 5000:5000 --name flask_app myflask:1.0
# 带环境变量(生产环境配置)
docker run -d -p 5000:5000 \
-e FLASK_ENV=production \
--name flask_prod \
myflask:1.0
三、进阶配置
1. 多阶段构建优化
# 构建阶段
FROM python:3.9-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
# 运行阶段
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
2. 生产环境配置
# 添加非 root 用户
RUN useradd -m flaskuser && chown -R flaskuser:flaskuser /app
USER flaskuser
# 配置日志持久化
VOLUME /app/logs
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:5000/health || exit 1
四、常见问题及解决方案
1. 应用无法访问
- 现象:容器运行但无法通过
localhost:5000
访问 - 排查:
# 检查容器日志 docker logs flask_app # 进入容器调试 docker exec -it flask_app bash curl localhost:5000
- 解决方案:
- 确认
EXPOSE
和-p
参数端口一致 - 检查 Flask 是否绑定到
0.0.0.0
- 确认
2. 依赖安装失败
- 现象:构建时出现
ModuleNotFoundError
- 解决方案:
- 检查
requirements.txt
路径是否正确 - 确认系统依赖已安装(如需要编译的包需安装
gcc
)
- 检查
3. 容器启动后立即退出
- 排查:
docker inspect flask_app | grep ExitCode docker logs --tail 50 flask_app
- 常见原因:
- CMD 命令执行失败
- 端口冲突
- 文件权限问题
五、生产环境注意事项
-
安全最佳实践:
- 不要使用
latest
标签 - 定期更新基础镜像
- 扫描镜像漏洞:
docker scan myflask:1.0
- 不要使用
-
性能优化:
- 使用 Nginx 反向代理
- 配置 Gunicorn workers:
CMD ["gunicorn", "--workers", "4", "--bind", "0.0.0.0:5000", "app:app"]
-
持久化存储:
docker run -d -v flask_data:/app/data myflask:1.0
六、完整编排示例(Docker Compose)
docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- FLASK_ENV=production
networks:
- flask_net
depends_on:
- redis
redis:
image: redis:alpine
volumes:
- redis_data:/data
networks:
- flask_net
volumes:
redis_data:
networks:
flask_net:
启动命令:
docker-compose up -d --build
七、监控与维护
-
查看实时日志:
docker logs -f flask_app
-
资源监控:
docker stats flask_app
-
自动重启策略:
docker run --restart=always -d myflask:1.0
通过以上方案,可以将 Flask 应用高效地容器化部署,并具备生产级可靠性。实际应用中需根据具体需求调整安全配置、资源限制和监控方案。