Docker Compose编排指南:YAML语法精讲与服务依赖配置
一、YAML语法核心规范
1.1 基础结构解析
# 注释以#开头
version: '3.8' # 版本声明必须首行
services: # 服务定义区块
webapp: # 服务名称(小写字母+下划线)
image: nginx:alpine # 键值对(冒号后空格)
ports:
- "80:80" # 列表项(短横线+空格)
- "443:443"
environment: # 复杂值缩进两空格
NGINX_ENV: production
TZ: Asia/Shanghai
1.2 多文档与锚点引用
# 公共配置锚点
x-common: &common-config
restart: unless-stopped
logging:
driver: json-file
options:
max-size: "10m"
services:
frontend:
<<: *common-config # 锚点继承
image: frontend:v1.2
backend:
<<: *common-config
image: backend:v2.3
二、服务依赖管理深度配置
2.1 基础依赖声明
services:
redis:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3
webapp:
depends_on:
redis:
condition: service_healthy # 等待Redis健康
postgres:
condition: service_started # 仅需启动完成
2.2 高级依赖策略矩阵
依赖类型 | 配置语法 | 行为特征 |
---|---|---|
启动顺序控制 | depends_on: [service1] | 仅控制启动顺序 |
健康检查依赖 | condition: service_healthy | 等待目标服务通过健康检查 |
混合依赖模式 | 组合使用长短语法 | 精细控制多服务启动条件 |
跨项目依赖 | external_links + 网络共享 | 依赖其他Compose项目的服务 |
三、生产级编排实战
3.1 全栈应用示例
version: '3.8'
services:
# 后端服务
api:
build: ./backend
environment:
- DB_URL=postgres://prod_user:Pass123@db:5432/appdb
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
deploy:
resources:
limits:
cpus: '2'
memory: 1G
# 数据库服务
db:
image: postgres:15-alpine
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 5
# 缓存服务
redis:
image: redis:7-alpine
command: redis-server --save 60 1 --loglevel warning
volumes:
- redis_data:/data
volumes:
pg_data:
redis_data:
networks:
default:
driver: bridge
ipam:
config:
- subnet: 172.22.0.0/24
四、依赖配置进阶技巧
4.1 级联启动控制
services:
init-db:
image: postgres:15-alpine
command: /docker-entrypoint-initdb.d/init.sh
volumes:
- ./init-scripts:/docker-entrypoint-initdb.d
networks:
- db-net
app-db:
depends_on:
init-db:
condition: service_completed_successfully # 等待初始化完成
image: postgres:15-alpine
networks:
- db-net
networks:
db-net:
driver: bridge
4.2 跨服务健康检查
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/service-status"]
interval: 30s
timeout: 10s
start_period: 20s
monitor:
image: prometheus
depends_on:
web:
condition: service_healthy # 等待Web服务健康
五、调试与排错指南
5.1 启动顺序验证
# 显示服务启动顺序
docker compose events --json | grep 'container start'
# 查看依赖关系树
docker compose config --services | xargs -n1 docker compose depends_on
5.2 常见错误处理
错误现象:ERROR: Service 'webapp' depends on service 'db' which is undefined
解决方案:
- 检查服务名称拼写一致性
- 确认服务定义区块缩进正确
- 验证compose文件版本是否支持
depends_on
条件语法
六、最佳实践清单
- 版本锁定:始终明确指定
version
字段 - 网络隔离:为不同服务组创建独立网络
- 资源限制:为生产服务设置CPU/内存限制
- 健康检查:所有关键服务必须配置健康检查
- 环境分离:使用多个compose文件管理不同环境
docker compose -f docker-compose.yml -f docker-compose.prod.yml up
- 敏感数据保护:使用外部secrets管理凭证
secrets: db_password: file: ./secrets/db_password.txt
架构师建议:将服务依赖视为系统可靠性基石,推荐使用
condition: service_healthy
确保服务真正可用。对于复杂系统,建议结合Circuit Breaker模式实现弹性架构。