2. Docker Compose 编排入门:核心字段与服务定义

Docker Compose 是 Docker 官方提供的多容器编排工具,通过声明式 YAML 文件定义应用栈的所有组件。本章聚焦 docker-compose.yml 的核心字段、服务定义方式以及网络与卷的声明式配置,为后续授权测试与性能调优搭建可复现的编排基础。

2.1 docker-compose.yml 核心字段解析

一个标准的 Compose 文件由三个顶级块构成:version、services、networks 和 volumes。下表列出最常用的核心字段及其用途:

字段层级说明示例值
version顶级Compose 文件格式版本,推荐 3.8+"3.8"
services顶级定义所有容器服务,每个服务一个键web, db, cache
image服务级指定容器镜像名称及标签nginx:1.25-alpine
build服务级指定 Dockerfile 路径或构建上下文./app
ports服务级宿主机与容器端口映射"8080:80"
environment服务级环境变量,支持键值对或文件引用DB_HOST=db
depends_on服务级声明服务启动顺序依赖- db
networks服务级/顶级连接自定义网络,实现服务隔离frontend
volumes服务级/顶级持久化数据卷或绑定挂载db-data:/var/lib/mysql
restart服务级容器退出后的重启策略unless-stopped
版本选择建议: 生产环境推荐使用 version: "3.8" 或更高版本,支持 deploy 资源限制、healthcheck 健康检查等高级特性,为后续性能调优提供声明式控制点。

2.2 服务定义与声明式配置

每个服务对应一个容器实例,通过声明式语法描述其镜像、端口、环境、依赖和资源约束。以下是一个典型的三层应用服务定义:

version: "3.8"

services:
  web:
    image: nginx:1.25-alpine
    ports:
      - "80:80"
    networks:
      - frontend
    depends_on:
      - api

  api:
    build: ./api
    environment:
      - DB_HOST=db
      - DB_PORT=3306
    ports:
      - "3000:3000"
    networks:
      - frontend
      - backend
    restart: unless-stopped

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - backend

networks:
  frontend:
  backend:

volumes:
  db-data:
关键设计点:
  • depends_on 仅控制启动顺序,不保证服务就绪;生产环境应配合 healthcheck 或等待脚本。
  • 环境变量 支持 ${VAR} 引用宿主环境或 .env 文件,避免敏感信息硬编码。
  • build 与 image 互斥:本地构建用 build,直接拉取用 image。

2.3 网络声明式配置

Compose 默认创建 bridge 网络,但显式声明自定义网络能实现更精细的隔离与通信策略。网络配置支持驱动、IPAM 和外部网络引用。

网络模式驱动适用场景隔离级别
默认 bridgebridge单机简单应用低(所有服务互通)
自定义 bridgebridge多服务分组隔离中(按网络分组)
hosthost性能敏感场景无(共享宿主机网络栈)
overlayoverlaySwarm 集群跨节点高(加密通信)

以下 SVG 展示典型的三层应用网络拓扑,体现前端、后端与数据层的网络隔离关系:

三层应用网络拓扑(Docker Compose) frontend 网络 backend 网络 数据层(无外部网络) Nginx web:80 API 服务 api:3000 MySQL db:3306 proxy_pass TCP 3306 网络隔离策略说明: • frontend 网络:Nginx + API 可互访,对外暴露 80 端口 • backend 网络:API + MySQL 可互访,不对外暴露数据库端口 • 数据层仅 backend 网络可达,实现最小权限网络隔离

2.4 卷的声明式配置

卷(Volume)用于持久化容器数据,支持命名卷、绑定挂载和 tmpfs 三种类型。在性能测试与授权测试场景中,卷的正确配置直接影响数据一致性和 I/O 性能。

卷类型声明方式生命周期性能特征典型用途
命名卷volumes: db-data:独立于容器中(由 Docker 管理)数据库持久化
绑定挂载volumes: ./data:/app/data依赖宿主机路径高(直接文件系统)开发热重载、日志收集
tmpfstmpfs: /run容器生命周期极高(内存)临时缓存、敏感数据
性能测试注意事项: 绑定挂载在 macOS 和 Windows 上存在显著的 I/O 性能损耗(通过 gRPC FUSE 转发)。若进行磁盘密集型压测,建议使用命名卷或将测试数据预加载至 tmpfs,避免绑定挂载成为瓶颈。

2.5 服务依赖与启动顺序控制

Compose 提供三种依赖控制机制,适用于不同场景:

  • depends_on:基础依赖,仅保证容器启动顺序,不等待服务就绪。
  • healthcheck:在服务定义中声明健康检查命令,配合 condition: service_healthy 实现就绪等待。
  • init 脚本 / wait-for-it:在入口点脚本中轮询依赖服务端口,适用于复杂启动序列。

以下 SVG 展示服务启动顺序与健康检查的完整流程:

服务启动顺序与健康检查流程 1. depends_on 启动 2. 健康检查轮询 3. 服务就绪 健康检查声明示例(docker-compose.yml): healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 3 start_period: 30s 依赖服务声明: depends_on: db: condition: service_healthy
授权测试场景提示: 在编排授权服务(如 OPA、Keycloak)时,务必为授权服务配置 healthcheck 并设置 start_period,避免依赖服务在授权策略加载完成前就开始处理请求,导致授权失败。

2.6 资源限制与声明式调优

Compose 3.8+ 支持在服务定义中声明资源限制,为性能测试提供可重复的约束环境:

services:
  api:
    image: my-api:latest
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: "512M"
        reservations:
          cpus: "0.25"
          memory: "256M"

资源限制字段说明:

字段类型说明性能测试影响
cpus字符串CPU 核心数限制(如 "0.5" 表示半个核心)控制并发处理能力
memory字符串内存上限(如 "512M")触发 OOM 阈值测试
reservations对象预留资源保证模拟低配环境
注意: deploy 资源限制在 docker-compose up 单机模式下仅作为元数据传递,实际生效需要 Swarm 模式或使用 --compatibility 标志。单机性能测试建议直接使用 docker run --cpus --memory 或通过 docker-compose --compatibility 启动。

2.7 本章小结

  • 核心字段:version、services、networks、volumes 构成 Compose 文件骨架。
  • 服务定义:通过 image/build、ports、environment、depends_on 声明容器行为。
  • 网络隔离:自定义 bridge 网络实现前端/后端/数据层分组隔离,符合最小权限原则。
  • 卷持久化:命名卷用于数据库,绑定挂载用于开发,tmpfs 用于临时高性能缓存。
  • 启动控制:healthcheck + condition: service_healthy 确保依赖服务就绪。
  • 资源约束:deploy.resources 为性能测试提供声明式资源限制模板。