Docker: Docker Swarm

最后更新:2026-08-26

单机 Docker 扛不住流量?Swarm 让你从 1 台变 3 台,零停机发布新版本。

1. 你将学到


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) 节点角色

100%
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 让任何节点的端口都能路由到服务的任何副本——即使该副本不在当前节点上。

100%
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 策略。

📖 小节


📝 作业

  1. 基础题(难度⭐):在单机上初始化 Swarm,创建一个 3 副本 Nginx service,验证 docker service ps 显示副本分布。
  2. 进阶题(难度⭐⭐):执行滚动更新(nginx:1.25→1.26),观察 docker service ps 中的更新过程。
  3. 挑战题(难度⭐⭐⭐):在三台虚拟机搭建 Swarm 集群,部署 5 副本 API 服务,模拟一个 Worker 节点宕机,验证副本自动迁移到其他节点。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏