如何使用 docker node rm 命令从 Swarm 中移除节点

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 docker node rm 命令管理 Docker Swarm 中的节点。你将从列出 Swarm 中现有的节点开始,以便识别它们。然后,你将尝试移除一个正在运行的节点,以了解该命令的默认行为和限制。

接下来,你将探索如何成功地从 Swarm 中移除一个已停止的节点。最后,你将学习如何强制移除一个无法访问的节点,这对于处理节点无法再访问的场景至关重要。这种实践经验将为你维护 Docker Swarm 集群提供实用的知识。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") subgraph Lab Skills docker/ls -.-> lab-555185{{"如何使用 docker node rm 命令从 Swarm 中移除节点"}} docker/ps -.-> lab-555185{{"如何使用 docker node rm 命令从 Swarm 中移除节点"}} docker/rm -.-> lab-555185{{"如何使用 docker node rm 命令从 Swarm 中移除节点"}} end

列出 Swarm 中的现有节点

在这一步中,你将学习如何列出当前属于 Docker Swarm 的节点。在列出节点之前,我们需要初始化一个 Docker Swarm。

首先,在当前机器上初始化一个新的 Swarm。这台机器将成为管理节点。

docker swarm init

你应该会看到输出信息,表明 Swarm 已初始化,并提供一个命令用于让其他节点作为工作节点加入。

现在 Swarm 已初始化,你可以使用 docker node ls 命令列出 Swarm 中的节点。

docker node ls

这个命令将显示一个表格,展示 Swarm 中的节点。最初,你只会看到刚刚初始化的管理节点。输出将包含节点 ID、主机名、状态、可用性、管理状态和引擎版本等信息。

例如,输出可能类似于以下内容:

ID                            HOSTNAME            STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
<node_id> *                   <hostname>          Ready     Active         Leader           20.10.21

ID 旁边的 * 表示你当前所在的节点。MANAGER STATUS 列显示节点在 Swarm 中的角色(例如,LeaderReachableUnavailable)。

尝试从 Swarm 中移除一个正在运行的节点

在这一步中,你将尝试移除一个当前正在运行且属于 Swarm 的节点。这将展示出,在不先让节点停止服务的情况下,你无法直接移除一个正在运行的节点。

首先,让我们再次列出节点,以确认正在运行的节点的 ID。

docker node ls

确定你想要尝试移除的节点的 ID。在这种情况下,它将是列表中唯一的节点,即管理节点。

现在,尝试使用 docker node rm 命令并跟上节点 ID 来移除该节点。将 <node_id> 替换为你在上一步中找到的实际 ID。

docker node rm <node_id>

你可能会看到一条错误消息,表明该节点是管理节点,不能以这种方式移除,或者该节点仍处于活动状态。这是预期的行为。Docker Swarm 会阻止你直接移除正在运行的节点,以避免中断服务。

错误消息可能类似于以下内容:

Error response from daemon: node <node_id> is a swarm manager and cannot be removed without --force

这证实了在不使用 --force 标志的情况下,你无法移除正在运行的管理节点,我们将在后面的步骤中探讨该标志的使用。对于工作节点,通常你会先排空节点,然后再移除它。

从 Swarm 中移除一个已停止的节点

在这一步中,你将学习如何从 Swarm 中移除一个不再运行或无法访问的节点。由于我们当前的 Swarm 中只有一个节点(管理节点),我们将首先模拟一个节点停止的场景,即让当前节点退出 Swarm。

首先,让当前节点退出 Swarm。这将使 Docker 守护进程停止参与 Swarm。

docker swarm leave

系统会提示你确认是否要退出 Swarm。输入 y 并按回车键。

Node left the swarm.

现在,如果你处于同一个 Swarm 中的另一个管理节点上,你就可以移除刚刚退出的节点。由于我们只有一个节点,我们将重新初始化 Swarm 来模拟处于另一个管理节点的情况。

docker swarm init

你会看到输出信息,表明 Swarm 已再次初始化。

现在,让我们列出 Swarm 中的节点。你只会看到当前节点被列出。

docker node ls

为了演示如何移除一个已停止的节点,我们需要模拟有另一个节点已退出 Swarm 的情况。由于在这个环境中我们无法添加另一个节点,我们将进入下一步,该步骤将介绍如何强制移除一个无法访问的节点,这是移除不再参与 Swarm 的节点时更常见的场景。

从 Swarm 中强制移除一个无法访问的节点

在这一步中,你将学习如何从 Swarm 中强制移除一个无法访问或无响应的节点。当一个节点发生故障且无法正常移除时,这是必要的操作。

首先,让我们再次列出 Swarm 中的节点以获取节点 ID。

docker node ls

确定你想要强制移除的节点的 ID。在我们当前的设置中,这是唯一的节点,即管理节点。

要强制移除一个节点,你需要使用带有 --force 标志的 docker node rm 命令,后面跟上节点 ID。将 <node_id> 替换为实际的 ID。

docker node rm --force <node_id>

你应该会看到表明节点已被移除的输出信息。

Node <node_id> removed from swarm

现在,再次列出 Swarm 中的节点,以确认该节点已被移除。

docker node ls

你会看到一条错误消息,因为你已经从 Swarm 中移除了唯一的节点(管理节点),并且当前的 Docker 守护进程不再是 Swarm 的一部分。

Error: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to a swarm.

这证实了该节点已成功从 Swarm 中移除,即使它是管理节点。强制移除管理节点时应谨慎操作,因为如果没有其他管理节点,这可能会影响 Swarm 的可用性。

总结

在这个实验中,你学习了如何使用 docker node rm 命令管理 Docker Swarm 中的节点。你首先初始化了一个 Swarm,并使用 docker node ls 列出了现有的节点,以识别它们的 ID 和状态。

随后,你尝试移除一个正在运行的节点,这表明在移除节点之前必须先使其停止服务。接着,你成功移除了一个已停止的节点,并学习了如何从 Swarm 中强制移除一个无法访问的节点,涵盖了不同的节点移除场景。