繁体   English   中英

docker swarm容器连接到主机端口

[英]docker swarm container connect to host port

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

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

有关详细信息,我正在遵循此Docker守护程序度量指南,以便在所有主机上公开新的docker metrics API,然后将该主机端口代理到覆盖网络中,以便Prometheus可以从所有群集主机中获取指标。

我已经阅读了几个docker github问题#8395 32101#32277 #1143 - 我的理解与Docker Daemon Metrics中概述的相同。 为了从群集容器中连接到主机,我应该使用docker-gwbridge网络,默认情况下是172.18.0.1。

我的群中的每个容器都有docker-gwbridge网络的网络接口:

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

此外,swarm中的每个容器都有一个通过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

尽管如此,我无法从容器内与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 Daemon Metrics指南中概述的容器内工作?
  2. 如果容器在172.18.0.1网络上具有网络接口并且具有为172.18.0.1配置的路由,为什么ping从容器中失败到172.18.0.1?
  3. 如果这不是从群集容器中访问主机端口的有效方法,那么如何实现这一目标呢?

编辑:刚刚意识到我没有在原帖中提供所有信息。 我在CentOS 7.2主机上运行docker swarm,Docker版本为17.04.0-ce,内置4845c56。 我的内核是4.9.11的版本,启用了vxlan和ipvs模块。

在进一步挖掘后,我注意到这似乎是一个防火墙问题。 我发现不仅我无法从容器中ping 172.18.0.1 - 但我根本无法ping我的主机! 我尝试了我的域名,服务器的FQDN甚至是公共IP地址,但是容器无法ping主机(因为我可以ping google / etc,所以有网络访问权限)。

我在我的主机上禁用了firewalld,然后重新启动了docker守护程序。 在此之后,我能够从容器(域名和172.18.0.1)中ping我的主机。 不幸的是,这不是我的解决方案。 我需要确定需要实施哪些防火墙规则以允许容器 - >主机通信,而不需要禁用firewalld。

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

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

我对CentOS不太熟悉,但我确实认为以下内容可以帮到你,或者至少可以作为提示sudo firewall-cmd --permanent --zone=trusted --change-interface=docker_gwbridge sudo systemctl restart firewalld你可能还需要重启docker。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM