第19章 Docker Compose进阶

本章将深入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生产最佳实践

本章思考题

  1. 为什么depends_on不能保证服务就绪?
  2. healthcheckstart_period的作用是什么?
  3. 什么时候使用profiles?
  4. secrets与环境变量的差别是什么?
  5. 如何在CI中使用Compose进行集成测试?

相关资源

相关推荐
小此方4 小时前
Re:Linux系统篇(二十六)进程篇·十一:从底层原理到 exec* 家族:彻底搞懂 Linux 进程程序替换
linux·运维·服务器
码农小白AI12 小时前
AI报告审核加速融入自动化实验室:IACheck破解智能设备时代报告管理新挑战
运维·人工智能·自动化
utf8mb4安全女神12 小时前
克隆的虚拟机怎么更改ip地址
运维
赵民勇12 小时前
fuse-overlayfs命令详解
linux·容器
万能的知了13 小时前
服务器托管 vs 云主机 vs 裸金属:一个决策故事
运维·服务器·云计算
杨云龙UP13 小时前
Oracle RAC / ODA 生产环境指定 PDB 启动 SOP
linux·运维·数据库·oracle
luweis14 小时前
企智孪生 ETA(3.3 认知算法层:ETA 的思维内核 3.4 基础架构:算力与弹性)【浙江联保网络 卢伟舜】
大数据·运维·线性代数·ai·矩阵·学习方法
极客老王说Agent14 小时前
屏幕理解能力是下一代自动化的关键吗?2026年自动化范式演进深度解析
运维·人工智能·ai·chatgpt·自动化
LT101579744415 小时前
2026年电商RPA选型指南:电商运营全流程自动化测评
运维·自动化·rpa
JAVA社区15 小时前
Java高级全套教程(十一)—— Kubernetes 超详细企业级实战详解
java·运维·微服务·容器·面试·kubernetes