使用 Docker 内置 Swarm 模式搭建高可用容器调度平台的核心是构建多 Manager 节点的容错集群,依托 Raft 协议实现状态同步,3 个 Manager 可容忍 1 台宕机;需准备至少 3 台服务器(推荐 3 Manager + 2 Worker),安装 Docker Engine 20.10+,配置主机名解析、开放 2377/7946/4789 端口,并通过 docker swarm init 和 docker swarm join --token(区分 Manager/Worker token)完成集群初始化与节点加入,最后用 docker stack deploy 部署带滚动更新的多副本服务。

用 Docker 内置 Swarm 模式搭高可用容器调度平台,核心是构建多 Manager 节点的容错集群,而非单点管理。它不依赖 Kubernetes 等外部工具,靠 Raft 协议同步状态,3 个 Manager 就能容忍 1 台宕机,适合中小规模生产环境。
准备节点与网络
至少准备 3 台服务器(推荐 3 Manager + 2 Worker),全部安装 Docker Engine(20.10+)。确保:
- 各节点时间同步(如用 chrony)
- /etc/hosts 或 DNS 配置正确,主机名可互相解析
- 开放必要端口:2377/tcp(集群管理)、7946/tcp+udp(节点通信)、4789/udp(overlay 网络)
- 每台机器设置唯一主机名,例如:
hostnamectl set-hostname manager1
初始化高可用 Manager 集群
在首台机器(如 manager1)执行初始化,并明确指定本机 IP:
docker swarm init --advertise-addr 192.168.1.10 --listen-addr 192.168.1.10:2377
命令成功后,会输出两行 join 命令——一行用于添加 Worker,另一行专用于添加额外 Manager。务必分别保存。
在 manager2 和 manager3 上,使用 Manager 专属 token 加入(不是 Worker 的):
docker swarm join --token SWMTKN-1-xxx-manager-token 192.168.1.10:2377
加入时需加 --advertise-addr 参数指定本机 IP(如 --advertise-addr 192.168.1.11),否则其他节点无法反向连接。
在任一 Manager 上运行 docker node ls,确认所有 Manager 显示 Leader 或 Reachable,状态为 Ready 且 Active。
添加并验证 Worker 节点
在 worker1、worker2 等机器上,执行初始化时输出的 Worker token 命令:
docker swarm join --token SWMTKN-1-xxx-worker-token 192.168.1.10:2377
无需指定 --advertise-addr(默认自动探测),但确保其网络可达。加入后,docker node ls 中对应节点角色应为 Worker,状态为 Ready。
可临时下线一个 Worker 测试容错性:docker node update --availability drain worker1,观察服务是否自动迁移至其余 Worker。
部署带滚动更新的多服务应用
编写 docker-compose.yml(v3.8 格式),定义 web、db、cache 等服务,并启用高可用配置:
version: '3.8'
services:
web:
image: nginx:alpine
deploy:
replicas: 3
restart_policy:
condition: on-failure
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
ports:
- "80:80"
在 Manager 节点执行:
docker stack deploy -c docker-compose.yml myapp
Swarm 自动创建网络、分配任务、启用 Ingress 路由网格——任意节点 IP:80 均可访问负载均衡后的 web 服务。后续修改配置只需重新运行该命令,Swarm 按设定策略滚动更新。











