如何确定docker swarm容器的桥IP

时间:2017-04-27 21:57:13

标签: docker docker-swarm

我尝试使用docker swarm设置框架,我可以从外部系统(通过ssh或其他)连接到特定服务的容器。所以,我能够使用类似的东西来做到这一点:

ssh -o ProxyCommand="ssh ubuntu@10.0.0.18 nc 172.18.0.4 22" -l root foo

此处10.0.0.18是其中一个群集节点,然后我连接到该特定容器的网关桥接地址(172.18.0.4)。

为了提供一些自动化,我希望能够inspect任何泊坞对象来映射容器' ID为其网桥IP。我想创建一个类似的映射:

{ 
  container_id: {
    swarm_node: <Swarm node IP>,
    bridge_ip:  <Container's bridge IP>
  }
}

但是,我看不到任何显示特定容器的桥接信息的结构。我总是exec进入一个给定的容器并运行ifconfig,但我希望避免这种情况。

任何指示赞赏!

1 个答案:

答案 0 :(得分:1)

尝试从这开始:

docker service ls -q \
| xargs docker service ps -f desired-state=running -q \
| while read task_id; do 
  docker inspect -f '{{printf "%.12s" .Status.ContainerStatus.ContainerID }}:
  { swarm_node: {{.NodeID}},
    bridge_ip: {{range .NetworksAttachments}}{{if ne "ingress" .Network.Spec.Name }}{{.Addresses}}{{end}}{{end}}
  }' $task_id
done

您可能需要稍微清理容器IP,因为它会以包含位长度的IP列表形式出现。并且swarm节点实际上是节点id,而不是节点IP。我还对#ing; ingress&#34;的排除进行了硬编码,不确定是否有更清洁的方式。

要将节点ID映射到IP地址,可以使用另一个地址:

docker node ls -q \
| xargs docker node inspect -f '{ {{.ID}}: {{.Status.Addr}} }'