Docker Compose 是单机多容器编排的标配工具,这里整理一些用得上的技巧。
1. 多环境配置
用 docker-compose.override.yml 自动覆盖:
# docker-compose.yml
services:
web:
image: myapp
ports:
- "80:80"
# docker-compose.override.yml(开发时用)
services:
web:
ports:
- "8080:80"
volumes:
- ./src:/app/src
environment:
DEBUG: "true"
docker-compose up 会自动合并两个文件。生产环境用 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up。
2. 健康检查
services:
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
其他服务可以依赖健康状态:
services:
web:
depends_on:
db:
condition: service_healthy
3. 资源限制
防止某个容器吃光内存:
services:
web:
image: myapp
deploy:
resources:
limits:
cpus: "1.0"
memory: 512M
reservations:
memory: 128M
注意 deploy 在 compose 单机模式下也生效(v2 之后)。
4. 日志管理
默认日志无限制会把磁盘撑爆:
services:
web:
image: myapp
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
5. 网络隔离
networks:
frontend:
backend:
services:
web:
networks:
- frontend
- backend
db:
networks:
- backend # 只在 backend 网络,外部访问不到
6. 环境变量
用 .env 文件管理:
# .env
POSTGRES_PASSWORD=secret
APP_PORT=8080
# docker-compose.yml
services:
db:
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
web:
ports:
- "${APP_PORT}:80"
.env 不要提交到 git,加到 .gitignore。
7. Profile 按需启动
services:
web:
image: myapp
debug-tools:
image: busybox
profiles:
- debug
默认 docker-compose up 只启动 web,需要调试工具时:
docker-compose --profile debug up
8. 重启策略
services:
web:
restart: unless-stopped # 总是重启,除非手动停止
选项:
no:默认,不重启always:总是重启on-failure:仅非零退出码重启unless-stopped:总是重启,除非手动停止
9. 构建优化
services:
web:
build:
context: .
dockerfile: Dockerfile
cache_from:
- myapp:cache
配合 BuildKit:
DOCKER_BUILDKIT=1 docker-compose build
10. 常用命令速查
docker-compose up -d # 后台启动
docker-compose down -v # 停止并删除卷
docker-compose logs -f web # 跟踪日志
docker-compose exec web bash # 进入容器
docker-compose restart web # 重启某服务
docker-compose ps # 查看状态
docker-compose config # 校验+展开配置
小结
Compose 看着简单,但配置项很多。把上面这些用熟了,单机部署基本不用折腾。