Docker 部署全流程:Dockerfile 与 Docker Compose 编排
📂 所属阶段:第六阶段 — 上线部署(生产篇)
🔗 相关章节:Gunicorn 与 Nginx · 环境变量与安全配置
开发 Flask 项目时,你是不是也遇到过这种头疼的事:本地用 Python 3.11、Redis 7、PostgreSQL 16 跑完全正常,上传到云服务器,环境版本对不上、服务依赖缺漏、路径配置崩了?
Docker 就是解决「环境一致性地狱」的神器——把整个应用(包括依赖、配置、基础环境)打包成「镜像」,再由镜像生成「容器」,不管在哪台机器上,容器内的运行状态都完全一致。
这篇文章带大家走一遍从编写 Dockerfile 构建 Flask 镜像,到用 Docker Compose 本地开发、生产部署的全流程。
1. 写好一份高效安全的 Dockerfile
Dockerfile 是构建 Docker 镜像的「说明书」,每一行指令都会生成一个「镜像层」——合理利用分层缓存能大幅加速构建,同时注意非 root 用户等安全细节。
完整代码
配套 requirements.txt
包含了常用 Flask 全家桶、PostgreSQL/Redis 驱动、异步任务 Celery 等:
2. 用 Docker Compose 编排多容器
一个完整的 Flask 生产项目,往往不止 Web 服务——还有数据库、Redis 缓存/消息队列、Nginx 反向代理等。单独用 docker run 启动太麻烦,Docker Compose 用一个 YAML 文件就能管理所有容器的依赖、网络、存储、环境变量。
2.1 本地开发版:热重载、简化配置
本地开发时,我们需要:
- 代码修改后自动重载(不用重启容器)
- 环境变量直接写在 YAML 里(不用单独
.env) - 数据库和 Redis 带数据持久化(但可以随项目删除)
2.2 生产环境版:安全、稳定、持久化
生产环境和本地开发的核心区别:
- 不用热重载,用预构建好的镜像(或 CI/CD 推送的)
- 环境变量放单独的
.env.production(敏感信息不能提交代码) - 所有容器加
restart: always(崩溃自动重启) - Web 服务加健康检查
- 用 Nginx 做反向代理、静态文件服务、SSL 证书配置
- 所有数据持久化,Redis 开启 AOF 持久化
3. 一键构建与部署流程
本地开发
云服务器生产部署
假设你已经把镜像推送到 Docker Hub(或私有仓库),服务器上安装好了 Docker 和 Docker Compose,并且上传了 .env.production、nginx/ 目录:
4. 关键最佳实践回顾
- Dockerfile 分层优化:先复制依赖文件,再复制应用代码,最大化利用镜像层缓存
- 安全降权:容器内用非 root 用户运行
- 数据持久化:数据库、Redis、静态文件都挂载到 Docker 卷
- 健康检查:生产环境所有服务加健康检查,确保依赖启动后再运行
- 敏感信息隔离:生产环境变量放单独的
.env.production,不要提交代码 - 轻量镜像:优先用
-slim或-alpine版本的基础镜像
🔗 扩展阅读

