这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Docker Compose 用一个 YAML 定义多容器应用的镜像、网络、卷、依赖和环境,适合本地开发、测试和小规模部署。
7.1 示例
services:
app:
image: shop/order-service:1.2.0
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/shop
SPRING_PROFILES_ACTIVE: local
depends_on:
postgres:
condition: service_healthy
networks:
- shop
postgres:
image: postgres:16
environment:
POSTGRES_DB: shop
POSTGRES_USER: app
POSTGRES_PASSWORD: local-password
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d shop"]
interval: 5s
timeout: 3s
retries: 10
networks:
- shop
networks:
shop:
volumes:
pgdata:
7.2 常用命令
docker compose up -d
docker compose ps
docker compose logs -f app
docker compose exec app sh
docker compose build
docker compose pull
docker compose down
docker compose down -v
down -v 会删除 Compose 声明的匿名卷和命名卷,慎用。
7.3 配置拆分
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
基础文件放通用定义,环境文件覆盖差异:
services:
app:
environment:
SPRING_PROFILES_ACTIVE: prod
deploy:
resources:
limits:
cpus: "1"
memory: 1G
7.4 健康检查与依赖
depends_on:
postgres:
condition: service_healthy
注意健康只表示依赖服务就绪,不代表业务数据初始化完成。
7.5 开发与生产边界
| 场景 | 建议 |
|---|---|
| 本地开发 | Compose 模拟依赖 |
| CI | Compose 起测试环境 |
| 单机部署 | Compose 可用,但要有备份升级方案 |
| 多机生产 | 使用 Kubernetes 或其他编排系统 |
本章小结
Compose 把多容器应用声明成可重复启动的拓扑。重点管理网络、卷、健康检查、环境差异和清理行为;它不是完整的生产编排系统。
思考题
- depends_on 是否保证数据库初始化完成?
- 如何拆分多环境 Compose 配置?
down -v有什么风险?- Compose 和 Kubernetes 的边界是什么?
- 如何为 Compose 应用设计备份?