Docker: Docker Swarm
最后更新:2026-08-26
单机 Docker 扛不住流量?Swarm 让你从 1 台变 3 台,零停机发布新版本。
1. 你将学到
- Swarm 集群架构与初始化
- Service vs Container 的区别
- 滚动更新与回滚策略
- 秘密与配置管理
- 多节点网络路由
2. 一个电商运维的故事
(1) 痛点:单机扛不住流量
Charlie 的电商业务流量暴涨,单机 Docker 扛不住了——高峰期 CPU 100%、API 响应超时、用户投诉。需要扩展到多台服务器,但手动在 3 台服务器上分别启动容器太复杂。
(2) Docker Swarm 集群的解法
Charlie 初始化了一个 3 节点 Swarm 集群,把 API 扩展到 5 副本,用滚动更新零停机发布了新版本。
BASH
# Initialize Swarm cluster
docker swarm init --advertise-addr 10.0.0.1
# Deploy service with 5 replicas
docker service create --replicas 5 --name api -p 8080:80 myapp:v2
# Rolling update to v3
docker service update --image myapp:v3 api
(3) 收益:单机→集群,5 分钟搞定
3 台服务器变成一个集群,5 副本 API 自动分发,滚动更新零停机。从单机到集群只用了 5 分钟。
3. Swarm 架构
(1) 节点角色
graph TB
MGR1["Manager Node 1<br/>Leader"] --- MGR2["Manager Node 2<br/>Standby"]
MGR1 --- MGR3["Manager Node 3<br/>Standby"]
MGR1 --> WRK1["Worker Node 1"]
MGR2 --> WRK2["Worker Node 2"]
MGR3 --> WRK3["Worker Node 3"]
| 角色 | 职责 | 数量 | 是否运行容器 |
|---|---|---|---|
| Manager | 集群管理、调度、API | 奇数(3/5/7) | ✅ 可选 |
| Worker | 执行任务、运行容器 | 任意 | ✅ 必须 |
(1) Service vs Container
| 维度 | Container | Service |
|---|---|---|
| 创建方式 | docker run |
docker service create |
| 副本数 | 1 | 可配置 replicas |
| 自愈 | 需 restart 策略 | ✅ 自动保持副本数 |
| 负载均衡 | 无 | ✅ Routing Mesh |
| 滚动更新 | 手动 | ✅ 内置 |
| 适用场景 | 单机开发 | 集群生产 |
4. Swarm 初始化
▶ 示例:swarm init 初始化(难度⭐⭐)
BASH
# On Manager node: initialize the swarm
docker swarm init --advertise-addr 10.0.0.1
# Output includes the join token for workers
# docker swarm join --token SWMTKN-xxx 10.0.0.1:2377
BASH
# On Worker nodes: join the swarm
docker swarm join --token SWMTKN-xxx 10.0.0.1:2377
# List all nodes
docker node ls
💻 输出:
TEXT
📖 仅展示
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
abc123 * manager1 Ready Active Leader
def456 worker1 Ready Active
ghi789 worker2 Ready Active
5. Service 管理
▶ 示例:service create 部署(难度⭐⭐)
BASH
# Create a service with 3 replicas
docker service create \
--name web \
--replicas 3 \
--publish 80:80 \
nginx:1.25-alpine
# List services
docker service ls
# Check service tasks (containers)
docker service ps web
▶ 示例:service scale 扩展(难度⭐⭐)
BASH
# Scale to 5 replicas
docker service scale web=5
# Verify
docker service ps web
▶ 示例:service update 滚动更新(难度⭐⭐⭐)
BASH
# Rolling update: update 2 containers at a time with 30s delay
docker service update \
--image nginx:1.26-alpine \
--update-parallelism 2 \
--update-delay 30s \
--update-failure-action rollback \
web
# Check update status
docker service inspect web --format='{{.UpdateStatus.State}}'
(1) 滚动更新策略
| 参数 | 默认值 | 说明 |
|---|---|---|
--update-parallelism |
1 | 每次更新几个副本 |
--update-delay |
0s | 批次间等待时间 |
--update-failure-action |
pause | 失败后动作(pause/rollback/continue) |
--update-monitor |
5s | 更新后监控时间 |
▶ 示例:service rollback 回滚(难度⭐⭐)
BASH
# Rollback to previous version
docker service rollback web
6. 秘密与配置管理
▶ 示例:docker secret 创建和使用(难度⭐⭐⭐)
BASH
# Create a secret from a file
echo "my_super_secret_password" | docker secret create db_password -
# Use the secret in a service
docker service create \
--name api \
--secret db_password \
-e DB_PASSWORD_FILE=/run/secrets/db_password \
myapp:1.0
🔒 安全: Secret 存储在 Manager 节点的 Raft 日志中(加密),只发送给运行该服务的 Worker。容器内通过
/run/secrets/<name> 文件访问,不暴露在环境变量中。**
7. Routing Mesh
(1) 网络路由机制
Swarm 的 Routing Mesh 让任何节点的端口都能路由到服务的任何副本——即使该副本不在当前节点上。
graph LR
A["Node 1<br/>:80"] -->|"request"| B["Routing Mesh"]
C["Node 2<br/>:80"] --> B
B -->|"round-robin"| D["Replica 1<br/>Node 1"]
B --> E["Replica 2<br/>Node 2"]
B --> F["Replica 3<br/>Node 3"]
| 模式 | 语法 | 说明 |
|---|---|---|
| VIP(默认) | --publish 80:80 |
虚拟 IP + 负载均衡 |
| DNSRR | --endpoint-mode dnsrr |
DNS 轮询,无 VIP |
8. Swarm vs Compose 对比
| 维度 | Docker Compose | Docker Swarm |
|---|---|---|
| 节点数 | 单机 | 多机集群 |
| 高可用 | ❌ | ✅ Manager 冗余 |
| Service 自愈 | restart 策略 | ✅ 保持副本数 |
| 滚动更新 | 手动 | ✅ 内置 |
| 负载均衡 | Nginx/DNS 轮询 | ✅ Routing Mesh |
| Secrets | 环境变量 | ✅ 加密存储 |
| 部署方式 | docker compose up |
docker stack deploy |
▶ 示例:用 stack deploy 部署 Compose 文件到 Swarm(难度⭐⭐⭐)
BASH
# Deploy a compose file as a stack
docker stack deploy -c docker-compose.yml mystack
# List stacks
docker stack ls
# List services in a stack
docker stack services mystack
# Remove a stack
docker stack rm mystack
9. 完整示例:三节点集群部署
BASH
# ============================================
# Complete walkthrough: 3-node Swarm cluster
# Covers: init, join, service, scale, update
# ============================================
# --- On Manager (10.0.0.1) ---
# 1. Initialize Swarm
docker swarm init --advertise-addr 10.0.0.1
# 2. Get worker join token
docker swarm join-token worker
# --- On Workers (10.0.0.2, 10.0.0.3) ---
# 3. Join the swarm (paste the token from step 2)
docker swarm join --token SWMTKN-xxx 10.0.0.1:2377
# --- On Manager ---
# 4. Verify cluster
docker node ls
# 5. Deploy web service with 5 replicas
docker service create \
--name web \
--replicas 5 \
--publish 80:80 \
--restart-condition on-failure \
nginx:1.25-alpine
# 6. Check distribution across nodes
docker service ps web
# 7. Rolling update to v1.26
docker service update \
--image nginx:1.26-alpine \
--update-parallelism 2 \
--update-delay 30s \
web
# 8. Simulate node failure
docker node update --availability drain worker1
docker service ps web # Replicas rescheduled
# 9. Restore node
docker node update --availability active worker1
# 10. Scale down
docker service scale web=2
# 11. Clean up
docker service rm web
docker swarm leave --force # On manager
❓ 常见问题
Q Swarm 最少需要几台服务器?
A 1 台就能跑(开发/测试)。生产推荐 3+ Manager(奇数,Raft 共识需要多数)+ N Worker。Manager 最少 1 台,但单 Manager 故障时集群不可管理。
Q Swarm 的数据存在哪里?
A Manager 节点的 Raft 日志(
/var/lib/docker/swarm/)。包含集群状态、服务定义、Secret 等。Manager 宕机时,其他 Manager 通过 Raft 协议选举新 Leader。建议定期备份 Raft 日志。Q Routing Mesh 怎么做负载均衡?
A Swarm 的 VIP(Virtual IP)模式:服务分配一个虚拟 IP,请求到 VIP 后由内核的 IPVS 负载均衡到各副本。所有节点都监听 published 端口,请求可以被路由到任何节点的副本上。
Q 如何给 Swarm 配置 TLS?
A Swarm 内置 mTLS(双向 TLS),节点间通信自动加密。初始化时自动生成证书,无需手动配置。Manager 之间、Manager-Worker 之间都是加密通信。
Q 从 Compose 迁移到 Swarm 要改什么?
A 大部分 docker-compose.yml 可直接用
docker stack deploy。需要注意:① build 改为 image(Swarm 不支持 build);② volumes 只支持 named volumes 和 nfs;③ depends_on 只支持 started,不支持 service_healthy;④ 添加 deploy 块配置 replicas/update 策略。📖 小节
- Swarm = Docker 内置的容器编排:Manager 管理调度,Worker 运行容器
- Service 替代 Container:声明副本数,自动自愈,内置负载均衡
- 滚动更新:
--update-parallelism+--update-delay控制节奏 - Routing Mesh:任何节点的端口自动路由到服务的所有副本
- Secret 加密存储:不暴露在环境变量,容器内通过文件读取
docker stack deploy -c compose.yml可直接将 Compose 文件部署到 Swarm
📝 作业
- 基础题(难度⭐):在单机上初始化 Swarm,创建一个 3 副本 Nginx service,验证
docker service ps显示副本分布。 - 进阶题(难度⭐⭐):执行滚动更新(nginx:1.25→1.26),观察
docker service ps中的更新过程。 - 挑战题(难度⭐⭐⭐):在三台虚拟机搭建 Swarm 集群,部署 5 副本 API 服务,模拟一个 Worker 节点宕机,验证副本自动迁移到其他节点。