一、Docker Swarm 概述
Docker Swarm 是 Docker Engine 原生内置的轻量级容器编排引擎,自 Docker 1.12 版本起深度集成,无需额外安装 Consul、etcd 等第三方组件,即可实现集群管理、服务调度、故障自愈、负载均衡等编排能力。
相比 Kubernetes,Swarm 部署门槛低、操作简单、与 Docker 命令体系高度兼容,非常适合作为容器编排技术的入门方案,也适用于小规模生产环境、开发测试集群场景。
二、核心概念
2.1 Swarm 集群
由多台运行 Docker Engine 的主机通过网络组成的协同工作集合。集群对外表现为统一的资源池,用户只需声明应用的期望状态(副本数、资源、端口等),由集群自动完成调度、部署和运维,而非手动指定应用运行在哪台服务器。
集群能力核心价值:
- 高可用:节点故障时自动迁移服务
- 负载均衡:多副本分摊流量
- 弹性伸缩:根据负载动态调整副本数量
2.2 节点(Node)
集群中的每一台 Docker 主机都是一个节点,分为两类角色:
- Manager 节点:负责集群管理、编排调度、维护服务的期望状态。多 Manager 节点通过 Raft 共识算法选举 Leader,保证集群高可用。
- Worker 节点:接收 Manager 派发的任务,运行服务容器,并定期向 Manager 上报自身状态与任务运行状态。
默认配置下 Manager 节点同时兼任 Worker 角色,也可配置为专职管理模式,不再运行业务容器。
2.3 服务(Service)
Swarm 编排的最小单位,定义了应用运行的期望状态,包括镜像、副本数量、端口映射、资源限制等。 Swarm 的核心编排逻辑就是持续调谐:不断对比实际状态与期望状态,自动修复偏差,保证服务始终符合定义。
2.4 副本(Replica)
服务的单个运行实例(对应一个容器)。一个服务可以有多个副本,分布式调度在不同 Worker 节点上。
三、Swarm 集群搭建
3.1 环境规划
| 节点角色 | 主机名 | IP 地址 |
|---|---|---|
| Manager | swarm-manager | 192.168.108.30 |
| Worker | swarm-worker1 | 192.168.108.31 |
| Worker | swarm-worker2 | 192.168.108.32 |
- 操作系统:CentOS Stream 8
- Docker 版本:≥ v1.12
- 前置要求:所有节点网络互通
3.2 节点前置配置(所有节点执行)
配置防火墙为信任域,保证集群通信端口互通:
firewall-cmd --set-default-zone=trusted
3.3 初始化集群(Manager 节点执行)
docker swarm init --advertise-addr 192.168.108.30
--advertise-addr:指定集群内通信的本机地址
命令输出包含三类信息:
- 集群创建成功,当前节点成为 Manager Leader
- Worker 节点加入集群的完整命令
- Manager 节点加入集群的完整命令
查看当前节点状态:
docker node ls
3.4 Worker 节点加入集群
如果丢失了加入命令,可在 Manager 节点重新获取:
# 获取 Worker 加入令牌
docker swarm join-token worker
在两个 Worker 节点分别执行加入命令:
docker swarm join --token SWMTKN-1-xxxx 192.168.108.30:2377
加入完成后,在 Manager 节点验证集群状态:
docker node ls
三个节点状态均为 Ready、Active,代表集群搭建完成。
四、Service 服务部署
4.1 创建服务
docker service create --name web_server httpd:latest
--name web_server:定义服务名称httpd:latest:服务使用的镜像
4.2 查看服务状态
# 查看服务列表
docker service ls
REPLICAS 列格式为 期望副本数/运行副本数,例如 1/1 代表 1 个副本全部正常运行。
查看副本的节点分布与运行状态:
docker service ps web_server
4.3 本地验证
在副本所在的 Worker 节点查看运行中的容器:
docker ps
五、服务伸缩(Scale)
5.1 扩容服务
将服务副本数扩容至 5 个:
docker service scale web_server=5
Swarm 会自动根据各节点资源情况,将副本均匀调度到集群节点上。
5.2 缩容服务
将副本数缩减至 3 个:
docker service scale web_server=3
5.3 Manager 节点业务排空
默认 Manager 节点也会运行业务副本。若希望 Manager 专职负责集群管理,可排空节点上的业务容器:
docker node update --availability drain swarm-manager
drain状态:节点不再接收新的调度任务,现有副本会逐步迁移到其他健康节点- 适用于 Manager 角色隔离、节点维护升级等场景
恢复节点调度能力:
docker node update --availability active swarm-manager
六、故障转移(Failover)
Swarm 内置自愈机制:当节点发生故障,Manager 检测到节点离线后,会自动将故障节点上的服务副本调度到其他健康节点,始终维持服务的期望副本数。
6.1 模拟节点故障
在 swarm-worker1 上执行关机,模拟节点宕机:
shutdown now
6.2 观察自愈效果
在 Manager 节点查看节点状态,swarm-worker1 状态变为 Down:
docker node ls
查看服务副本状态:
docker service ps web_server
可以观察到:
- 原故障节点上的副本状态标记为
Shutdown - 在其他健康节点上自动启动了新的副本
- 服务总副本数始终维持在期望值
七、服务网络与外部访问
7.1 默认访问限制
默认创建的 Service 仅具备容器内部 IP,没有映射主机端口,只能在 Docker 主机本地通过容器 IP 访问,无法对外提供服务。
7.2 发布服务端口
创建服务时指定端口映射,将服务暴露到主机:
# 新建服务时发布端口
docker service create --name web_server --publish 8080:80 --replicas=2 httpd:latest
# 为已有服务添加端口发布
docker service update --publish-add 8080:80 web_server
将容器内的 80 端口映射到主机的 8080 端口。
7.3 Routing Mesh(路由网格)
Swarm 的核心网络特性:访问集群中任意一个节点的发布端口,都可以正常访问到服务。
原理:
- Swarm 自动创建
ingressoverlay 跨主机网络,实现不同节点上的容器互通 - 所有节点都会监听已发布的端口
- 请求到达任意节点后,内置路由网格会自动转发到健康的服务副本
- 即使当前节点上没有运行该服务的副本,也能完成转发
验证效果:
# 三个节点的 8080 端口均可访问服务
curl http://192.168.108.30:8080
curl http://192.168.108.31:8080
curl http://192.168.108.32:8080
7.4 集群网络说明
| 网络名称 | 类型 | 作用 |
|---|---|---|
| ingress | overlay | 跨节点容器通信,支撑路由网格与服务发布 |
| docker_gwbridge | bridge | 容器访问外网的网关桥 |
| host | host | 共享主机网络栈 |