Docker KubernetesNotes

第 07 章:Compose

zjc 于 2026-01-07 发布

这是《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 把多容器应用声明成可重复启动的拓扑。重点管理网络、卷、健康检查、环境差异和清理行为;它不是完整的生产编排系统。

思考题

  1. depends_on 是否保证数据库初始化完成?
  2. 如何拆分多环境 Compose 配置?
  3. down -v 有什么风险?
  4. Compose 和 Kubernetes 的边界是什么?
  5. 如何为 Compose 应用设计备份?