简介
在这个实验中,你将学习如何使用 docker swarm leave
命令管理 Docker Swarm 中的节点。你将首先初始化一个 Docker Swarm 并将一个工作节点加入其中。随后,你将练习从 Swarm 中移除该工作节点。最后,你将探索移除管理节点的过程,包括使用强制选项的必要性。
在这个实验中,你将学习如何使用 docker swarm leave
命令管理 Docker Swarm 中的节点。你将首先初始化一个 Docker Swarm 并将一个工作节点加入其中。随后,你将练习从 Swarm 中移除该工作节点。最后,你将探索移除管理节点的过程,包括使用强制选项的必要性。
在这一步中,你将学习如何初始化一个 Docker Swarm。Docker Swarm 是一组以 Swarm 模式运行的 Docker 主机集群。Swarm 模式使你能够将一组 Docker 节点作为一个单一的虚拟系统进行管理。
在初始化 Swarm 之前,让我们检查一下 LabEx 虚拟机上当前安装的 Docker 版本。
docker version
你应该会看到类似以下的输出,表明 Docker 版本为 20.10.21:
Client: Docker Engine - Community
Version: 20.10.21
API version: 1.41
Go version: go1.18.9
Git commit: baedd2a
Built: Tue Oct 25 17:58:10 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.21
API version: 1.41 (minimum version 1.12)
Go version: go1.18.9
Git commit: 305620d
Built: Tue Oct 25 17:56:51 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.10
GitCommit: b4bd567ea6c98e7b5d78a23676a0a79559d930d5
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
要初始化一个 Docker Swarm,你可以使用 docker swarm init
命令。这个命令会将当前的 Docker 主机转变为一个 Swarm 管理器。
docker swarm init
运行该命令后,你会看到输出表明 Swarm 已初始化,并提供一个将其他节点作为工作节点加入的命令。输出会类似于以下内容:
Swarm initialized: current node (xxxxxxxxxxxx) is now a manager.
To add a worker to this swarm, run the following command on the worker node:
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 172.17.0.2:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
输出显示当前节点现在是一个 Swarm 管理器。它还提供了将工作节点加入此 Swarm 的命令。我们将在下一步使用这个命令。
你可以使用 docker info
命令验证 Swarm 的状态。
docker info
在输出中查找“Swarm”部分。它应该表明 Swarm 处于“active”状态。
...
Swarm: active
NodeID: xxxxxxxxxxxx
Is Manager: true
ClusterID: xxxxxxxxxxxx
Managers: 1
Nodes: 1
Orchestration:
TaskHistoryRetentionLimit: 5
Raft:
HeartbeatInterval: 100ms
ElectionTimeout: 3s
SnapshotInterval: 500ms
Dispatcher:
HeartbeatPeriod: 5s
CA configuration:
Expiry duration: 3 months
Force rotate at: 7 weeks
Root Rotation: false
Local Node State: active
Error: none
Remote Manager:
ID: xxxxxxxxxxxx
Addr: 172.17.0.2:2377
Addr: 172.17.0.2:2377
Node Address: 172.17.0.2
Manager Status:
Cluster Address: 172.17.0.2:2377
Leader: Yes
Reachability: Reachable
...
这证实了 Docker Swarm 已在该节点上成功初始化。
在上一步中,我们初始化了一个 Docker Swarm,并且输出提供了一个将工作节点加入的命令。在实际场景中,你会在想要作为工作节点添加到 Swarm 的另一台机器上执行此命令。然而,由于我们使用的是单台 LabEx 虚拟机,我们将通过在同一台机器上使用加入命令来模拟加入工作节点。
首先,让我们获取工作节点的加入命令。你可以在管理节点(即我们当前的虚拟机)上运行 docker swarm join-token worker
来获取加入令牌和命令。
docker swarm join-token worker
输出将类似于以下内容:
To add a worker to this swarm, run the following command on the worker node:
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 172.17.0.2:2377
从输出中复制完整的 docker swarm join --token ...
命令。此命令包含唯一的令牌以及 Swarm 管理器的 IP 地址和端口。
现在,执行复制的命令,将当前节点作为工作节点加入 Swarm。
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 172.17.0.2:2377
将令牌和 IP 地址替换为你从 docker swarm join-token worker
命令中获取的值。
你应该会看到表明该节点已作为工作节点加入 Swarm 的输出:
This node joined a swarm as a worker.
要验证该节点是否已加入 Swarm,你可以从管理节点的角度列出 Swarm 中的节点。由于我们的单台虚拟机同时充当管理节点和工作节点,我们可以使用 docker node ls
命令。
docker node ls
输出将显示 Swarm 中的节点。你应该会看到同一节点 ID 有两条记录,一条状态为“Ready”且角色为“Manager”,另一条状态为“Ready”且角色为“Worker”。
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xxxxxxxxxxxx * labex-vm Ready Active Leader 20.10.21
xxxxxxxxxxxx labex-vm Ready Active 20.10.21
这证实了该节点已成功作为工作节点加入 Swarm。
在上一步中,我们成功地将节点作为工作节点加入了 Swarm。现在,我们将学习如何将节点从 Swarm 中移除。要让工作节点退出 Swarm,你可以使用 docker swarm leave
命令。
执行以下命令,让当前节点作为工作节点退出 Swarm:
docker swarm leave
你应该会看到表明该节点已退出 Swarm 的输出:
Node left the swarm.
现在,让我们验证该节点是否已退出 Swarm。我们可以再次使用 docker node ls
命令。不过,由于该节点已经退出了 Swarm,在这个节点上运行 docker node ls
会导致错误,因为它不再是 Swarm 的一部分。
docker node ls
你会看到类似以下的错误消息:
Error: This node is not a swarm manager. Use "docker swarm join" to join the swarm and try again.
这个错误证实了该节点不再是 Swarm 的一部分。
为了进一步验证,让我们使用 docker info
检查 Swarm 的状态。
docker info
输出中的“Swarm”部分现在应该表明 Swarm 处于“inactive”状态。
...
Swarm: inactive
...
这证实了该节点已成功退出 Docker Swarm。
在上一步中,我们成功地将一个工作节点从 Swarm 中移除。现在,让我们看看当我们尝试使用相同的 docker swarm leave
命令且不添加任何额外选项来移除管理节点时会发生什么。
执行以下命令,尝试让管理节点退出 Swarm:
docker swarm leave
你会收到类似以下的错误消息:
Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Use the --force flag to force the node to leave the swarm. Note that this may disrupt the swarm, so use this option with caution.
此错误消息表明,你不能在不明确使用强制选项的情况下让管理节点简单地退出 Swarm。这是一种安全机制,用于防止意外破坏 Swarm,特别是在多管理节点的设置中。
要确认该节点仍然是管理节点且是 Swarm 的一部分,你可以使用 docker info
命令。
docker info
“Swarm”部分应该仍然显示“active”和“Is Manager: true”。
...
Swarm: active
NodeID: xxxxxxxxxxxx
Is Manager: true
...
这证实了不使用强制选项让节点退出 Swarm 的尝试未成功,该节点仍然是 Swarm 管理节点。
在上一步中,我们了解到管理节点不使用 --force
标志就无法退出 Swarm,这是为了防止意外破坏 Swarm。在这一步中,我们将使用 --force
标志让管理节点退出 Swarm。
重要提示:强制管理节点退出 Swarm 可能会破坏 Swarm,尤其是当它是最后一个管理节点时。在生产环境中请谨慎使用此命令。
执行以下命令,强制管理节点退出 Swarm:
docker swarm leave --force
你应该会看到表明该节点已退出 Swarm 的输出:
Node left the swarm.
现在,让我们验证该节点是否已成功退出 Swarm。我们可以使用 docker info
命令。
docker info
输出中的“Swarm”部分现在应该表明 Swarm 处于“inactive”状态。
...
Swarm: inactive
...
这证实了管理节点已通过使用 --force
标志成功退出 Docker Swarm。此节点上的 Swarm 已不复存在。
在本次实验中,我们学习了如何使用 docker swarm init
命令初始化 Docker Swarm,该命令会将当前节点指定为管理节点,并提供其他节点加入 Swarm 的命令。随后,我们练习了将一个工作节点加入到新创建的 Swarm 中。
接着,我们探讨了如何使用 docker swarm leave
命令从 Swarm 中移除节点,首先展示了工作节点如何退出 Swarm。然后,我们尝试在不使用强制选项的情况下,在管理节点上使用相同的命令,发现默认情况下这是不允许的。最后,我们使用 --force
标志成功地强制一个管理节点退出了 Swarm。