docker swarm容器连接到主机端口

docker swarm容器连接到主机端口,docker,docker-swarm,Docker,Docker Swarm,我有一个swarm集群,我在其中创建了一个全局服务,在集群中的所有docker主机上运行 目标是让此服务的每个容器实例连接到docker主机上侦听的端口 为了获得更多信息,我将遵循本指南在所有主机上公开新的docker metrics API,然后将该主机端口代理到覆盖网络中,以便Prometheus可以从所有swarm主机中获取度量 我已经阅读了几个docker github问题——从中我的理解与本文中概述的相同。为了从swarm容器中连接到主机,我应该使用docker gwbridge网络,

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

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

为了获得更多信息,我将遵循本指南在所有主机上公开新的docker metrics API,然后将该主机端口代理到覆盖网络中,以便Prometheus可以从所有swarm主机中获取度量

我已经阅读了几个docker github问题——从中我的理解与本文中概述的相同。为了从swarm容器中连接到主机,我应该使用docker gwbridge网络,默认情况下是172.18.0.1

my swarm中的每个容器都有一个用于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
尽管如此,我无法从容器内与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请求

  • 有人能解释一下为什么这在指南中概述的容器内不起作用吗
  • 如果容器在172.18.0.1网络上有一个网络接口,并且为172.18.0.1配置了路由,那么为什么ping无法从容器内发送到172.18.0.1
  • 如果这不是从swarm容器中访问主机端口的有效方法,那么如何实现这一点呢
  • 编辑: 我才意识到我并没有在原来的帖子中提供所有的信息。 我正在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)


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

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

    在不禁用防火墙的情况下,我已经解决了Ubunt 16.04上的问题,使用
    
    sudo ufw允许在docker_gwbridge上进入
    sudo ufw允许在docker_gwbridge上外出
    sudoufw启用
    

    我对CentOS不太熟悉,但我相信下面的内容应该对您有所帮助,或者至少可以作为一个提示
    
    sudo firewall cmd--permanent--zone=trusted--change interface=docker\u gwbridge
    sudo systemctl重新启动防火墙d
    
    您可能还需要重新启动docker

    / # 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