如何使用 docker swarm leave 命令移除节点

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何使用 docker swarm leave 命令管理 Docker Swarm 中的节点。你将首先初始化一个 Docker Swarm 并将一个工作节点加入其中。随后,你将练习从 Swarm 中移除该工作节点。最后,你将探索移除管理节点的过程,包括使用强制选项的必要性。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/SystemManagementGroup -.-> docker/info("Display System-Wide Information") docker/SystemManagementGroup -.-> docker/version("Show Docker Version") subgraph Lab Skills docker/ls -.-> lab-555243{{"如何使用 docker swarm leave 命令移除节点"}} docker/ps -.-> lab-555243{{"如何使用 docker swarm leave 命令移除节点"}} docker/info -.-> lab-555243{{"如何使用 docker swarm leave 命令移除节点"}} docker/version -.-> lab-555243{{"如何使用 docker swarm leave 命令移除节点"}} end

初始化 Docker 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 已在该节点上成功初始化。

将工作节点加入 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 中移除。要让工作节点退出 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

在上一步中,我们成功地将一个工作节点从 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 管理节点。

强制管理节点退出 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。