docker compose实现环境一致性核心是配置分层、镜像固化、变量外置和启动标准化:基础compose.yaml定义共性,dev/prod覆盖文件管理差异;镜像禁用latest,由ci构建带版本标签的镜像并通过.env文件注入;所有敏感配置外置为环境变量;部署前必须执行docker compose config验证最终配置。

Docker Compose 实现开发与生产环境一致性,核心不是“让两个环境完全一样”,而是“用同一套定义逻辑、同一套构建流程、同一套运行约束,让差异可控且可验证”。关键在于配置分层、镜像固化、变量外置和启动方式标准化。
用基础文件定义共性,覆盖文件管理差异
把所有环境都依赖的服务结构、网络、卷声明写在 compose.yaml 里;环境特有配置(如开发时挂载代码、生产时加健康检查)拆到独立文件中:
- compose.yaml:定义服务名、镜像名(带版本标签)、depends_on、volumes 声明、networks
-
compose.dev.yaml:只加
volumes挂载源码、environment开 DEBUG、ports暴露调试端口 -
compose.prod.yaml:只加
restart: always、deploy资源限制、healthcheck、关闭 TTY
启动时显式组合:docker compose -f compose.yaml -f compose.prod.yaml up -d。这样开发和生产用的是同一个基础骨架,差异仅来自叠加层,不会漏配或错配。
镜像必须固定标签,禁止用 latest
开发环境如果用 build: .,生产环境必须用 image: myapp:v1.2.3 —— 但前提是这个镜像由 CI 流水线统一构建并推送到私有仓库。不能让开发本地 docker-compose build 出来的镜像直接上生产。
- CI 阶段:基于 Git Tag 或 Commit Hash 构建带语义化版本的镜像,例如
myapp:v2.1.0-abc123 - compose.yaml 中统一写
image: myapp:${APP_IMAGE_TAG:-latest},通过.env或--env-file注入真实值 - 这样开发用
.env.dev(APP_IMAGE_TAG=local-dev),生产用.env.prod(APP_IMAGE_TAG=v2.1.0-abc123),镜像来源清晰可追溯
所有配置项外置为环境变量,不硬编码进 YAML
数据库地址、密钥、日志级别等,全部从环境变量读取,YAML 文件里只留占位符:
- compose.yaml 中写:
- DATABASE_URL=${DB_URL}、- LOG_LEVEL=${LOG_LEVEL} - 不同环境提供不同的
.env.xxx文件,例如.env.prod包含DB_URL=postgres://prod:xxx@db-prod:5432/app - 启动时指定:
docker compose --env-file .env.prod -f compose.yaml -f compose.prod.yaml up
避免敏感信息写死在 YAML 里,也避免因忘记改某一行配置导致生产连接错测试库。
用 docker compose config 验证最终配置
每次部署前,运行这条命令:
docker compose --env-file .env.prod -f compose.yaml -f compose.prod.yaml config
它会输出合并后的完整 YAML 内容,你可以肉眼确认:
- 镜像是否是预期版本
- healthcheck 是否已启用
- ports 是否已移除(生产不该暴露 8080)
- environment 中是否没有残留
DEBUG=true
这步是防止“以为配对了,其实没生效”的最后一道防线。











