管理 Docker Compose 多环境配置,核心在于维护一份基础配置文件,再针对不同环境编写覆盖文件,启动时通过命令行参数组合。这种方式既能复用通用配置,又能隔离环境差异。
核心结论:采用“基础文件 + 环境覆盖文件”模式,配合严格的 .env 安全管理策略。
- 适用场景:开发、测试、生产环境配置差异明显,且需频繁切换
- 关键准备:基础 docker-compose.yml 与环境覆盖文件(如 docker-compose.prod.yml),以及 .gitignore 配置
- 验收标准:使用 config 命令检查合并配置,确认敏感信息未泄露且参数符合预期
核心配置策略
Docker Compose 支持多文件合并机制,后加载的文件会覆盖先加载文件中的同名字段。通用服务定义放在基础文件中,环境特定参数(如端口、环境变量、重启策略)放在覆盖文件中。
1. 创建基础配置文件
新建 docker-compose.yml,定义所有环境共享的服务框架。建议使用 version: '3.8',该版本支持 healthcheck 等现代指令。
version: '3.8'
services:
webapp:
image: myapp:${APP_VERSION:-latest}
ports:
- "8080:8080"
environment:
- DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}
2. 创建环境覆盖文件
生产环境文件 docker-compose.prod.yml 用于覆盖特定参数。注意:普通 docker compose up 不支持 deploy.replicas,该字段仅在 Swarm 模式生效,生产扩容建议使用 profiles 或单独维护文件。
version: '3.8'
services:
webapp:
restart: always
environment:
- DEBUG=false
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
3. 启动命令
# 启动生产环境
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# 启动开发环境(默认自动加载 docker-compose.override.yml)
docker compose up -d
安全与版本控制
环境变量文件包含敏感信息,必须纳入版本控制的安全管理中。
1. 配置 .gitignore
确保 .env 文件不被提交到代码仓库,防止密钥泄露。
# .gitignore 示例
.env
*.env
! .env.example
2. 敏感信息管理
创建 .env.example 作为模板提交,实际 .env 文件由运维人员在服务器生成。对于高安全需求场景,建议使用 Docker Secrets 或外部密钥管理服务(如 Vault),避免明文存储在环境变量中。
# .env.example 模板
DB_USER=admin
DB_PASSWORD=your_password_here
APP_VERSION=1.0.0
CI/CD 集成实践
在流水线中调用多环境配置时,需确保环境变量正确注入。
GitLab CI 示例:
deploy_prod:
stage: deploy
script:
- docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
environment:
name: production
only:
- main
注意:CI 流水线中的敏感变量应在平台设置中配置为 Protected/Masked Variables,而不是硬编码在 yaml 文件中。
验证与排查
1. 检查合并配置
在启动前,使用 config 命令查看最终生效的配置,确认覆盖文件已正确合并且无语法错误。
docker compose -f docker-compose.yml -f docker-compose.prod.yml config
2. 检查服务状态
启动后,查看容器运行状态和健康检查情况。
docker compose ps
docker compose logs webapp
3. 常见坑
- 变量优先级:命令行传入 > 服务 environment 字段 > .env 文件 > 系统环境变量。确保敏感信息不在低优先级文件中泄露。
- 路径映射:覆盖文件中的卷挂载路径是相对于执行命令的目录。生产环境通常不需要挂载本地代码目录,避免误操作。
- 文件加载顺序:命令行中 -f 参数的顺序决定了覆盖优先级,最后一个文件的配置优先级最高。务必确认生产配置文件放在最后。