本章将深入Compose高级用法:健康检查与依赖就绪、配置复用、资源限制、profiles、secrets/configs,以及与CI/CD的结合方式。
19.1 健康检查与依赖就绪
19.1.1 healthcheck基础
healthcheck用于判断服务是否真正"可用",避免仅靠容器"启动"。
yaml
services:
db:
image: postgres:13
environment:
- POSTGRES_PASSWORD=secret
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
start_period: 20s
19.1.2 depends_on的就绪条件
yaml
services:
app:
image: myapp
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
常见条件:
service_started:容器启动service_healthy:健康检查通过
19.2 配置复用与YAML技巧
19.2.1 使用YAML Anchors
yaml
x-common-env: &common-env
APP_ENV: dev
LOG_LEVEL: info
services:
api:
image: myapi
environment:
<<: *common-env
SERVICE: api
worker:
image: myworker
environment:
<<: *common-env
SERVICE: worker
19.2.2 使用extends
yaml
services:
base:
image: node:18
working_dir: /app
volumes:
- ./:/app
web:
extends:
service: base
command: npm run dev
19.2.3 拆分多文件
bash
# 组合多个文件
# docker compose -f base.yml -f dev.yml up
19.3 资源限制与部署策略
19.3.1 资源限制(单机)
yaml
services:
api:
image: myapi
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
注意 :deploy字段在非Swarm模式下部分限制可能不生效,可改用mem_limit/cpus(旧字段)。
19.3.2 端口与滚动更新
yaml
services:
api:
image: myapi
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 5s
order: start-first
19.4 profiles:可选服务控制
yaml
services:
app:
image: myapp
debug:
image: alpine
profiles: ["debug"]
command: sh -c "sleep 9999"
bash
# 只启动debug profile
docker compose --profile debug up
19.5 secrets与configs
19.5.1 secrets
yaml
secrets:
db_password:
file: ./secrets/db_password.txt
services:
db:
image: postgres
secrets:
- db_password
environment:
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
19.5.2 configs
yaml
configs:
app_config:
file: ./config/app.yaml
services:
app:
image: myapp
configs:
- source: app_config
target: /etc/myapp/config.yaml
在非Swarm模式下,
secrets/configs的支持与Docker版本有关,可用volume替代。
19.6 Compose与CI/CD
19.6.1 测试环境编排
yaml
version: '3.8'
services:
api:
build: ./api
depends_on:
- db
environment:
- DATABASE_URL=postgres://postgres:secret@db:5432/test
db:
image: postgres:13
environment:
- POSTGRES_PASSWORD=secret
test:
image: api
depends_on:
api:
condition: service_healthy
command: pytest -q
19.6.2 常见CI流程
text
1. docker compose build
2. docker compose up -d
3. docker compose exec test pytest
4. docker compose down -v
19.7 实战案例:多环境Compose
19.7.1 基础配置
yaml
# docker-compose.yml
services:
web:
image: myapp
ports:
- "80:80"
env_file:
- .env
19.7.2 开发环境覆盖
yaml
# docker-compose.dev.yml
services:
web:
volumes:
- ./src:/app/src
environment:
- DEBUG=true
19.7.3 生产环境覆盖
yaml
# docker-compose.prod.yml
services:
web:
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
bash
# 启动开发
# docker compose -f docker-compose.yml -f docker-compose.dev.yml up
# 启动生产
# docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
19.8 常见问题
19.8.1 健康检查失败
bash
# 查看健康状态
docker ps --format "table {{.Names}}\t{{.Status}}"
# 查看容器日志
docker compose logs db
19.8.2 资源限制未生效
text
原因:deploy资源限制在非Swarm模式下可能不生效。
解决:使用旧字段或启用Swarm。
19.8.3 变量未替换
bash
# 检查.env是否加载
docker compose config
19.9 Compose最佳实践(进阶)
text
✅ 使用healthcheck保证依赖就绪
✅ 通过anchors复用配置
✅ 多环境拆分compose文件
✅ profiles控制可选服务
✅ secrets保护敏感信息
✅ CI中使用compose编排测试环境
19.10 小结
通过本章学习,我们掌握了Compose进阶能力:
✅ healthcheck与depends_on就绪控制
✅ YAML复用技巧(anchors/extends)
✅ 资源限制与部署策略
✅ profiles可选服务
✅ secrets/configs管理敏感信息
✅ Compose与CI/CD结合
下一步
在第20章中,我们将学习Docker Compose实战:
- 多容器应用完整部署
- 典型微服务场景
- 日志与监控整合
- Compose生产最佳实践
本章思考题:
- 为什么
depends_on不能保证服务就绪? healthcheck与start_period的作用是什么?- 什么时候使用profiles?
- secrets与环境变量的差别是什么?
- 如何在CI中使用Compose进行集成测试?
相关资源:
- Compose文件规范:https://docs.docker.com/compose/compose-file/
- Healthcheck:https://docs.docker.com/engine/reference/builder/#healthcheck
- Compose profiles:https://docs.docker.com/compose/profiles/