第 1 章 · 简介:Compose 概念、版本演进与 Kubernetes 对比
第 1 章 · Docker Compose 简介
1.1 什么是 Docker Compose?
Docker Compose 是 Docker 官方推出的多容器编排工具。它允许你用一个 YAML 文件(默认 docker-compose.yml 或 compose.yaml)来定义应用所需的所有服务(Service)、网络(Network)、数据卷(Volume)等资源,然后通过一条命令完成创建和启动。
核心理念
| 概念 | 说明 |
|---|---|
| 声明式配置 | 用 YAML 描述"想要什么状态",而非"怎么做" |
| 单机编排 | 面向单台主机上的多容器应用,区别于集群编排 |
| 开发友好 | 快速启动、热重载、一键清理,极大提升开发体验 |
| 基础设施即代码 | compose.yaml 可纳入版本控制,团队共享一致环境 |
适用场景
┌─────────────────────────────────────────────────────────┐
│ Docker Compose 适用场景 │
├──────────────┬──────────────────────────────────────────┤
│ 本地开发环境 │ 一键启动 Web + DB + Redis + MQ │
│ 自动化测试 │ CI 中拉起完整依赖栈,跑完即销毁 │
│ 演示/POC │ 快速搭建可运行的原型 │
│ 单机生产部署 │ 小型项目、个人站点、内部工具 │
│ Docker Swarm │ 作为 Swarm Stack 的部署描述文件 │
└──────────────┴──────────────────────────────────────────┘
1.2 为什么需要 Compose?
没有 Compose 的世界
假设你有一个典型的 Web 应用:Nginx + Python Flask + PostgreSQL + Redis。不用 Compose,你需要:
# 1. 创建网络
docker network create myapp
# 2. 启动 PostgreSQL
docker run -d --name db \
--network myapp \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:16-alpine
# 3. 等待数据库就绪...
sleep 10
# 4. 启动 Redis
docker run -d --name redis \
--network myapp \
redis:7-alpine
# 5. 启动 Flask 应用
docker run -d --name web \
--network myapp \
-p 5000:5000 \
-e DATABASE_URL=postgresql://postgres:secret@db:5432/myapp \
-e REDIS_URL=redis://redis:6379 \
myapp:latest
# 6. 启动 Nginx
docker run -d --name nginx \
--network myapp \
-p 80:80 \
-v ./nginx.conf:/etc/nginx/nginx.conf:ro \
nginx:alpine
问题显而易见:
- 命令冗长、顺序敏感、容易出错
- 清理需要逐个
docker rm+docker network rm - 无法纳入版本控制
- 团队成员难以复现一致环境
用 Compose 的世界
# docker-compose.yml
services:
db:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secret
redis:
image: redis:7-alpine
web:
build: ./app
ports:
- "5000:5000"
environment:
DATABASE_URL: postgresql://postgres:secret@db:5432/myapp
REDIS_URL: redis://redis:6379
depends_on:
db:
condition: service_healthy
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- web
volumes:
pgdata:
# 一条命令启动
docker compose up -d
# 一条命令清理
docker compose down
💡 这就是 Compose 的价值:把复杂的多容器编排简化为一个声明式 YAML + 一组简单命令。
1.3 版本演进历史
Compose 经历了三个大的阶段,理解这段历史有助于避免踩坑。
时间线
2014 ────────────────────────────────────────────────────── 2026
│ │
├─ 2014 Fig 发布 (Python 实现) │
│ by Orchard Labs │
│ │
├─ 2015 Docker 收购 → 更名 docker-compose (V1) │
│ 命令: docker-compose up │
│ 文件: docker-compose.yml │
│ 顶层 version: "2" / "3" 字段 │
│ │
├─ 2020 Compose Specification 发布 │
│ 统一 V2/V3,不再需要 version 字段 │
│ │
├─ 2021 Docker Compose V2 发布 (Go 重写) │
│ 命令: docker compose up (空格而非连字符) │
│ 作为 Docker CLI 插件分发 │
│ │
├─ 2023 V1 停止维护 │
│ V2 成为唯一官方推荐版本 │
│ │
└─ 2026 当前:Compose Specification 持续演进 │
默认文件名推荐 compose.yaml │
V1 vs V2 对比
| 维度 | V1 (docker-compose) | V2 (docker compose) |
|---|---|---|
| 实现语言 | Python | Go |
| 命令格式 | docker-compose (连字符) | docker compose (空格,CLI 插件) |
| 安装方式 | 独立二进制 | Docker CLI 插件 |
| 性能 | 较慢 | 显著提升 (2-5x) |
version 字段 | 必填 ("2", "3" 等) | 可选,推荐省略 |
| Compose Specification | 不支持 | 完整支持 |
| profiles | 不支持 | ✅ |
| GPU 支持 | 有限 | ✅ deploy.resources.reservations.devices |
| 依赖健康检查 | depends_on 仅控制顺序 | depends_on.condition 支持 healthcheck |
| 多组合文件 | -f 参数 | -f 参数 + include 指令 |
| 构建进度 | 简单输出 | 类 BuildKit 风格 |
| 维护状态 | ⚠️ 已停止维护 (2023) | ✅ 活跃开发中 |
Compose Specification
2020 年 Docker 联合 AWS、Microsoft 等推出了 Compose Specification,它:
- 统一了 V2 和 V3 格式的分歧
- 消除了
version字段的必要性 - 引入了新特性如
profiles、include - 定义在 compose-spec.io
⚠️ 重要提示:如果你的
compose.yml顶部还有version: "3.8"这样的字段,在 V2 中虽然不会报错,但已无实际意义,建议删除以保持简洁。
1.4 Docker Compose vs Kubernetes
这是被问得最多的问题之一:什么时候用 Compose,什么时候用 Kubernetes(K8s)?
定位对比
单机 集群
│ │
▼ ▼
Docker Compose Kubernetes
(单主机编排) (多主机编排)
│ │
│ ┌──────────────┐ │
├──│ Docker Swarm │──────────────┤
│ │ (轻量集群) │ │
│ └──────────────┘ │
│ │
开发/测试/小规模生产 大规模生产
详细对比
| 维度 | Docker Compose | Kubernetes |
|---|---|---|
| 适用规模 | 单机,少量容器 | 大规模集群,数千节点 |
| 学习曲线 | ⭐⭐ 低 | ⭐⭐⭐⭐⭐ 高 |
| 配置复杂度 | 一个 YAML 文件 | 多种资源对象 (Deployment, Service, Ingress…) |
| 自动扩缩容 | ❌ | ✅ HPA / VPA |
| 滚动更新 | 有限 (Swarm 模式) | ✅ 原生支持 |
| 服务发现 | 内部 DNS | 内部 DNS + Service Mesh |
| 存储编排 | 本地卷 / NFS | PV/PV + StorageClass |
| 社区生态 | Docker 生态 | CNCF 生态,极其丰富 |
| 典型工具 | Docker Desktop, Watchtower | kubectl, Helm, ArgoCD |
| 启动时间 | 秒级 | 分钟级 (集群初始化) |
| 适用团队 | 小团队 / 全栈开发 | 中大型团队 / 专业运维 |
决策指南
你的应用需要部署到多台服务器吗?
├── 是 → Kubernetes
└── 否 → 你的团队有专职 SRE/运维吗?
├── 是 → 可以考虑 K8s (即使是单节点,如 k3s)
└── 否 → Docker Compose ✅
你的应用需要自动扩缩容吗?
├── 是 → Kubernetes
└── 否 → Docker Compose ✅
你的 SLA 要求有多高?
├── 99.99%+ → Kubernetes (多副本、自愈)
└── 99.9% 以内 → Docker Compose + 适当的 restart 策略 ✅
互补而非对立
在实际工程中,两者经常共存:
| 阶段 | 工具 |
|---|---|
| 本地开发 | Docker Compose |
| CI/CD 测试 | Docker Compose |
| 预发布/生产 | Kubernetes |
💡 实践建议:先用 Compose 快速验证,需要时再迁移至 K8s。许多项目永远不需要 K8s——别过度工程化。
1.5 Compose 与 Docker 生态的关系
┌──────────────────────────────────────────────┐
│ Docker 生态全景 │
├──────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────────┐ │
│ │ Docker │ │ Docker │ │
│ │ Engine │ │ CLI │ │
│ │ (守护进程)│ │ (客户端) │ │
│ └────┬─────┘ └──────┬───────┘ │
│ │ │ │
│ │ ┌──────────┴────────────┐ │
│ │ │ docker compose │ │
│ │ │ (CLI 插件) │ │
│ │ └──────────┬────────────┘ │
│ │ │ │
│ ┌────┴───────┐ ┌────┴──────────┐ │
│ │ Dockerfile │ │ compose.yaml │ │
│ │ (构建镜像) │ │ (编排服务) │ │
│ └────────────┘ └───────────────┘ │
│ │
│ ┌──────────┐ ┌──────────────┐ │
│ │ Docker │ │ Docker │ │
│ │ Desktop │ │ Swarm │ │
│ │ (GUI) │ │ (集群模式) │ │
│ └──────────┘ └──────────────┘ │
└──────────────────────────────────────────────┘
关键关系
| 组件 | 与 Compose 的关系 |
|---|---|
| Docker Engine | Compose 底层依赖,调用 Engine API 创建容器 |
| Docker CLI | V2 中 Compose 作为 CLI 插件 (docker compose) |
| Dockerfile | Compose 的 build 指令引用 Dockerfile 构建镜像 |
| Docker Network | Compose 自动创建默认网络,实现服务间通信 |
| Docker Volume | Compose 声明式管理数据卷 |
| Docker Swarm | Compose 文件可直接用于 docker stack deploy |
1.6 本教程的学习路线
第 1-2 章:认知层 ──── 理解是什么、怎么装
│
第 3 章: 基础层 ──── 掌握核心语法
│
第 4-6 章:配置层 ──── 网络 / 卷 / 环境变量
│
第 7-8 章:应用层 ──── 依赖管理 / 构建镜像
│
第 9-10 章:进阶层 ──── 多环境 / 敏感信息
│
第 11-13 章:生产层 ──── 部署 / 日志 / 监控
│
第 14-15 章:实战层 ──── 排障 / 最佳实践
学习建议
- 动手优先:每章示例都要亲手跑一遍
- 循序渐进:不要跳章,后面的内容会引用前面的知识
- 带着问题学:想想自己的项目能不能用 Compose 优化
- 查阅官方文档:本教程是引导,官方文档 是权威参考
1.7 小结
| 要点 | 说明 |
|---|---|
| Compose 是什么 | 多容器声明式编排工具 |
| 核心价值 | 一条命令管理整个应用栈 |
| 版本现状 | V2 是唯一推荐版本,V1 已停止维护 |
| vs Kubernetes | 互补关系,Compose 适合单机,K8s 适合集群 |
| 适用阶段 | 开发、测试、CI/CD、轻量生产 |
扩展阅读
- Compose Specification 官方规范
- Docker Compose V2 Release Notes
- Docker Blog: Compose V2 GA
- Kubernetes 官方文档 — 了解何时需要升级到 K8s
下一章:第 2 章 · 安装与配置 →