如何确定docker swarm容器的网桥IP

如何确定docker swarm容器的网桥IP,docker,docker-swarm,Docker,Docker Swarm,我正在尝试使用dockerswarm建立一个框架,在这个框架中,我可以从外部系统(通过ssh或其他方式)连接到特定服务的容器中。因此,我可以通过以下方式来实现: ssh -o ProxyCommand="ssh ubuntu@10.0.0.18 nc 172.18.0.4 22" -l root foo { container_id: { swarm_node: <Swarm node IP>, bridge_ip: <Container's brid

我正在尝试使用
dockerswarm
建立一个框架,在这个框架中,我可以从外部系统(通过ssh或其他方式)连接到特定服务的容器中。因此,我可以通过以下方式来实现:

ssh -o ProxyCommand="ssh ubuntu@10.0.0.18 nc 172.18.0.4 22" -l root foo
{ 
  container_id: {
    swarm_node: <Swarm node IP>,
    bridge_ip:  <Container's bridge IP>
  }
}
这里
10.0.0.18
是swarm节点之一,然后我连接到该特定容器的网关网桥地址(
172.18.0.4

为了提供一些自动化,我希望能够
检查
任何docker对象,以便将容器ID映射到其网桥IP。我想创建以下内容的映射:

ssh -o ProxyCommand="ssh ubuntu@10.0.0.18 nc 172.18.0.4 22" -l root foo
{ 
  container_id: {
    swarm_node: <Swarm node IP>,
    bridge_ip:  <Container's bridge IP>
  }
}
{
货柜编号:{
群集节点:,

网桥ip:尝试从以下内容开始:

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。我还硬编码了“入口”排除,不确定是否有更干净的方法

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

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

谢谢,但是在我的设置中,
网桥ip
显示了覆盖ip。至少在“标准”设置中,我无法从swarm节点连接到此ip。@JensD尝试使用带有swarm服务的本地网桥网络目前仅部分受支持。您最好使用可连接的覆盖网络。有关更多信息,请参阅详细信息。如果您要获取容器的网桥IP地址,我认为您需要从本地节点上的容器中获取该地址。稍微更改了脚本,以便在swarm集群中有多个节点时,它可以工作。
对于$中的节点(docker服务ls-q);do docker service ps-f desired state=running-q$node\|同时读取任务id;docker inspect-f{{printf'%.12s.Status.ContainerStatus.ContainerID}:{swarm_节点:{.NodeID},网桥ip:{range.NetworksAttachments}{{{if ne“ingress.Network Spec Name}{{.Addresses}}{end}}{}'$task\u id done done