简介
在这个实验中,你将学习如何使用 docker node ps
命令来列出并过滤在 Docker Swarm 节点上运行的任务。你将从初始化一个 Docker Swarm 并创建一个简单的服务以生成任务开始。
然后,你将探索如何列出特定节点上的所有任务,根据任务的名称和期望状态过滤任务,最后,格式化任务列表的输出,以提高可读性并便于提取信息。这种实践经验将为你提供在 Docker Swarm 集群中监控和管理任务的实用技能。
在这个实验中,你将学习如何使用 docker node ps
命令来列出并过滤在 Docker Swarm 节点上运行的任务。你将从初始化一个 Docker Swarm 并创建一个简单的服务以生成任务开始。
然后,你将探索如何列出特定节点上的所有任务,根据任务的名称和期望状态过滤任务,最后,格式化任务列表的输出,以提高可读性并便于提取信息。这种实践经验将为你提供在 Docker Swarm 集群中监控和管理任务的实用技能。
在这一步中,你将学习如何列出在 Docker Swarm 节点上运行的所有任务。Docker Swarm 是一个容器编排工具,可让你管理一组 Docker 节点。任务是服务的一个运行实例。
在列出任务之前,我们需要有一个正在运行的 Docker Swarm 服务。在这个实验中,我们将使用一个简单的 nginx
服务。
首先,让我们在这个节点上初始化一个 Docker Swarm。
docker swarm init
你应该会看到输出信息,表明 swarm 已初始化并提供了一个加入令牌。
现在,让我们使用 nginx
镜像创建一个名为 my-nginx-service
的简单服务。我们将先拉取 nginx
镜像,以确保它可用。
docker pull nginx:latest
docker service create --name my-nginx-service --replicas 1 nginx
docker service create
命令创建一个具有一个副本(一个任务)的新服务。如果 nginx
镜像尚未存在,Docker 会自动拉取它,但我们提前显式地拉取了它。
服务创建后,Docker 将在 swarm 中的某个节点(在本例中是当前节点)上为该服务启动一个任务。
要列出节点上运行的所有任务,你可以使用 docker node ps
命令,后跟节点 ID 或主机名。由于我们位于创建服务的管理节点上,我们可以使用该节点的 ID。
要查找节点 ID,你可以使用 docker node ls
命令。
docker node ls
此命令将列出 swarm 中的所有节点。输出将显示节点 ID、主机名、状态、可用性和管理状态。复制当前节点的 ID(在 MANAGER STATUS
下显示为 Leader
的节点)。
现在,使用 docker node ps
命令和你复制的节点 ID 来列出该节点上的任务。将 <node_id>
替换为实际的节点 ID。
docker node ps <node_id>
此命令将显示指定节点上运行的任务列表,包括任务 ID、服务名称、镜像、节点、期望状态、当前状态和错误信息。你应该会看到 my-nginx-service.1
任务,其状态为 Running
。
另外,你可以使用 docker task ls
命令列出 swarm 中的所有任务。此命令有助于查看 swarm 中所有节点上的任务。
docker task ls
此命令将显示与 docker node ps
类似的信息,但它列出的是 swarm 中所有节点的任务。由于我们只有一个节点和一个任务,输出将与 docker node ps
类似。
在这一步中,你学习了如何使用 docker node ps
列出特定节点上的任务,以及如何使用 docker task ls
列出 swarm 中的所有任务。
在这一步中,你将学习如何按任务名称过滤任务列表。当你有许多服务和任务正在运行,而你只想查看与特定服务相关的任务时,这会很有用。
我们将继续使用上一步中创建的 my-nginx-service
。
要按名称过滤任务,你可以在 docker task ls
命令中使用带有 name
键的 --filter
标志。语法为 --filter name=<service_name>
。
让我们过滤任务,只显示属于 my-nginx-service
的任务。
docker task ls --filter name=my-nginx-service
此命令将仅列出服务名称为 my-nginx-service
的任务。你应该会看到 my-nginx-service.1
任务被列出。
你还可以按完整的任务名称进行过滤,完整任务名称包括服务名称和任务编号(例如 my-nginx-service.1
)。
docker task ls --filter name=my-nginx-service.1
此命令将专门列出名称为 my-nginx-service.1
的任务。
如果你有多个服务正在运行,按服务名称过滤将显示该服务的所有任务。例如,如果你还有一个名为 my-app-service
的服务,运行 docker task ls --filter name=my-app-service
将显示 my-app-service
的所有任务。
按名称过滤是缩小 docker task ls
命令输出范围并专注于你感兴趣的任务的有效方法。
在这一步中,你将学习如何根据任务的期望状态来过滤任务列表。任务的期望状态是 Docker Swarm 管理器希望任务所处的状态(例如 Running
、Shutdown
、Accepted
)。
我们将继续使用前几步中创建的 my-nginx-service
。目前,该服务的任务期望状态为 Running
。
要按期望状态过滤任务,你可以在 docker task ls
命令中使用带有 desired-state
键的 --filter
标志。语法为 --filter desired-state=<state>
。
让我们过滤任务,只显示期望状态为 Running
的任务。
docker task ls --filter desired-state=Running
此命令将仅列出期望状态为 Running
的任务。你应该会看到 my-nginx-service.1
任务被列出。
现在,让我们将服务的副本数缩减为 0。这将把现有任务的期望状态更改为 Shutdown
。
docker service scale my-nginx-service=0
缩减副本数后,任务最终将转变为 Shutdown
状态。状态更新可能需要一些时间。
现在,让我们过滤任务,显示期望状态为 Shutdown
的任务。
docker task ls --filter desired-state=Shutdown
你现在应该会看到 my-nginx-service.1
任务的期望状态为 Shutdown
。
其他可能的期望状态包括 Accepted
(当任务被工作节点接受但尚未运行时)和 Failed
(如果任务启动失败)。
按期望状态过滤有助于监控服务的状态,并识别未处于预期状态的任务。
在这一步中,你将学习如何格式化 docker task ls
命令的输出,以自定义格式显示特定信息。这对于编写脚本或生成报告很有用。
我们将继续使用 my-nginx-service
及其任务。
要格式化输出,你可以使用带有 Go 模板字符串的 --format
标志。模板字符串允许你指定要显示哪些字段以及如何格式化它们。
让我们只显示任务的 ID、服务名称和当前状态。
docker task ls --format "{{.ID}}\t{{.Service}}\t{{.CurrentState}}"
在这个命令中:
{{.ID}}
指的是任务 ID。{{.Service}}
指的是服务名称。{{.CurrentState}}
指的是任务的当前状态。\t
用于在字段之间插入制表符,以提高可读性。输出将显示每个任务的 ID、服务名称和当前状态。
你还可以使用 table
格式以特定列的表格形式显示输出。
docker task ls --format "table {{.ID}}\t{{.Service}}\t{{.CurrentState}}\t{{.Node}}"
这个命令将显示一个包含任务 ID、服务、当前状态和节点列的表格。
要查看可以在格式字符串中使用的所有可用字段,你可以使用 docker task inspect
命令检查任务并查看 JSON 输出。不过,一些常见的字段包括:
.ID
:任务 ID.Service
:服务名称.Image
:镜像名称.Node
:节点主机名.DesiredState
:任务的期望状态.CurrentState
:任务的当前状态.Error
:如果任务失败,显示错误消息.CreatedAt
:任务创建的时间戳.UpdatedAt
:任务最后更新的时间戳让我们显示任务 ID、镜像以及任务运行所在的节点。
docker task ls --format "{{.ID}}\t{{.Image}}\t{{.Node}}"
这个命令将显示任务 ID、任务使用的镜像以及任务运行的节点。
格式化输出允许你自定义 docker task ls
显示的信息,以满足你的需求,无论是用于快速检查还是在脚本中使用。
最后,让我们清理我们创建的服务。
docker service rm my-nginx-service
这个命令将移除服务及其关联的任务。
在本次实验中,你学习了如何使用 docker node ps
命令列出在特定 Docker Swarm 节点上运行的任务。你首先初始化了一个 Docker Swarm,并创建了一个包含一个副本的简单 nginx
服务。然后,你使用 docker node ls
来确定当前管理节点的节点 ID,接着使用 docker node ps <node_id>
来显示该节点上运行的所有任务。
本次实验还介绍了如何通过根据任务名称和期望状态过滤任务来优化 docker node ps
的输出,以及如何格式化输出以提高可读性。这些步骤展示了 docker node ps
命令在监控和管理 Docker Swarm 集群内任务方面的灵活性。