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 和外部网络引用。
| 网络模式 | 驱动 | 适用场景 | 隔离级别 |
|---|---|---|---|
| 默认 bridge | bridge | 单机简单应用 | 低(所有服务互通) |
| 自定义 bridge | bridge | 多服务分组隔离 | 中(按网络分组) |
| host | host | 性能敏感场景 | 无(共享宿主机网络栈) |
| overlay | overlay | Swarm 集群跨节点 | 高(加密通信) |
以下 SVG 展示典型的三层应用网络拓扑,体现前端、后端与数据层的网络隔离关系:
2.4 卷的声明式配置
卷(Volume)用于持久化容器数据,支持命名卷、绑定挂载和 tmpfs 三种类型。在性能测试与授权测试场景中,卷的正确配置直接影响数据一致性和 I/O 性能。
| 卷类型 | 声明方式 | 生命周期 | 性能特征 | 典型用途 |
|---|---|---|---|---|
| 命名卷 | volumes: db-data: | 独立于容器 | 中(由 Docker 管理) | 数据库持久化 |
| 绑定挂载 | volumes: ./data:/app/data | 依赖宿主机路径 | 高(直接文件系统) | 开发热重载、日志收集 |
| tmpfs | tmpfs: /run | 容器生命周期 | 极高(内存) | 临时缓存、敏感数据 |
性能测试注意事项: 绑定挂载在 macOS 和 Windows 上存在显著的 I/O 性能损耗(通过 gRPC FUSE 转发)。若进行磁盘密集型压测,建议使用命名卷或将测试数据预加载至 tmpfs,避免绑定挂载成为瓶颈。
2.5 服务依赖与启动顺序控制
Compose 提供三种依赖控制机制,适用于不同场景:
- depends_on:基础依赖,仅保证容器启动顺序,不等待服务就绪。
- healthcheck:在服务定义中声明健康检查命令,配合
condition: service_healthy实现就绪等待。 - init 脚本 / wait-for-it:在入口点脚本中轮询依赖服务端口,适用于复杂启动序列。
以下 SVG 展示服务启动顺序与健康检查的完整流程:
授权测试场景提示: 在编排授权服务(如 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为性能测试提供声明式资源限制模板。