Docker Compose 进阶配置与最佳实践
从低到高,后者覆盖前者:
# .env 文件
DB_HOST=localhost
DB_PORT=5432
# docker-compose.yml
services:
app:
environment:
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT:-5432} # 默认值语法
env_file:
- .env.local
用 extends 继承公共配置,用多 Compose 文件覆盖差异。
# docker-compose.yml(基础配置)
services:
web:
image: myapp:latest
ports:
- "3000:3000"
# docker-compose.override.yml(开发环境自动加载)
services:
web:
volumes:
- .:/app
environment:
- DEBUG=true
# docker-compose.prod.yml(生产环境手动指定)
services:
web:
environment:
- DEBUG=false
restart: always
# 开发环境(自动合并 override)
docker compose up
# 生产环境(显式指定)
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
services:
web:
image: nginx:alpine
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 5s
db:
image: mysql:8.0
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
depends_on.condition: service_healthy 确保数据库就绪后再启动应用。services:
app:
depends_on:
db:
condition: service_healthy
restart: true
services:
web:
image: nginx:alpine
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
rollback_config:
parallelism: 0
resources:
limits:
cpus: "0.5"
memory: 256M
reservations:
cpus: "0.25"
memory: 128M
restart_policy:
condition: on-failure
max_attempts: 3
deploy 配置仅在 Swarm 模式下生效。docker compose up 会忽略 deploy 块,需用 docker stack deploy 部署。services:
app:
image: myapp:latest
secrets:
- db_password
configs:
- nginx_config
environment:
DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
db_password:
file: ./secrets/db_password.txt
# 或 external: true(从 Docker 已有 secret 读取)
configs:
nginx_config:
file: ./configs/nginx.conf
/run/secrets/<name>,文件权限 0444(只读)。configs 挂载到 /<name>。两者都不写入镜像层。多个 Compose 文件按顺序合并,后者覆盖前者的同名配置。
| 合并策略 | 说明 |
|---|---|
| 标量值 | 后者覆盖前者(如 image、command) |
| 列表/数组 | 合并(如 ports、volumes、environment) |
| 映射/对象 | 深度合并(如 environment 的键值对) |
# 常见多环境文件结构
docker-compose.yml # 基础配置
docker-compose.override.yml # 开发覆盖(自动加载)
docker-compose.prod.yml # 生产覆盖
docker-compose.test.yml # 测试覆盖
# 使用方式
docker compose up # 开发
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d # 生产
docker compose -f docker-compose.yml -f docker-compose.test.yml up --abort-on-container-exit # 测试