簡體   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