在Docker Swarm中,我如何find哪个节点IP运行给定的任务?

问题标题是我正在努力解决的具体问题。 但更简单的说,是否可以将所有任务与运行它们的节点IP一起列入服务中?

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

但是我使用Vagrant来pipe理虚拟机,没有configuration主机名,所有的主机名都被命名为相同的(“stream浪者”)。 这使我很难确定哪个节点正在运行任务!

这一点很重要,因为我不得不手动删除未使用的映像,或者在没有更多磁盘空间的情况下将来有机会崩溃。 所以搞清楚在哪里运行任务是这个过程的第一步大声笑。

对于Vagrant用户,我使用config.vm.hostname选项在Vagrantfile中很容易地更改了主机名。 当然,这个问题还是完全合法的。

我可以在每个节点上手动运行docker images或者docker ps来确定哪个节点存储了期望的镜像,并且/或者当前正在运行哪个容器(容器名称是任务ID和任务名称的连接,用点分隔) 。 但是这很麻烦。

我也可以使用docker node ls列出所有具有ID的docker node ls ,然后例如通过使用docker node ps 7b (“7b”是我的一个节点ID中的前两个字母)来search每个节点的任务。 但是这也很麻烦,至多我只会“学习”节点ID而不是IP。

但是,我可以使用一个像这样的命令find一个节点ID的IP: docker inspect 7b --format '{{.Status.Addr}}' 。 因此,直接获取IP并不是一个严格的要求,一时间 – 当我明白这一点时 – 我认为find给定任务ID的节点ID会容易得多!

但不是。 即使这似乎是不可能的? 如前所述, docker service ps不给我节点ID。 该命令的文档说占位符.Name应该给我“节点ID”,但这是错误的。

直到现在,我必须尝试十亿不同的黑客。

我觉得有一点特别令人不安,那就是docker node ps命令的文档明确指出,它可以用来“列出在一个或多个节点上运行的任务”(强调我的)。 但是,如果我这样做: docker node ps vagrant我得到一个错误消息,主机名是不明确的,因为它parsing为多个节点! 大声笑是不是很有趣(即使没有使用主机名我没有得到这个命令工作在多个节点上的任务)。 这并不重要,因为docker node ps就像docker service ps一样,甚至不输出节点ID,而这两个命令的文档都是为了能够这样做。

所以你有它。 我想知道在我面前有什么东西是我错过的,或者是整个世界依赖于独特的主机名吗? 感觉就像我不得不错过一些明显的东西。 当然,这个如此受欢迎的产品Docker必须能够提供一种方法来查找给定任务ID的节点ID或节点IP? 哼。

我正在运行Docker版本17.06.2。

在我发表我的问题之后,文学上五分钟,我实际上设法得到一些牵引力哈哈。

这给了我的节点ID ,给定一个<任务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>) 

我不会将这个答案标记为已接受,至less现在不是,因为它是丑陋的。 当然,还有另一种更直接的方法!

Interesting Posts