问题标题是我要解决的特定问题.但是更简单地说,是否有可能列出服务中的所有任务以及运行它们的节点IP?
docker service ps将列出任务ID以及在其上运行任务的节点的主机名.没有提供其他节点标识符,例如ID或IP.
但是我正在使用Vagrant来管理VM,并且没有配置主机名,所有主机名都被命名为相同的名称(“ vagrant”).这使我很难准确地确定哪个节点正在运行任务!
这很重要,因为我必须达到manually delete unused images,否则在没有更多磁盘空间的情况下,将来会有机器崩溃的风险.因此弄清楚任务在哪里运行是此过程的第一步.
对于您的Vagrant用户,我很容易使用config.vm.hostname
选项在Vagrantfile中更改了主机名.但是,当然,这个问题仍然完全合法.
我可以在每个节点上手动运行docker映像或docker ps以确定哪个节点存储了预期的映像和/或当前正在运行哪个容器(容器名称将是任务ID和任务名称的串联,并用点分隔) .但这很麻烦.
我还可以使用docker node ls列出所有具有其ID的节点,然后例如通过使用docker node ps 7b(每个节点ID中的前两个字母“ 7b”)为每个节点进行任务预捕.但这也很麻烦,充其量来说,我将“仅”学习节点ID,而不是IP.
但是,我可以使用带有以下命令的节点ID查找IP:docker inspect 7b –format'{{.Status.Addr}}’.因此,直接获取IP并不是严格的要求,并且有一段时间-当我理解这一点时-我认为找到给定任务ID的节点ID会容易得多!
但不是.甚至这似乎是不可能的?如前所述,docker服务ps没有提供节点ID.命令的docs表示占位符.Name应该给我“节点ID”,但这是错误的.
在此之前,我必须尝试过十亿种不同的骇客.
令我特别困扰的一件事是,docker node ps命令的docs明确声明可以用于“列出在一个或多个节点上运行的任务”(强调我的).但是,如果我这样做:docker node ps vagrant我收到一条错误消息,指出主机名不明确,因为它解析为多个节点!大声笑不是那么有趣(即使不使用主机名,我也没有得到此命令来在多个节点上列出任务).没关系,因为与docker service ps一样,docker node ps甚至都不输出节点ID,而这两个命令的文档都在于能够做到这一点.
所以你有它.我只是想知道我面前是否有想念的东西,或者整个世界都依赖唯一的主机名?感觉我不得不错过一些显而易见的事情.当然,如此受欢迎的产品Docker必须能够提供一种找到给定任务ID的节点ID或节点IP的方法吗?嗯.
我正在运行Docker版本17.06.2.
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>)
我不会接受这种自我回答,至少暂时不会,因为它很难受.当然,还有一种更直接的方法!