Docker Compose 可一键启动多服务 Python 项目,通过 docker-compose.yml 定义 Web、Redis、PostgreSQL 等服务拓扑,自动处理网络通信、环境变量注入与依赖等待,配合健康检查和标准日志输出提升稳定性。

用 Docker Compose 一键启动多服务 Python 项目
Python 项目常依赖数据库、缓存、消息队列等外部服务,手动拉起每个容器再配置网络和环境变量容易出错。Docker Compose 就是为解决这个问题而生的——它用一个 docker-compose.yml 文件定义整套服务拓扑,一条命令就能启动、停止、重建全部服务。
准备基础服务结构:Web + Redis + PostgreSQL
以一个典型 Flask 应用为例,项目包含 Web 接口层、Redis 缓存、PostgreSQL 数据库。各服务需独立 Dockerfile 或直接使用官方镜像,关键在于让它们能互相发现并通信。
- Web 服务通过 service name(如
redis、db)访问其他容器,Docker Compose 自动创建默认网络并做 DNS 解析 - PostgreSQL 密码、Redis 地址等敏感配置通过 environment 或 .env 文件注入,避免硬编码
- Web 容器启动前需等待数据库就绪,可用
healthcheck+depends_on(注意:depends_on 不保证服务“已就绪”,只保证容器已启动)
写好 docker-compose.yml 的三个要点
这个文件是整个编排的核心,常见错误集中在端口暴露、卷挂载路径、环境变量作用域上。
-
端口映射写对位置:web 服务对外提供 API,需写
ports: ["8000:8000"];Redis/PostgreSQL 默认不对外暴露,除非调试需要,否则不要加 ports -
代码卷挂载用于开发,构建镜像用于部署:本地调试可挂载当前目录到容器内(
volumes: .:/app),生产部署应使用build: .构建镜像,确保环境一致性 -
环境变量分层管理:通用变量(如 POSTGRES_PASSWORD)写在
environment下;不同环境配置(dev/staging/prod)建议用env_file分离,比如env_file: .env.prod
快速验证与日常操作命令
写完配置后,不用反复敲 docker run,记住这几个高频命令就够了:
立即学习“Python免费学习笔记(深入)”;
-
docker-compose up -d:后台启动所有服务 -
docker-compose logs -f web:实时查看 web 容器日志 -
docker-compose exec web bash:进入 web 容器调试(比如检查能否 ping 通 db) -
docker-compose down:干净关闭并删除容器、网络(但不删卷,数据保留) -
docker-compose down -v:加-v才会删除关联的数据卷(慎用,会丢 PostgreSQL 数据)
进阶提示:让 Python 服务更健壮
纯 Python 容器容易因异常退出导致 Compose 反复重启,几个实用技巧:
- 用
restart: unless-stopped防止意外退出后服务中断 - 在 Flask/Gunicorn 启动脚本里加简单健康检查(比如连接 DB 成功再 listen),配合
healthcheck让 Compose 知道服务是否真正 ready - 日志统一输出到 stdout/stderr,别重定向到文件——Compose 依赖标准流收集日志
- 用
command:覆盖默认启动命令,例如command: gunicorn --bind 0.0.0.0:8000 app:app,比改 Dockerfile 更灵活










