在 Docker Swarm 中,如何找到哪个节点 IP 是 运行 给定任务?

In a Docker Swarm, how do I find which node IP is running a given task?

问题标题是我要解决的具体问题。但更简单的是,是否可以列出服务中的所有任务以及节点 IP 运行ning 它们?

docker service ps 将列出任务 ID 以及任务所在节点的主机名 运行ning。没有提供其他节点标识符,例如 ID 或 IP。

但我正在使用 Vag运行t 来管理 VM,并且没有配置主机名,所有主机名都被命名为相同的 ("vagrant")。这让我很难确定 运行 执行任务的确切节点!

这很重要,因为我必须 否则将来当没有更多磁盘 space 时机器可能会崩溃。所以弄清楚任务在哪里 运行 是这个过程的第一步哈哈。

对于 Vag运行t 用户,我使用 config.vm.hostname 选项在 Vag运行t 文件中很容易地更改了我的主机名。但当然,这个问题仍然是完全合法的。

我可以在每个节点上手动 运行 docker imagesdocker ps 来找出哪个节点存储预期图像 and/or 当前 运行ning 哪个容器(容器名称将是任务 ID 和任务名称的串联,以点分隔)。但这很麻烦。

我还可以使用 docker node ls 列出所有节点及其 ID,然后为每个节点寻找任务,例如使用 docker node ps 7b(“7b”是其中一个中的前两个字母我的节点 ID)。但这也很麻烦,充其量我会 "only" 学习节点 ID 而不是 IP。

但是,我可以通过如下命令使用节点 ID 找到 IP:docker inspect 7b --format '{{.Status.Addr}}'。因此,直接获取 IP 并不是一个严格的要求,有那么一刻——当我理解这一点时——我认为为给定任务 ID 找到节点 ID 会容易得多!

但是没有。连这似乎都不可能?如前所述,docker service ps 没有给我节点 ID。命令的 docs 表示占位符 .Name 应该给我 "Node ID" 但这是错误的。

直到这一刻,我一定已经尝试了十亿种不同的技巧。

我觉得特别令人不安的一件事是 docker node ps 命令的 docs 明确声明它可以用于 "list tasks running on one or more nodes"(强调我的)。但是,如果我这样做: docker node ps vagrant 我会收到一条错误消息,指出主机名不明确,因为它解析为多个节点!大声笑并没有那么好笑(即使不使用主机名,我也没有得到这个命令来在多个节点上列出任务)。这并不重要,因为 docker node ps 就像 docker service ps 一样甚至不输出节点 ID,而且这两个命令的文档都在说能够这样做。

好了。我想知道我是否错过了眼前的某些东西,或者整个世界是否都依赖于唯一的主机名?感觉就像我必须错过一些明显的东西。当然,这个如此受欢迎的产品 Docker 一定能够提供一种在给定任务 ID 的情况下查找节点 ID 或节点 IP 的方法吗?嗯。

我是运行宁Docker版本17.06.2.

这给了我 节点 ID,给定一个 :

docker inspect <task ID> --format '{{.NodeID}}'

使用节点ID获取节点IP:

docker inspect <node ID> --format '{{.Status.Addr}}'

或者,全部在一个压缩行中:

docker inspect -f '{{.Status.Addr}}' $(docker inspect -f '{{.NodeID}}' <task ID>)

作为奖励,MAC 地址:

docker inspect -f '{{.NetworkSettings.Networks.ingress.MacAddress}}' $(docker inspect -f '{{.Status.ContainerStatus.ContainerID}}' <task ID>)