docker群容器连接到主机端口

我有一个swarm集群,我在其中创build了一个在集群中的所有docker主机上运行的全局服务。

目标是让这个服务的每个容器实例连接到在docker主机上侦听的端口。

有关详细信息,请参阅此Docker守护程序度量标准指南,以在所有主机上公开新Docker度量标准API,然后将该主机端口代理到覆盖networking,以便Prometheus可以从所有群主机中删除度量标准。

我已经阅读了几个docker github问题#8395 # 32101#32277 #1143 – 从这里我的理解与Docker守护程序度量标准中概述的相同。 为了从群集容器中连接到主机,我应该使用默认为172.18.0.1的docker-gwbridgenetworking。

我的群中的每个容器都有一个docker-gwbridgenetworking的networking接口:

326: eth0@if327: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue link/ether 02:42:0a:ff:00:06 brd ff:ff:ff:ff:ff:ff inet 10.255.0.6/16 scope global eth0 valid_lft forever preferred_lft forever inet 10.255.0.5/32 scope global eth0 valid_lft forever preferred_lft forever 333: eth1@if334: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:12:00:04 brd ff:ff:ff:ff:ff:ff inet 172.18.0.4/16 scope global eth1 valid_lft forever preferred_lft forever 

另外,群中的每个容器都有一个默认的路由,通过172.0.0.1:

 /prometheus # ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }' 172.18.0.1 /prometheus # netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}' 172.18.0.1 /prometheus # ip route default via 172.18.0.1 dev eth1 10.0.1.0/24 dev eth2 src 10.0.1.9 10.255.0.0/16 dev eth0 src 10.255.0.6 172.18.0.0/16 dev eth1 src 172.18.0.4 

尽pipe如此,我无法在容器内与172.18.0.1进行通信:

 / # wget -O- 172.18.0.1:4999 Connecting to 172.18.0.1:4999 (172.18.0.1:4999) wget: can't connect to remote host (172.18.0.1): No route to host 

在主机上,我可以访问172.18.0.1上的docker metrics API。 我可以ping,我可以做出成功的HTTP请求。

  1. 任何人都可以阐明为什么在Docker守护程序度量标准指南中概述的容器内不起作用?
  2. 如果容器在172.18.0.1networking上有networking接口,并且路由configuration为172.18.0.1,为什么ping在容器内不能172.18.0.1?
  3. 如果这不是从群集容器中访问主机端口的有效方法,那么如何实现呢?

编辑:只是意识到,我没有给原来的文章中的所有信息。 我正在docker版本17.04.0-ce,build 4845c56上运行一个CentOS 7.2主机上的docker swarm。 我的内核是4.9.11的版本,启用了vxlan和ipvs模块。

经过一些进一步的挖掘,我已经注意到这似乎是一个防火墙问题。 我发现,我不仅无法从容器内ping 172.18.0.1,而且还无法ping通主机。 我尝试了我的域名,服务器的FQDN,甚至公共IP地址,但容器无法ping主机(有networking访问,因为我可以ping谷歌/等)。

我在主机上禁用了firewalld,然后重新启动了docker守护进程。 在此之后,我能够从容器内(包括域名和172.18.0.1)ping我的主机。 不幸的是,这不是我的解决scheme。 我需要确定哪些防火墙规则需要放置,以允许容器 – >主机通信,而不要求禁用firewalld。

首先,我非常感谢你。 在阅读你的编辑部分之前,我花了一天一夜的时间来解决类似的问题,从来没有意识到魔鬼是防火墙。

在不禁用防火墙的情况下,我已经解决了Ubunt 16.04上的问题,使用sudo ufw allow in on docker_gwbridge sudo ufw allow out on docker_gwbridge sudo ufw enable

我对CentOS并不熟悉,但是我确实相信下面这些应该可以帮到你,至less可以作为提示sudo firewall-cmd --permanent --zone=trusted --change-interface=docker_gwbridge sudo systemctl restart firewalld也可能不得不重新启动docker。