Docker Compose 多服务
用 docker-compose.yml 定义运行多容器应用,用于开发和小型生产。
容器进阶
为什么
Docker Compose 一 YAML 文件定义多服务应用(web + db + cache + worker)。一命令带起整个栈含网络和 volume。
Docker is used by 59% of professional developers per the Stack Overflow 2024 survey,Kubernetes 在生产中运行 60% 的容器化工作负载(CNCF 2024 调查)。容器编排通过声明式滚动发布将部署相关事故减少 35%。
何时使用
本地开发、CI 和小型生产用 Compose。大规模生产避免 — 用 K8s/Swarm。
如何做
1. 编写 — docker-compose.yml 配 services、networks、volumes
2. 启动 — docker compose up -d(后台)
3. 停止 — docker compose down -v(删 volume)
4. 日志 — docker compose logs -f service
5. 执行 — docker compose exec service sh
6. 构建 — docker compose build
7. 覆盖 — docker-compose.override.yml 开发
示例
# docker-compose.yml
services:
web:
build: .
ports: ["3000:3000"]
environment:
DATABASE_URL: postgres://user:pass@db:5432/app
depends_on: [db, redis]
db:
image: postgres:16
volumes: [pgdata:/var/lib/postgresql/data]
environment: { POSTGRES_PASSWORD: pass }
redis: { image: redis:7 }
worker:
build: .
command: npm run worker
depends_on: [redis]
volumes: { pgdata: }
# 命令
docker compose up -d # 启动全部
docker compose logs -f web # 跟踪 web 日志
docker compose exec db psql -U user app # db 中 psql
常见问题
- ⚠服务无法互解 — 须同网络,Compose 创建默认网络
- ⚠down 丢数据 — volume 未持久化,用命名 volume 非绑定挂载
- ⚠环境间配置漂移 — 使用基础设施即代码(Terraform/Pulumi)保持 dev/staging/prod 一致
最佳实践
- ✓数据用命名 volume — compose down/up 持久
- ✓depends_on 配 healthcheck — 等 DB 就绪再启应用
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求