在Docker Swarm中,我如何找到哪个节点IP正在运行给定的任务?
问题标题是我正在努力解决的具体问题。但更简单的说,是否可以将服务中的所有任务与运行它们的节点IP一起列出?在Docker Swarm中,我如何找到哪个节点IP正在运行给定的任务?
docker service ps
将列出任务ID以及运行任务的节点的主机名。没有提供其他节点标识符,如ID或IP。
但我使用Vagrant管理虚拟机,没有配置主机名,所有主机名都被命名为相同的(“流浪者”)。这使我很难确定哪个节点正在运行任务!
这很重要,因为我必须要manually delete unused images或者在没有更多磁盘空间的情况下将来机器崩溃。因此,搞清楚任务运行的地方是这个过程的第一步。
对于您的Vagrant用户,我使用config.vm.hostname
选项在Vagrantfile中很容易地更改了我的主机名。但是,当然,这个问题还是完全合法的。
我可以手动每个节点上运行docker images
或docker ps
找出哪个节点存储预期的图像和/或当前正在运行其中的容器(容器名称将是任务ID和任务名称的串联,具有分开点)。但这很麻烦。
我还可以列出他们的ID的所有节点使用docker node ls
然后使用docker node ps 7b
(“7B”是我的节点ID之一的前两个字母)挖角任务为每个节点,例如。但这也很麻烦,至多我只会“学习”节点ID而不是IP。
但是,我可以找到IP使用节点ID与这样的命令:docker inspect 7b --format '{{.Status.Addr}}'
。因此,直接获取IP并不是一个严格的要求,并且一会儿 - 当我明白这一点时 - 我认为找到给定任务ID的节点ID会容易得多!
但是没有。即使这似乎是不可能的?如前所述,docker service ps
不给我节点ID。该命令的docs表示占位符.Name
应该给我“节点ID”,但这是错误的。
直到现在,我必须尝试了十亿不同的黑客。
特别有一件事,我感到不安的是,docs为docker node ps
指令明确指出,它可用于“上一个或多个节点上运行列表的任务”(强调我的)。但是,如果我这样做:docker node ps vagrant
我得到一个错误消息,主机名是不明确的,因为它解析为多个节点!大声笑是不是很有趣(即使没有使用主机名我没有得到这个命令工作在多个节点上列出的任务)。这并不重要,因为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>)
所接受,我不会庆祝这个答案,至少暂时不考虑,因为它是丑陋的地狱。当然,必须有另一种更直接的方式!