Docker Swarm 与 Docker Compose 对比解析
Docker Swarm 和 Docker Compose 都是 Docker 生态系统中的重要工具,但它们的定位和使用场景有显著不同。以下是两者的详细对比:
1. 核心定位差异
维度 | Docker Compose | Docker Swarm |
---|---|---|
用途 | 单机容器编排 | 集群容器编排 |
适用环境 | 开发/测试环境 | 生产环境 |
节点数量 | 单机 | 多节点集群 |
主要功能 | 定义和运行多容器应用 | 管理和调度集群中的服务 |
2. 配置文件对比
Docker Compose 示例 (docker-compose.yml
)
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
Docker Swarm 示例 (stack.yml
)
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
deploy:
replicas: 3
update_config:
parallelism: 2
delay: 10s
resources:
limits:
cpus: '0.5'
memory: 512M
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
deploy:
placement:
constraints: [node.role == manager]
3. 主要功能区别
部署方式
# Compose
docker-compose up -d
# Swarm
docker stack deploy -c stack.yml myapp
扩展能力
# Compose (需修改文件后重新部署)
docker-compose scale web=3
# Swarm (动态扩展)
docker service scale myapp_web=5
网络模型
- Compose:默认创建 bridge 网络
- Swarm:默认使用 overlay 网络(跨节点通信)
4. 使用场景
使用 Docker Compose 当:
- 本地开发环境搭建
- 单机多容器应用测试
- 需要快速启动完整服务栈
- CI/CD 管道中的测试阶段
使用 Docker Swarm 当:
- 生产环境部署
- 需要服务高可用性
- 多主机容器编排
- 需要滚动更新和回滚功能
5. 协同工作模式
两者可以结合使用:
- 开发阶段:使用 Compose 文件定义服务
- 生产部署:扩展 Compose 文件添加 Swarm 特有配置,然后部署为 Stack
# 同时兼容 Compose 和 Swarm 的文件示例
version: '3.8'
services:
web:
image: nginx
ports:
- "80:80"
# Compose 会忽略这部分
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
6. 关键能力对比
功能 | Docker Compose | Docker Swarm |
---|---|---|
服务发现 | 容器名解析 | 内置 DNS 轮询 |
负载均衡 | 无 | 自动 L4 负载均衡 |
滚动更新 | 无 | 支持 |
健康检查 | 基础支持 | 更完善的健康监测 |
机密管理 | 环境变量 | docker secrets 集成 |
节点管理 | 不支持 | 支持多节点调度 |
7. 转换与升级
从 Compose 迁移到 Swarm:
- 保留原有 Compose 文件
- 添加
deploy
相关配置 - 初始化 Swarm 集群:
docker swarm init
- 部署为 Stack:
docker stack deploy -c docker-compose.yml myapp
最佳实践建议
开发流程:
- 开发时使用
docker-compose up
- 测试时添加
deploy
配置进行 Swarm 测试 - 生产使用
docker stack deploy
- 开发时使用
文件管理:
. ├── docker-compose.yml # 基础配置 └── docker-compose.swarm.yml # Swarm 扩展配置
版本控制:
- Compose 文件适合放入代码仓库
- Swarm 的敏感配置(secrets)应单独管理
两者不是替代关系,而是互补工具,合理搭配使用可以覆盖从开发到生产的完整容器化应用生命周期。