Docker Swarm 集群部署与管理入门 2026

💡 什么是 Docker Swarm? Docker Swarm 是 Docker 官方提供的容器编排工具,用于将多个 Docker 主机组成一个集群,实现容器的自动化部署、扩展和管理。
本文将带你从 0 到 1 掌握:
- ✅ Swarm 集群架构与概念
- ✅ 集群初始化与节点管理
- ✅ 服务部署与配置
- ✅ 负载均衡与服务发现
- ✅ 滚动更新与回滚
- ✅ 故障恢复与高可用性
一、Swarm 集群基础
1.1 Swarm 架构概述
┌─────────────────────────────────────────────────────────────────┐
│ Docker Swarm Cluster │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Manager Node(s) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Manager1 │ │ Manager2 │ │ Manager3 │ │ │
│ │ │ (Leader) │ │ (Raft) │ │ (Raft) │ │ │
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
│ │ │ │ │ │ │
│ └───────┼────────────┼────────────┼──────────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Worker Nodes │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────┐ │ │
│ │ │ Worker1 │ │ Worker2 │ │ Worker3 │ │Worker4 │ │ │
│ │ │ Container │ │ Container│ │ Container│ │Container││ │
│ │ │ Container │ │ Container│ │ Container│ │Container││ │
│ │ └──────────┘ └──────────┘ └──────────┘ └────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘1.2 核心概念
| 概念 | 说明 |
|---|---|
| Manager Node | 管理节点,负责集群管理、调度决策、服务编排 |
| Worker Node | 工作节点,负责运行容器任务 |
| Leader | 主管理节点,由 Raft 协议选举产生 |
| Service | 定义要运行的任务(容器)的规范 |
| Task | 单个容器实例,是 Swarm 的最小调度单位 |
| Slot | 任务槽位,每个节点有有限数量的槽位 |
| Overlay Network | 跨主机网络,实现容器间通信 |
1.3 Swarm vs Kubernetes
| 特性 | Docker Swarm | Kubernetes |
|---|---|---|
| 复杂度 | 简单易用 | 功能强大但复杂 |
| 学习曲线 | 平缓 | 陡峭 |
| 部署速度 | 快速 | 较慢 |
| 社区生态 | 较小 | 庞大 |
| 适用场景 | 中小型集群 | 大型企业级集群 |
| 内置负载均衡 | ✅ | 需要额外配置 |
| 自动故障恢复 | ✅ | ✅ |
二、集群初始化
2.1 初始化 Manager 节点
# 在第一个节点上初始化 Swarm
docker swarm init --advertise-addr <manager-ip>
# 示例
docker swarm init --advertise-addr 192.168.1.100
# 查看初始化信息
docker swarm init --advertise-addr 192.168.1.100
# 输出示例:
# Swarm initialized: current node (abc123) is now a manager.
#
# To add a worker to this swarm, run the following command:
# docker swarm join --token SWMTKN-1-xxx 192.168.1.100:2377
#
# To add a manager to this swarm, run:
# docker swarm join-token manager
# docker swarm join --token SWMTKN-1-yyy 192.168.1.100:23772.2 添加 Worker 节点
# 在 Worker 节点上执行(使用从 Manager 获取的 token)
docker swarm join --token SWMTKN-1-xxx 192.168.1.100:2377
# 查看加入命令(在 Manager 上执行)
docker swarm join-token worker
# 查看节点列表
docker node ls2.3 添加 Manager 节点
# 获取 Manager 加入 token
docker swarm join-token manager
# 在新节点上执行
docker swarm join --token SWMTKN-1-yyy 192.168.1.100:2377
# 验证 Manager 状态
docker node ls2.4 离开集群
# Worker 节点离开
docker swarm leave
# Manager 节点离开(需先降级)
docker node demote <node-name>
docker swarm leave
# 强制移除节点(在 Manager 上执行)
docker node rm <node-name> --force三、服务部署
3.1 创建服务
# 基本服务创建
docker service create \
--name web \
--replicas 3 \
nginx
# 指定端口映射
docker service create \
--name web \
--replicas 3 \
--publish 80:80 \
nginx
# 指定网络
docker service create \
--name web \
--replicas 3 \
--network my-overlay-network \
nginx
# 指定环境变量
docker service create \
--name api \
--replicas 2 \
--env NODE_ENV=production \
--env DATABASE_URL=postgres://db:5432/mydb \
my-api-image3.2 服务配置选项
# 资源限制
docker service create \
--name web \
--replicas 3 \
--limit-cpu 0.5 \
--limit-memory 512M \
--reserve-cpu 0.25 \
--reserve-memory 256M \
nginx
# 健康检查
docker service create \
--name web \
--replicas 3 \
--health-cmd "curl -f http://localhost/health || exit 1" \
--health-interval 30s \
--health-timeout 10s \
--health-retries 3 \
nginx
# 更新配置
docker service update \
--replicas 5 \
--limit-memory 1G \
web3.3 Docker Compose 部署
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
placement:
constraints:
- node.role == worker
- node.labels.region == us-west
ports:
- "80:80"
networks:
- my-overlay-network
db:
image: mysql:8.0
deploy:
replicas: 1
placement:
constraints:
- node.role == worker
- node.labels.type == database
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: mydb
volumes:
- db-data:/var/lib/mysql
networks:
my-overlay-network:
driver: overlay
volumes:
db-data:# 使用 Compose 文件部署
docker stack deploy --compose-file docker-compose.yml my-stack
# 查看栈状态
docker stack ls
docker stack services my-stack
docker stack ps my-stack四、服务管理
4.1 查看服务状态
# 查看所有服务
docker service ls
# 查看服务详情
docker service inspect <service-name>
# 查看服务日志
docker service logs <service-name>
# 查看服务任务
docker service ps <service-name>4.2 扩展服务
# 扩展服务副本数
docker service scale web=5
# 缩小服务
docker service scale web=2
# 停止服务(保留配置)
docker service scale web=0
# 恢复服务
docker service scale web=34.3 更新服务
# 更新镜像
docker service update --image nginx:latest web
# 更新端口映射
docker service update --publish-rm 80:80 --publish-add 8080:80 web
# 更新资源限制
docker service update --limit-memory 1G web
# 强制更新(重新部署所有任务)
docker service update --force web4.4 删除服务
# 删除单个服务
docker service rm web
# 删除整个栈
docker stack rm my-stack五、负载均衡与服务发现
5.1 内置负载均衡
# 创建带负载均衡的服务
docker service create \
--name web \
--replicas 5 \
--publish published=80,target=80,mode=host \
nginx
# 查看端口映射
docker service inspect web | grep -A 10 "Ports"5.2 服务发现
# 同一网络内通过服务名访问
docker exec -it <container> curl http://web:80
# DNS 解析服务
docker exec -it <container> nslookup web
# 使用 VIP(虚拟 IP)
docker service inspect web | grep VIP5.3 外部负载均衡
# 创建外部访问的服务
docker service create \
--name web \
--replicas 3 \
--publish 80:80 \
--publish 443:443 \
nginx
# 配置 Nginx 作为外部负载均衡器
# /etc/nginx/conf.d/swarm.conf
upstream swarm_web {
server 192.168.1.100:80;
server 192.168.1.101:80;
server 192.168.1.102:80;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://swarm_web;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}六、滚动更新与回滚
6.1 配置滚动更新
# 创建服务时配置更新策略
docker service create \
--name web \
--replicas 5 \
--update-parallelism 2 \
--update-delay 10s \
--update-failure-action rollback \
--update-monitor 60s \
nginx:1.24
# 更新服务
docker service update --image nginx:1.25 web
# 查看更新进度
docker service ps web6.2 回滚服务
# 查看服务更新历史
docker service inspect web | grep -A 20 "UpdateStatus"
# 回滚到上一个版本
docker service rollback web
# 回滚指定服务
docker service rollback --to-revision 2 web6.3 更新策略配置
| 参数 | 说明 | 默认值 |
|---|---|---|
--update-parallelism | 并行更新的任务数 | 1 |
--update-delay | 更新间隔时间 | 0s |
--update-failure-action | 更新失败时的动作 | pause |
--update-monitor | 更新后监控时间 | 5s |
--update-order | 更新顺序 | stop-first |
七、故障恢复与高可用性
7.1 节点故障处理
# 查看节点状态
docker node ls
# 标记节点为不可用
docker node update --availability drain <node-name>
# 恢复节点
docker node update --availability active <node-name>
# 查看任务重新调度
docker service ps web7.2 自动故障恢复
# docker-compose.yml
services:
web:
image: nginx
deploy:
replicas: 3
restart_policy:
condition: on-failure # on-failure, any, none
delay: 5s # 重试间隔
max_attempts: 3 # 最大重试次数
window: 120s # 评估窗口7.3 Manager 高可用性
# 推荐配置奇数个 Manager 节点(3 或 5 个)
# Raft 协议需要多数派才能选举 Leader
# 查看 Manager 状态
docker node inspect <manager-node> | grep -A 5 "ManagerStatus"
# 手动触发 Leader 选举(不推荐在生产环境使用)
docker swarm update --autorebalance八、节点标签与约束
8.1 设置节点标签
# 设置节点标签
docker node update --label-add region=us-west <node-name>
docker node update --label-add type=database <node-name>
docker node update --label-add gpu=true <node-name>
# 查看节点标签
docker node inspect <node-name> | grep Labels
# 删除节点标签
docker node update --label-rm gpu <node-name>8.2 使用约束部署
# 使用约束部署服务
docker service create \
--name web \
--replicas 3 \
--constraint "node.role == worker" \
--constraint "node.labels.region == us-west" \
nginx
# 多约束条件
docker service create \
--name db \
--replicas 1 \
--constraint "node.labels.type == database" \
--constraint "node.labels.region == us-east" \
mysql:8.08.3 Docker Compose 约束配置
version: '3.8'
services:
web:
image: nginx
deploy:
placement:
constraints:
- node.role == worker
- node.labels.region == us-west
- node.labels.availability == high
db:
image: mysql:8.0
deploy:
placement:
constraints:
- node.labels.type == database
preferences:
- spread: node.labels.zone九、网络配置
9.1 创建 Overlay 网络
# 创建 overlay 网络
docker network create \
--driver overlay \
--subnet 10.0.0.0/24 \
--attachable \
my-overlay-network
# 创建加密 overlay 网络
docker network create \
--driver overlay \
--encrypt \
secure-network
# 查看网络
docker network ls
docker network inspect my-overlay-network9.2 服务网络配置
# 服务使用 overlay 网络
docker service create \
--name web \
--replicas 3 \
--network my-overlay-network \
nginx
# 服务连接多个网络
docker service create \
--name api \
--replicas 2 \
--network frontend \
--network backend \
my-api十、监控与日志
10.1 监控集群状态
# 查看节点状态
docker node ls
# 查看服务状态
docker service ls
# 查看任务状态
docker service ps <service-name>
# 查看容器日志
docker service logs <service-name>
# 实时日志
docker service logs -f <service-name>10.2 使用 Prometheus 监控
# docker-compose.yml
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
deploy:
placement:
constraints:
- node.role == manager
grafana:
image: grafana/grafana
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
deploy:
placement:
constraints:
- node.role == manager
volumes:
grafana-data:10.3 日志收集
# 使用 ELK 栈收集日志
docker service create \
--name logstash \
--log-driver gelf \
--log-opt gelf-address=udp://logstash:12201 \
nginx十一、备份与恢复
11.1 备份 Swarm 配置
# 导出 Swarm 配置
docker swarm inspect > swarm-config.json
# 备份 Raft 日志(需要停止 Docker)
cp -r /var/lib/docker/swarm /backup/swarm11.2 恢复 Swarm 配置
# 停止 Docker
systemctl stop docker
# 恢复 Raft 日志
cp -r /backup/swarm /var/lib/docker/swarm
# 启动 Docker
systemctl start docker
# 检查恢复状态
docker node ls十二、Swarm 最佳实践
12.1 集群规划
# Manager 节点数量:3 或 5 个(奇数)
# Worker 节点数量:根据负载决定
# 节点分布:跨可用区部署
# 推荐配置
# Production: 3 Managers + N Workers
# Staging: 1 Manager + 2 Workers
# Development: 1 Manager (单节点模式)12.2 安全配置
# 启用 TLS
docker swarm init --advertise-addr <ip> --tlsverify
# 使用自定义 CA
docker swarm init \
--advertise-addr <ip> \
--external-ca \
--ca-cert /path/to/ca.pem \
--ca-key /path/to/ca-key.pem
# 限制网络访问
docker network create \
--driver overlay \
--internal \
backend-network12.3 性能优化
# 调整调度器配置
docker swarm update \
--task-history-limit 5 \
--autorebalance
# 节点资源预留
docker node update \
--availability active \
--label-add reserved=true \
manager-node
# 使用本地卷
docker service create \
--name app \
--mount type=volume,src=app-data,dst=/app/data \
my-app结语
Docker Swarm 是一个轻量级、易于上手的容器编排工具,非常适合中小型集群部署。通过本文的学习,你已经掌握了:
- 集群初始化:Manager 和 Worker 节点配置
- 服务部署:创建、配置、扩展服务
- 负载均衡:内置负载均衡和服务发现
- 滚动更新:安全的版本升级和回滚
- 故障恢复:高可用性配置和自动恢复
- 节点管理:标签、约束、资源限制
推荐阅读:
🚀 提示: 在生产环境中,建议使用至少 3 个 Manager 节点来保证高可用性,并定期备份 Swarm 配置。同时,结合监控工具实时追踪集群状态。
延伸阅读
免责声明
本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。