其他节点上的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,并确保这些端口是打开的:
- 数据平面/ vxlan :
UDP 4789
- 控制平面/ 八卦 :
TCP/UDP 7946