Docker Compose 核心概念
Docker Compose 是一个“单机级”的多容器编排工具,用声明式 YAML 把一组相关容器当成一个应用来管理。
关键词:
- 单机(single-host)
- 多容器(multi-container)
- 声明式(declarative)
- 应用级(application-level)
一个真实应用通常包含:
- Web
- API
- DB
- Cache
- MQ
如果用 docker run:
- 顺序难控制
- 网络难配置
- 参数冗长
- 不可复现
Compose 用 一个文件 描述 整个应用拓扑。
Compose 可以:
- 一键启动整个系统
- 环境一致
- 新人上手快
Compose 把多个容器当成:
一个逻辑应用(project)
Docker Engine ← 容器运行
Docker Compose ← 应用编排(单机)
Kubernetes ← 集群编排(多机)
- 📌 Compose 不是 Docker 的替代品
- 📌 Compose 不做调度、不做高可用、不做自愈
Project = 一组相关联的服务(services)
-
默认 project 名:
-
当前目录名
-
也可以指定:
docker compose -p myapp up
📌 Project 是 Compose 的 最大作用域。
Service 是容器的逻辑模板,不是容器本身。
一个 service 可以:
- 创建 1 个或多个容器(scale)
- 共享网络
- 共享 volume
示例:
services:
web:
image: nginx
由 service 实例化而来
命名规则:
<project>_<service>_<index>
例如:
myapp_web_1
Compose 自动创建网络:
<project>_default
特点:
- 基于 bridge
- DNS 自动解析 service 名
- 容器间可直连
📌 service 名 = DNS 名
Compose 定义 volume:
- 持久化数据
- 跨容器共享
docker-compose.yml 是一个“应用声明”,不是执行脚本。
- 描述“我想要什么状态”
- Compose 会把当前状态 -> 目标状态
📌 与 Kubernetes 思想高度一致。
启动流程
docker compose up
↓
解析 docker-compose.yml
↓
创建 project
↓
创建 network
↓
创建 volume
↓
创建并启动 containers
停止流程
docker compose down
↓
停止容器
↓
删除容器
↓
删除网络
↓
(默认不删 volume)
默认网络模型
web ----+
api ----+----> bridge network (project_default)
db ----+
- 每个 service 自动加入同一个 network
- 容器通过 service 名通信
示例:
api 连接 db:
host = db
port = 5432
📌 不需要暴露端口给宿主机。
| 场景 | 是否需要 ports |
|---|---|
| 容器之间 | ❌ |
| 宿主机访问 | ✅ |
Volume 类型
volumes:
db_data:
./data:/var/lib/mysql
📌 数据不应放在容器层。
depends_on:
- db
只保证启动顺序,不保证服务可用!
真正可用:
- healthcheck + depends_on.condition
- 应用层重试
Compose 不擅长的事:
- 高可用
- 自动扩缩容
- 节点故障恢复
- 跨宿主机调度
- 滚动升级
👉 这些是 Kubernetes 的职责。
| 对比 | Compose | Kubernetes |
|---|---|---|
| 运行范围 | 单机 | 集群 |
| 调度 | 无 | 有 |
| 自愈 | 无 | 有 |
| 学习成本 | 低 | 高 |
| 场景 | 开发/测试 | 生产 |
- ✅ 本地开发环境
- ✅ 集成测试
- ✅ Demo / POC
- ✅ CI 构建阶段
- ❌ 核心生产环境
- v1:docker-compose(Python 实现,已废弃)
- v2:docker compose(Go 实现,CLI 插件)
📌 推荐 只使用 v2。
✅ 是
❌ 但仅限单机
✅ 内置 bridge + DNS
❌ 不能
Compose 是单机级应用编排工具
Service 是容器的逻辑模板
Compose 管理的是“应用”,不是单个容器