其他节点上的Docker ping容器

我有2个虚拟机(VM1 IP 192.168.56.101和VM2 IP 192.16.56.102可以互相ping),这些是我正在做的步骤:

- Create consul container on VM1 with 'docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap' - Create swarm manager on VM1 with 'docker run -d -p 3376:3376 swarm manage -H 0.0.0.0:3376 --advertise 192.168.56.101:3376 consul://192.168.56.101:8500 - Create swarm agents on each VM with 'docker run -d swarm join --advertise <VM-IP>:2376 consul://192.168.56.101:8500 

如果我运行docker -H 0.0.0.0:3376信息,我可以看到连接到群的两个节点,他们都是健康的。 我也可以运行容器,他们被安排到节点。 但是,如果我创build一个networking并为此networking分配几个节点,然后将SSH连接到一个节点,并尝试ping每个其他节点,则只能访问在同一个虚拟机上运行的节点。

这两个虚拟机都有这些DOCKER_OPTS:

 DOCKER_OPTS = DOCKER_OPTS="--cluster-store=consul://192.168.56.101:8500 --cluster-advertise=<VM-IP>:0 -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock" 

我没有直接的引用,但是从我在Docker GitHub问题跟踪器上读到的内容来看,ICMP数据包(ping)不会在不同节点上的容器之间路由。

到明确打开的端口的TCP连接应该工作。 但是从Docker 1.12.1开始,它就是越野车。

Docker 1.12.2有一些错误修复与其他主机上的容器build立连接。 但ping不能跨主机工作。

您只能在同一个节点上ping容器,因为您将它们附加到本地范围networking。

正如在评论中所build议的那样,如果您想在不显式打开端口的情况 使用docker swarm (或docker swarm模式 )跨主机ping容器(意思是从VM1上的容器到VM2上的容器),则需要创build覆盖networking 全球范围的networking),并在该networking上分配/启动容器。

要创build覆盖networking:

 docker network create -d overlay mynet 

然后使用该networking启动容器:

  • 对于Docker群集模式:

     docker service create --replicas 2 --network mynet --name web nginx 
  • 对于Docker Swarm(遗留):

     docker run -itd --network=mynet busybox 

例如,如果我们创build两个容器(在传统的Swarm上):

 docker run -itd --network=mynet --name=test1 busybox docker run -itd --network=mynet --name=test2 busybox 

你应该可以通过docker attach test2来ping test1 ,反之亦然。

有关更多详细信息,请参阅联网文档 。

注意 :如果在创build覆盖networking并将容器连接到容器后,容器仍然无法ping通,请检查虚拟机的防火墙configuration,并确保这些端口是打开的:

  • 数据平面/ vxlanUDP 4789
  • 控制平面/ 八卦TCP/UDP 7946