Kubernetes 之外,Docker 官方自带内置编排器——Swarm 模式(Swarm Mode)。不需要额外组件,docker swarm init 一条命令就能把多台 Docker 主机编成一个集群,获得 Service 调度、滚动更新、负载均衡与内置 Secrets。对于中小规模、想"够用就好"的团队,Swarm 是比 K8s 更轻的编排选择。本指南从集群搭建到生产运维完整讲透。
关键概念:Swarm 把一组 Docker 主机抽象为一个集群,角色分 Manager(管理面 + 可选调度)与 Worker(执行面)。你声明"我要 3 个副本",Swarm 负责把它们调度到可用节点、健康自愈、对外负载均衡。
1. Swarm 模式与节点角色
1.1 集群拓扑
Swarm 集群结构:
Manager(管理节点):
- 维护集群状态(Raft 共识)
- 接收服务声明、做调度决策
- 也可作为 Worker 跑任务(可选)
Worker(工作节点):
- 只执行被调度的任务
- 不参与管理面
高可用:
多个 Manager(奇数个,3 或 5)用 Raft 选主
Manager 挂了会自动切换,集群不中断
1.2 初始化与加入集群
# 第一台主机(Manager)初始化
docker swarm init --advertise-addr 192.168.1.10
# 得到加入 token,其他主机加入:
# Worker 加入
docker swarm join --token WORKER_TOKEN 192.168.1.10:2377
# 或 Manager 加入
docker swarm join --token MANAGER_TOKEN 192.168.1.10:2377
# 查看节点状态
docker node ls
2. Service:Swarm 的编排单元
2.1 创建与伸缩服务
# 创建服务:3 个副本,端口 8080 暴露
docker service create \
--name web \
--replicas 3 \
--publish published=8080,target=80 \
nginx:alpine
# 查看服务与任务
docker service ls
docker service ps web # 每个任务的调度与状态
# 扩容/缩容
docker service scale web=5
关键概念:
Service = 声明式服务定义(镜像、副本、端口、环境)
Task = 一个副本的调度单元(一个容器)
Swarm 保证"期望副本数"永远被满足
→ 节点挂了,自动在健康节点重建 Task
2.2 服务更新与回滚
# 滚动更新镜像(update-config:并行度与失败动作)
docker service update \
--image web:2.0 \
--update-parallelism 1 \
--update-delay 5s \
--update-failure-action rollback \
web
# 手动回滚
docker service rollback web
# 更多更新选项:
# --update-order start-first / stop-first(先起后停)
# --update-monitor 30s(每批健康检查窗口)
ℹ️ 核心:Swarm 的滚动更新内置并行度 + 延迟 + 失败自动回滚,配合健康检查,让发布风险可控。这通常是把"手工 docker run 重启"升级为"编排发布"的第一步。
3. Secrets 与 Configs
3.1 Secret:敏感信息的内置管理
# 创建 secret(Swarm 加密存储、仅授予需要的服务)
printf "db-pass-2026" | docker secret create db_pass -
# 挂载到服务(以只读文件形式出现在容器内)
docker service create \
--name db \
--secret db_pass \
postgres:16
# 容器内:/run/secrets/db_pass
# Swarm 用 TLS 加密把 secret 传给需要它的节点,避免明文躺在节点上
3.2 Config:非敏感配置
# 与 secret 类似但非加密,用于配置文件/非敏感参数
docker config create nginx.conf ./nginx.conf
docker service create \
--name web \
--config source=nginx.conf,target=/etc/nginx/nginx.conf \
nginx:alpine
对比:
Secret → 敏感(密钥、密码),加密、最小授权
Config → 非敏感(配置),明文可共享
两者都支持"更新不重建镜像",容器只读挂载
4. 负载均衡与网络
4.1 ingress 负载均衡
Swarm 内置 ingress 网络:
--publish published=8080,target=80
→ 集群内任何节点访问 8080 都会负载均衡到 3 个副本
特性:
- 从任意节点入口都可达(Routing Mesh)
- 副本分布在多个节点 → 单点故障不影响
- 基于 IPVS/iptables 做 L4 转发
4.2 服务间通信(overlay 网络)
# 创建 overlay 网络,服务可互相发现
docker network create --driver overlay mynet
docker service create --name api --network mynet --replicas 3 ...
docker service create --name front --network mynet ...
# front 用 DNS 名 "api" 即可访问(内置服务发现)
5. 高可用与故障转移
5.1 节点故障自愈
场景:Worker 节点宕机
Swarm 检测到节点失联 → 把它上的 Task 视为失败
→ 在其他健康节点重建,保持期望副本数
Manager 高可用:
- 多个 Manager 用 Raft 保持状态一致
- Manager 故障自动选主(quorum 要求多数存活)
- 生产建议:3 或 5 个 Manager
5.2 约束与放置策略
# 用标签约束任务落在特定节点
docker node update --label-add ssd=true worker-1
docker service create \
--name cache \
--constraint node.labels.ssd==true \
redis:7
放置维度:
- node.labels:按标签(硬件/机房)
- placement.preferences:按偏好分散(如按机架)
- constraint:硬性约束
用于:把有状态任务放到有 SSD 的节点、跨机架分散副本
6. 集群排障与运维
常见排查:
docker service ls / ps 看服务与任务状态
docker service logs web 看日志
docker node ls 看节点健康
docker network ls 看网络
docker node inspect 看节点资源
备份:
- 管理面状态需要备份(/var/lib/docker/swarm)
- 用 docker swarm 导出/导入或定期快照
升级:
- 先升 Manager 再升 Worker
- 注意 API 兼容(跨大版本谨慎)
# 服务日志(不带 -f 看历史)
docker service logs --tail 50 web
7. Swarm vs Kubernetes:怎么选
对比:
维度 Swarm K8s
复杂度 低(内置、命令少) 高(组件多、概念多)
扩展性 中小规模够用 大规模、生态丰富
存储 Volume/插件 完整 CSI
服务网格 - Istio/Linkerd
Operator/CRD - 成熟
社区与招聘 较少 主流
选型建议:
- 团队小、编排需求简单 → Swarm 更快上手
- 需要完整云原生生态 → K8s
- Swarm 到 K8s:概念迁移平缓(Service/副本/滚动更新相通)
8. 最佳实践清单
□ 生产用 3/5 个 Manager 保障 Raft 高可用
□ Service 声明副本数,别手工 docker run
□ 滚动更新设 parallelism/delay/failure-action=rollback
□ 敏感信息用 Secret,非敏感用 Config
□ 用 overlay 网络做服务发现,别硬编码 IP
□ 用 node labels + constraint 控制放置
□ 定期检查 docker service ls / node ls 健康
□ 备份 Swarm 管理面状态
□ 升级先 Manager 后 Worker,跨大版本谨慎
一句话原则
Swarm 把多台 Docker 变成"声明式编排集群",
复杂度低于 K8s,却拥有调度、更新、均衡、自愈全套能力。
小结
Docker Swarm 集群编排让团队用最小的学习成本获得编排能力:swarm init/join 搭集群、service create/scale/update 做声明式发布、内置 Secret/Config 管配置、ingress + overlay 网络做均衡与服务发现、多 Manager 保高可用。落地记住五件事:Manager/Worker 角色与 3/5 奇数 Manager 高可用、Service 声明副本数靠调度自愈、滚动更新配 rollback、Secret/Config 与 overlay 网络内置、需要云原生生态再上 K8s。当部署从"手动起容器"升级为"声明期望状态、Swarm 自动达成",中小团队的交付稳定性和运维效率就迈上了新的台阶。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。