当前位置: 首页 > 知识库问答 >
问题:

docker swarm容器连接到主机端口

狄玉书
2023-03-14

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

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

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

我已经阅读了多个docker github问题#8395#32101#32277#1143-从这一点上,我的理解与docker Daemon指标中概述的相同。为了从swarm容器中连接到主机,我应该使用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 guide中概述的容器内不起作用吗
  2. 如果容器在172.18.0.1网络上有一个网络接口,并且为172.18.0.1配置了路由,那么为什么从容器内ping到172.18.0.1失败
  3. 如果这不是从swarm容器中访问主机端口的有效方法,那么如何实现这一点

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

经过进一步的挖掘,我注意到这似乎是一个防火墙问题。我发现我不仅无法从容器中ping172.18.0.1,而且根本无法ping我的主机!我尝试了我的域名、服务器的FQDN甚至其公共IP地址,但容器无法ping主机(我可以ping google/etc)。

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

共有1个答案

濮阳原
2023-03-14

首先,我欠你一个大大的谢谢。在我阅读你的编辑部分之前,我已经花了一天一夜的时间来解决一个类似的问题,但从未意识到魔鬼是防火墙。

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

我对CentOS不太熟悉,但我相信以下内容应该会对您有所帮助,或者至少可以作为一个提示sudo firewall-cmd--永久--zone=可信--change-接口=docker_gwbridgesudo systemctl restart firewalld您可能还需要重新启动docker。

 类似资料:
  • 问题内容: 所以我想连接到我在主机上运行的mongodb(DO Drop,Ubuntu 16.04)。它在localhost 的默认端口上运行。 然后,我使用mup将我的Meteor应用程序部署在我的DO Drop上,该DO Drop使用docker在容器内运行Meteor应用程序。到目前为止,一切都很好。使用标准连接URL将应用程序连接到mongodb。现在我有以下问题: 显然不能在docker

  • 问题内容: 我正在运行一个docker mysql映像,以下是docker-compose.yml文件的外观: 这很好。 我的问题是:如何从主机(我的Macbook)上的命令行mysql客户端连接到在该容器上运行的MySQL实例? 澄清: 我有一台装有Docker的Macbook 我有一个带有mysql的docker容器 我想从Macbook的终端连接到上述容器上运行的mysql实例 我不想使用命

  • (由于我对Docker或mysql管理的了解有限,这可能是一个愚蠢的问题,但由于我花了整整一个晚上讨论这个问题,所以我敢问这个问题。) 概括地说 我想在docker容器中运行mysql,并从我的主机连接到它。到目前为止,我取得的最好成绩是: 更多详细信息 我正在使用以下: 在有此文件的目录中,我可以成功地构建映像并运行它: 当我连接到图像上时,它似乎工作得很好: 然而,我并没有从主持人那里获得那么

  • 厘斯7.8 docker run -d -p 8080:80 --name nginxtest nginx docker ps CONTAINER ID Image PORTS NAMES xxxxxxxx nginx 0.0.0.0:8080- curl localhost:8080 < br > curl:(56)Recv失败:连接被对等方重置 netstat-tulpn<br>tcp6 0

  • 我正面临来自docker容器的MongoDB连接问题,我读了一些stackoverflow的答案,但没有帮助我解决我的问题。 我的application.yml文件有以下内容, 我的docker-compose文件有以下内容, 版本:'3.5'服务: sp-app-web-ui com.mongodb.mongosocketopenexception:异常打开socket sp-app-web-u

  • 我在一个代理之下,并且我在相当长一段时间内成功地推进git 现在我无法突然进入git 我已经设置了RSA密钥和代理,并对它们进行了双重检查,但没有结果,git向我抛出了页面标题中显示的错误。