Docker Swarm本质是主从架构,但通过≥3个Manager节点(Raft共识)、Weave Net替代overlay、自治调度与平权运维,可构建无单点故障、节点地位平等、故障自动绕行的去中心化高可用集群。

明确角色边界:Manager 不是“中心”,而是“共识节点”
Swarm 的管理节点集群基于 Raft 共识算法运行,3 个及以上 Manager 节点构成一个分布式状态数据库。没有“主节点”概念,只有临时 Leader;Leader 故障后,其余 Manager 自动选举新 Leader,整个过程秒级完成,服务调度不受影响。因此,只要部署 ≥3 个 Manager(奇数),集群控制面天然具备去中心化韧性。
- 所有 Manager 节点都保存完整集群状态,可独立响应 API 请求
- Worker 节点只执行任务,不参与决策,也不依赖某一个 Manager —— 它们会自动连接任一可用 Manager
- 节点加入时使用通用 join token,无需指定特定 Manager 地址(Swarm 自动发现)
用 Weave Net 替代默认 overlay 网络,实现真去中心化通信
Docker 原生 overlay 网络依赖 KV 存储(如 etcd)或内置的 Raft,仍需 Manager 协调;而 Weave Net 是纯对等(peer-to-peer)网络:每个节点运行一个 weaver 进程,节点间自动建立加密隧道,形成覆盖网络。它不依赖任何中心组件,增删节点完全自治。
- 在所有节点(含 Manager 和 Worker)执行:
docker plugin install weaveworks/net-plugin:latest_release - 设置统一密码启用加密:
docker plugin set weaveworks/net-plugin:latest_release WEAVE_PASSWORD=your_secret - 创建网络时指定驱动:
docker network create --driver weave mynet - 容器跨主机通信直接通过服务名解析,Weave 内置 DNS 自动同步,无需 Swarm 内置 DNS 或外部注册中心
服务部署策略:消除人为调度偏见,交由 Swarm 自治
避免用 placement 约束把服务“钉死”在某些节点,否则会人为制造中心依赖。应让 Swarm 调度器根据资源、标签、健康状态自动分发任务。
- 用
replicated模式 + 明确副本数(如replicas: 5),而非 global 模式(除非确实需要每节点一份) - 禁用硬性约束(如
node.role==manager),改用软性标签(如node.labels.disk=ssd)辅助调度 - 为关键服务配置健康检查和重启策略,确保异常容器被自动重建并可能调度到其他节点
运维与可观测性:所有节点平权接入,不依赖单一入口
高可用网络拓扑的价值,最终要体现在日常运维中。确保任意节点都能承担管理、监控、排障职责。
- Portainer 或 Docker CLI 可连接任一 Manager 节点执行操作,命令效果全局一致
- 日志集中采集(如用 Fluentd + Loki)时,Agent 部署在所有节点,不设中心 Collector
- 指标采集(Prometheus)采用服务发现模式自动发现所有节点上的 cAdvisor 或 node-exporter,无需手动维护 target 列表


















