在掌握了 Docker 安装、镜像管理与基本容器操作之后,实际上只是具备了管理单一 Docker 主机上容器的能力。随着服务规模扩大,单节点能力已无法满足生产要求,此时就需要集群化容器管理与调度方案——Docker Swarm 正是官方为实现生产级容器编排而设计的核心组件。

Docker Swarm 是由 Docker 官方实现的原生集群管理与容器编排工具,可以将多台 Docker 主机(节点)统一为一个虚拟的、高可用的集群平台。Swarm 主要具备以下核心能力:
Docker Swarm 和 Kubernetes 都是主流的容器编排平台。Kubernetes 功能更为丰富,适合大规模复杂场景;而 Swarm 以其简单易用、轻量级和与 Docker 生态的高度集成,对中小型项目和快速试点场景尤为友好。
一个 Swarm 集群由多个 Docker 节点组成,这些节点可部署于物理服务器、虚拟机或其他具备 Docker 支持的计算资源。只要 Docker 安装完毕且节点网络可互通,即可加入集群。
Swarm 节点按照职责分为两类:
所有集群配置与元数据均存储在管理节点内嵌的分布式数据库(Raft store)中并自动同步,免去用户额外的存储配置和维护负担。
在安全性方面,Swarm 默认启用 TLS 加密保护节点间通信,并具备自动证书和密钥轮换机制,为企业级场景提供可靠的数据和传输安全保障。
Swarm 的调度核心为服务(Service)。服务将应用容器以期望副本数、高可用、健康检查、弹性伸缩等策略进行声明式管理,实现自动化部署、升级和自愈。
让我们动手来创建一个包含 3 个管理者和 3 个工作节点的 Swarm 集群。
为了在本地模拟多台服务器,我们推荐使用 Multipass 这个免费工具。它能让你轻松创建多个 Docker 虚拟机。
multipass launch docker --name <vm-name>multipass lsmultipass shell <vm-name>如果你无法使用 Multipass,也可以使用 Play with Docker 网站提供的在线实验环境。关键在于,你需要准备多个安装了 Docker 并且网络互通的节点。
部署 Swarm 集群的流程非常标准,通常包括初始化管理节点、获取并分发加入令牌、节点加入、及集群状态验证:
Step 1:初始化第一个管理节点
登录至第一个管理节点(如 mgr1),执行以下初始化命令(请将 10.0.0.1 替换为实际节点的 IP 地址):
|$ docker swarm init --advertise-addr 10.0.0.1 Swarm initialized: current node (d21lyz...) is now a manager. ...
上述命令会在当前主机上初始化 Swarm,--advertise-addr 参数指定了节点间通信使用的接口地址。
Step 2:获取节点加入令牌
在 mgr1 上分别执行如下命令,获取加入集群所需的令牌及完整指令:
至此,我们已成功构建包含 3 个管理节点与 3 个工作节点的 Swarm 集群,具备基础的容器集群编排能力和高可用保障。
采用多管理节点部署的主要目的是实现高可用性(High Availability, HA)。Swarm 集群采用 Raft 一致性协议,其中管理节点分为 Leader(主)与 Follower(从),仅有一位 Leader 负责实际决策和集群指令下发,其他管理节点作为热备,保证故障切换和配置一致性。
在生产环境中,务必部署奇数个管理节点(一般为 3 或 5),以防止因网络分裂导致的“脑裂(split-brain)”问题。奇数节点方案可确保任一时刻集群都能形成合法的多数派选举,稳定维持集群服务与数据一致性。
尽管 Swarm 默认已经非常安全,但为了防止因旧的管理者节点重启或从不安全的备份恢复而导致集群信息泄露,Docker 提供了一个自动锁定 (Autolock) 功能。
启用该功能后,任何重启的管理者节点都必须提供一个特殊的“解锁密钥”才能重新归队,就像一个需要密码才能打开的保险箱。
|# 在管理者节点上启用自动锁定 $ docker swarm update --autolock=true Swarm updated. To unlock a swarm manager after it restarts, run the `docker swarm unlock` command and provide the following key: SWMKEY-1-XDeU3XC75Ku7rvGXixJ0V7evhDJGvIAvq0D8VuEAEaw Please remember to store this key in a password manager...
请务-必-保-存-好这个解锁密钥!一旦丢失,你将无法让重启的管理者节点重新加入集群。
现在我们已经搭建好高可用的 Swarm 集群,可以进行服务的部署与编排。在 Swarm 架构中,应用的运行与调度通过服务(Service)进行声明式管理。 每个服务定义了应用所需的镜像、副本数、端口映射以及其他运行参数,其核心目标为确保系统始终处于期望状态(Desired State)。Swarm 会根据设定的期望状态,自动进行任务调度和副本维护。 一旦某个实例故障,Swarm 能立即检测并补齐副本,实现自愈(Self-healing) 能力,提升系统的可用性和稳定性。
我们可以用 docker service create 命令来创建一个服务。
|$ docker service create --name web-fe \ -p 8080:8080 \ --replicas 5 \ nigelpoulton/ddd-book:web0.1
这个命令的意思是:
web-fe 的服务。8080 端口映射到服务容器的 8080 端口。--replicas 5 指定我们期望运行 5 个副本(容器)。创建服务后,你可以随时查看它的状态,并根据业务需求动态调整副本数量。
|# 查看正在运行的服务列表 $ docker service ls # 查看服务的详细任务列表(每个副本的运行状态) $ docker service ps web-fe # 将服务从 5 个副本扩展到 10 个 $ docker service scale web-fe=10 # 业务低谷时,再缩减回 5 个 $ docker service scale web-fe=5
这种弹性伸缩的能力,正是 Swarm 作为编排工具的核心价值之一。
应用更新是常有的事。在过去,这常常意味着停机和加班。但在 Swarm 中,我们可以轻松实现零停机滚动更新 (Rolling Update)。
假设我们的网站发布了新版本,打包成了 web0.2 镜像。我们可以这样更新服务:
|$ docker service update \ --image nigelpoulton/ddd-book:web0.2 \ --update-parallelism 2 \ --update-delay 20s \ uber-svc
这个命令告诉 Swarm:
uber-svc 服务的镜像更新为 web0.2。--update-parallelism 2 表示每次只更新 2 个副本。--update-delay 20s 表示每批更新之间,等待 20 秒。Swarm 会像一位经验丰富的外科医生一样,小心翼翼地、分批次地替换掉旧的容器,直到所有副本都更新到新版本。整个过程中,服务始终在线,用户几乎无法察觉到后台正在进行一场“大换血”。
docker service logs <service-name> 来查看一个服务所有副本的日志,这对于排查问题非常有用。/var/lib/docker/swarm 目录中。在极端情况下(比如整个集群损坏),你可以通过备份这个目录来恢复整个 Swarm 的状态。这是一个高风险操作,通常只在灾难恢复时使用。强烈建议将应用配置以代码的形式存储在版本控制系统中,这比依赖物理备份更可靠。Docker Swarm 是 Docker 官方提供的容器编排工具,它将多台 Docker 主机组成一个集群,实现了应用的自动化部署、弹性伸缩和高可用管理。 虽然在功能深度上不如 Kubernetes,但 Swarm 以其简洁的设计、极低的上手门槛和与 Docker 生态的无缝集成,成为了许多项目理想的“容器舰队总指挥”。
为了方便你快速回顾,这里整理了本部分中最重要的几个命令:
# 获取工作节点加入 Swarm 的令牌及指令
$ docker swarm join-token worker
# 获取管理节点加入 Swarm 的令牌及指令
$ docker swarm join-token manager注意:每个加入令牌(SWMTKN...)均应妥善保管,仅用于受信节点。
Step 3:工作节点加入集群
登录目标工作节点(如 wrk1),运行由 Step 2 得到的对应 worker 指令:
|$ docker swarm join --token <worker-token> 10.0.0.1:2377 This node joined a swarm as a worker.
对其余工作节点(如 wrk2、wrk3)重复此操作。
Step 4:管理节点扩容
登录后续管理节点(如 mgr2、mgr3),使用 Step 2 获得的 manager 指令加入集群,实现多管理节点部署。
Step 5:验证集群状态
在任一管理节点上执行以下命令查看集群成员和状态:
|$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 0g4rl...babl8 * mgr2 Ready Active Reachable 2xlti...l0nyp mgr3 Ready Active Reachable d21ly...9qzkx mgr1 Ready Active Leader 8yv0b...wmr67 wrk1 Ready Active 9mzwf...e4m4n wrk3 Ready Active e62gf...l5wt6 wrk2 Ready Active
其中 MANAGER STATUS 一列标示 Leader(主管理者)与 Reachable(高可用候选),无状态则为普通工作节点。