强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 1 章 · 简介:Compose 概念、版本演进与 Kubernetes 对比

第 1 章 · Docker Compose 简介

1.1 什么是 Docker Compose?

Docker Compose 是 Docker 官方推出的多容器编排工具。它允许你用一个 YAML 文件(默认 docker-compose.ymlcompose.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)
实现语言PythonGo
命令格式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 字段的必要性
  • 引入了新特性如 profilesinclude
  • 定义在 compose-spec.io

⚠️ 重要提示:如果你的 compose.yml 顶部还有 version: "3.8" 这样的字段,在 V2 中虽然不会报错,但已无实际意义,建议删除以保持简洁。


1.4 Docker Compose vs Kubernetes

这是被问得最多的问题之一:什么时候用 Compose,什么时候用 Kubernetes(K8s)?

定位对比

单机                                集群
 │                                   │
 ▼                                   ▼
Docker Compose                    Kubernetes
(单主机编排)                       (多主机编排)
     │                                 │
     │  ┌──────────────┐              │
     ├──│ Docker Swarm  │──────────────┤
     │  │ (轻量集群)     │              │
     │  └──────────────┘              │
     │                                │
  开发/测试/小规模生产              大规模生产

详细对比

维度Docker ComposeKubernetes
适用规模单机,少量容器大规模集群,数千节点
学习曲线⭐⭐ 低⭐⭐⭐⭐⭐ 高
配置复杂度一个 YAML 文件多种资源对象 (Deployment, Service, Ingress…)
自动扩缩容✅ HPA / VPA
滚动更新有限 (Swarm 模式)✅ 原生支持
服务发现内部 DNS内部 DNS + Service Mesh
存储编排本地卷 / NFSPV/PV + StorageClass
社区生态Docker 生态CNCF 生态,极其丰富
典型工具Docker Desktop, Watchtowerkubectl, 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 EngineCompose 底层依赖,调用 Engine API 创建容器
Docker CLIV2 中 Compose 作为 CLI 插件 (docker compose)
DockerfileCompose 的 build 指令引用 Dockerfile 构建镜像
Docker NetworkCompose 自动创建默认网络,实现服务间通信
Docker VolumeCompose 声明式管理数据卷
Docker SwarmCompose 文件可直接用于 docker stack deploy

1.6 本教程的学习路线

第 1-2 章:认知层 ──── 理解是什么、怎么装
         │
第 3 章:  基础层 ──── 掌握核心语法
         │
第 4-6 章:配置层 ──── 网络 / 卷 / 环境变量
         │
第 7-8 章:应用层 ──── 依赖管理 / 构建镜像
         │
第 9-10 章:进阶层 ──── 多环境 / 敏感信息
         │
第 11-13 章:生产层 ──── 部署 / 日志 / 监控
         │
第 14-15 章:实战层 ──── 排障 / 最佳实践

学习建议

  1. 动手优先:每章示例都要亲手跑一遍
  2. 循序渐进:不要跳章,后面的内容会引用前面的知识
  3. 带着问题学:想想自己的项目能不能用 Compose 优化
  4. 查阅官方文档:本教程是引导,官方文档 是权威参考

1.7 小结

要点说明
Compose 是什么多容器声明式编排工具
核心价值一条命令管理整个应用栈
版本现状V2 是唯一推荐版本,V1 已停止维护
vs Kubernetes互补关系,Compose 适合单机,K8s 适合集群
适用阶段开发、测试、CI/CD、轻量生产

扩展阅读


下一章:第 2 章 · 安装与配置 →