
容器运行时云原生【免费下载链接】docker-ce:warning: This repository is deprecated and will be archived (Docker CE itself is NOT deprecated) see the https://github.com/docker/docker-ce/blob/master/README.md :warning:项目地址https://gitcode.com/gh_mirrors/do/docker-ce点击查看免费下载docker node ls是 Docker CLI 在 Swarm 模式下管理集群节点的核心查询命令用于列出当前 Swarm 集群中 manager 已知的所有节点及其状态、可用性与 Manager 角色信息。本文基于 docker-ce 仓库中该命令的 官方参考文档并结合 CLI 端到服务端的源码实现系统讲解命令用法、全部过滤器语义、Go 模板格式化占位符以及自定义默认输出格式的方法。命令概览与使用前提node ls的命令语法如下Usage: docker node ls [OPTIONS] List nodes in the swarm Aliases: ls, list Options: -f, --filter filter Filter output based on conditions provided --format string Pretty-print nodes using a Go template --help Print usage -q, --quiet Only display IDsAliases别名ls是list的别名两者完全等价。必选前提这是一个集群管理命令必须在 Swarm manager 节点上执行。如果对非 manager 节点或未处于 Swarm 模式的 daemon 执行命令会失败。关于 manager 与 worker 的角色划分可参考 Swarm 模式相关文档 与 node update 对节点角色字段的说明。在 CLI 源码中该命令定义于 components/cli/cli/command/node/list.gonewListCommand创建了ls命令并注册quiet-q、format--format与filter-f/--filter三个选项同时通过Args: cli.NoArgs声明该命令不接受位置参数。node子命令族由 cmd.go 统一挂载包括demote、inspect、ls、promote、rm、ps、update七个子命令。默认输出示例$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 1bcef6utixb0l0ca7gxuivsj0 swarm-worker2 Ready Active 38ciaotwjuritcdtn9npbnkuz swarm-worker1 Ready Active e216jshn25ckzbvmwlnh5jr3g * swarm-manager1 Ready Active Leader注意上述输出中隐藏了一列.Self用于标记该节点是否为当前 docker daemon 所在节点。带*的行如e216jshn25ckzbvmwlnh5jr3g *表示该节点就是当前 daemon。*标记的实现细节位于 formatter.go 的Self()方法它将列表中的每个节点 ID 与GET /info接口返回的info.Swarm.NodeID比较相等即输出*。对应地list.go 中只有当节点列表非空且未使用--quiet时才会额外调用/info接口——这也是--quiet模式更省一次 API 往返的原因。只输出节点 ID--quiet-q/--quiet让输出仅包含节点 ID适合在脚本中批量处理节点$ docker node ls -q 1bcef6utixb0l0ca7gxuivsj0 38ciaotwjuritcdtn9npbnkuz e216jshn25ckzbvmwlnh5jr3g在 CLI 侧--quiet由formatter.DefaultQuietFormat提供渲染格式list_test.go 中的TestNodeListQuietShouldOnlyPrintIDs用例验证了该行为只输出nodeID1\n。使用过滤器筛选节点过滤标志-f或--filter的格式为keyvalue。需要多个过滤条件时重复传入多个--filter参数即可例如--filter foobar --filter bifbaz。多个过滤器之间是AND语义即节点必须同时满足所有条件。目前支持的过滤器filter key共六种Filter key匹配目标id节点的全部或部分 IDlabeldaemon 引擎标签engine labelsnode.labelSwarm 节点标签node labelsmembership节点成员状态accepted或pendingname节点的全部或部分 hostnamerole节点角色worker或manager这六种过滤器与服务端一一对应。在 daemon 侧的 filters.go 中newListNodesFilters显式声明了可接受的过滤器白名单对未列出的 key 会直接报错同时服务端会通过filter.Validate(accepted)校验非法 key并对非法的role/membership值返回类似Invalid role filter: xxx的明确错误。按 ID 过滤idid过滤器匹配节点的全部或部分 ID$ docker node ls -f id1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 1bcef6utixb0l0ca7gxuivsj0 swarm-worker2 Ready Active服务端实现中将该过滤值放入ListNodesRequest_Filters.IDPrefixes前缀匹配因此传入部分 ID 前缀即可命中。按引擎标签过滤labellabel过滤器匹配 daemon 引擎标签支持“仅检查标签存在”和“标签存在且等于某值”两种用法。引擎标签在 daemon 配置文件 中配置。注意过滤 Swarm 节点标签时应改用node.label见下文label与node.label针对的是两套不同的标签体系。以下过滤器匹配具有foo标签不论值的节点$ docker node ls -f labelfoo ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 1bcef6utixb0l0ca7gxuivsj0 swarm-worker2 Ready Active需要指定标签值时写labelfoobar。服务端将label过滤值转换为ListNodesRequest_Filters.Labels键值映射后交给 swarmkit 执行匹配。按节点标签过滤node.labelnode.label过滤器匹配 Swarm 节点标签通过docker node update --label-add设置同样支持“仅存在”与“存在且等于值”两种匹配方式。先为节点打上region标签$ docker node update --label-add regionregion-a swarm-test-01 $ docker node update --label-add regionregion-a swarm-test-02 $ docker node update --label-add regionregion-b swarm-test-03 $ docker node update --label-add regionregion-b swarm-test-04展示所有设置了region节点标签的节点$ docker node ls --filter node.labelregion ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION yg550ettvsjn6g6t840iaiwgb * swarm-test-01 Ready Active Leader 20.10.2 2lm9w9kbepgvkzkkeyku40e65 swarm-test-02 Ready Active Reachable 20.10.2 hc0pu7ntc7s4uvj4pv7z7pz15 swarm-test-03 Ready Active Reachable 20.10.2 n41b2cijmhifxxvz56vwrs12q swarm-test-04 Ready Active 20.10.2展示所有region标签值为region-a的节点$ docker node ls --filter node.labelregionregion-a ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION yg550ettvsjn6g6t840iaiwgb * swarm-test-01 Ready Active Leader 20.10.2 2lm9w9kbepgvkzkkeyku40e65 swarm-test-02 Ready Active Reachable 20.10.2配套的--label-add/--label-rm参数定义在 update.golabel-add接收keyvalue形式的列表label-rm删除已存在的标签若标签不存在则报错key xxx doesnt exist in nodes labels。按成员状态过滤membershipmembership过滤器匹配节点的成员状态取值只能为accepted已接受正常纳入集群或pending等待加入/批准$ docker node ls -f membershipaccepted ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 1bcef6utixb0l0ca7gxuivsj0 swarm-worker2 Ready Active 38ciaotwjuritcdtn9npbnkuz swarm-worker1 Ready Active服务端在 filters.go 中对membership值做大小写不敏感校验仅接受accepted/pending并映射为swarmapi.NodeSpec_Membership枚举。按主机名过滤namename过滤器匹配节点的全部或部分 hostname$ docker node ls -f nameswarm-manager1 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS e216jshn25ckzbvmwlnh5jr3g * swarm-manager1 Ready Active Leader服务端将其放入NamePrefixes即按主机名前缀匹配。按角色过滤rolerole过滤器匹配节点角色取值只能为worker或manager$ docker node ls -f rolemanager ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS e216jshn25ckzbvmwlnh5jr3g * swarm-manager1 Ready Active Leader使用 Go 模板定制输出格式--format选项使用 Go 模板对节点输出进行“美化打印”。下表列出了所有可用的模板占位符占位符描述.ID节点 ID.Self节点是否为当前 daemontrue/falsetrue表示该节点与当前 docker daemon 相同.Hostname节点主机名.Status节点状态.Availability节点可用性active、pause或drain.ManagerStatus节点的 Manager 状态.TLSStatus节点 TLS 状态Ready或由旧 CA 签发证书时的Needs Rotation.EngineVersion引擎版本使用--format时node ls要么完全按模板声明输出数据当使用table指令如--format table {{.ID}}\t{{.Hostname}}时则会额外输出表头。以下示例不使用表头对所有节点输出以冒号:分隔的ID、Hostname与TLS Status$ docker node ls --format {{.ID}}: {{.Hostname}} {{.TLSStatus}} e216jshn25ckzbvmwlnh5jr3g: swarm-manager1 Ready 35o6tiywb700jesrt3dmllaza: swarm-worker1 Needs Rotation占位符的底层实现每个占位符在 CLI 侧都有对应的取值方法定义于 formatter.go.Status取自node.Status.StateReady、Down等.Availability取自node.Spec.Availability即active、pause、drain三态之一.ManagerStatus若node.ManagerStatus非空Leader 节点输出Leader其余按可达性输出Reachable或Unreachable非 manager 节点为空.TLSStatus逻辑较为特殊formatter.go当节点 TLS 信息与集群整体TLSInfo一致时输出Ready不一致如证书仍由旧 CA 签发输出Needs Rotation集群信息缺失时输出Unknown.EngineVersion取自node.Description.Engine.EngineVersion。内置的 raw 与 table 输出除了模板占位符--format还支持raw与table两个内置指令formatter.go。默认的表格格式模板为table {{.ID}} {{if .Self}}*{{else}} {{ end }}\t{{.Hostname}}\t{{.Status}}\t{{.Availability}}\t{{.ManagerStatus}}\t{{.EngineVersion}}这也是示例输出中*标记与六列表头的来源。使用--format raw时输出形如$ docker node ls --format raw node_id: e216jshn25ckzbvmwlnh5jr3g hostname: swarm-manager1 status: Ready availability: Active manager_status: Leader通过配置文件自定义默认格式若不想每次手动传--format可以在 Docker CLI 配置文件~/.docker/config.json中通过nodesFormat字段设置docker node ls的默认输出格式前提是不加--format且非--quiet模式。该字段的完整说明见 CLI 配置参考示例{ nodesFormat: table {{.ID}}\t{{.Hostname}}\t{{.Availability}} }优先级规则可以从 list.go 中确认显式--format参数 配置文件的nodesFormat 内置默认表格模板--quiet时直接使用安静模式格式忽略nodesFormat。list_test.go 中的两个测试分别验证了“从配置读取默认格式”和“--format覆盖配置”两条路径对应的 golden 文件输出为$ # 未传 --format使用配置 nodesFormat: {{.ID}}: {{.Hostname}} {{.Status}}/{{.ManagerStatus}} nodeID1: nodeHostname1 Ready/Leader nodeID2: nodeHostname2 Ready/Reachable nodeID3: nodeHostname3 Ready/ $ # 传入 --format {{.Hostname}}: {{.ManagerStatus}} 覆盖配置 nodeHostname1: Leader nodeHostname2: Reachable输出排序与相关命令node ls的输出按 hostname 做自然排序natural sort即node-2排在node-10之前这是通过 list.go 中的sortorder.NaturalLess实现并在客户端完成的排序测试夹具见 node-list-sort.golden。从源码调用链来看docker node ls的完整请求路径为CLI 的runListlist.go→ 客户端Client.NodeList请求GET /nodes?filters...node_list.go→ daemon 侧 swarm 路由getNodescluster_routes.go→Cluster.GetNodesnodes.go→ swarmkit 的ListNodesgRPC 调用。daemon 只有处于活动 manager 状态IsActiveManager()时才会返回节点列表否则返回c.errNoManager(state)错误这也印证了“必须在 manager 上执行”的前提。docker node ls常与以下节点管理命令配合使用node demote将 manager 降级为 workernode inspect查看节点详细配置node promote将 worker 提升为 managernode ps列出节点上运行的任务node rm从集群移除节点node update更新节点角色、可用性与标签。赞分享容器运行时云原生【免费下载链接】docker-ce:warning: This repository is deprecated and will be archived (Docker CE itself is NOT deprecated) see the https://github.com/docker/docker-ce/blob/master/README.md :warning:项目地址https://gitcode.com/gh_mirrors/do/docker-ce点击查看免费下载相关推荐Docker CLI 实战指南docker node ls 命令详解Swarm 节点列表、过滤与格式化输出Docker CLI 实战指南 docker node ls 命令详解Swarm 节点列表、过滤与格式化输出 本篇技术指南围绕 Docker CLI 中用CLI开发工具Docker CLI 的 docker secret ls 命令详解Swarm 密钥列表、过滤与自定义格式化输出Docker CLI 的 docker secret ls 命令详解Swarm 密钥列表、过滤与自定义格式化输出 docker secret ls 是 DocCLI开发工具Docker CLI volume ls列表、过滤与模板格式化卷输出的完整指南Docker CLI volume ls列表、过滤与模板格式化卷输出的完整指南 本文基于 Docker CLIcli 仓库中 docker volumeCLI开发工具上一篇5分钟装好任务栏实时股票行情监控TrafficMonitor股票插件完整指南下一篇NetBox 零基础教程5分钟快速上手网络基础设施管理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考