gpt4 book ai didi

docker swarm 容器连接到主机端口

转载 作者:行者123 更新时间:2023-12-04 20:32:25 28 4
gpt4 key购买 nike

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

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

欲了解更多信息,我正在关注此 Docker Daemon Metrics在所有主机上公开新的 docker 指标 API 的指南,然后将该主机端口代理到覆盖网络,以便 Prometheus 可以从所有 swarm 主机上抓取指标。

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

我的 swarm 中的每个容器都有一个用于 docker-gwbridge 网络的网络接口(interface):

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 请求。
  • 谁能解释一下为什么这在 Docker Daemon Metrics 中概述的容器内不起作用?指导?
  • 如果容器在 172.18.0.1 网络上有一个网络接口(interface),并且为 172.18.0.1 配置了路由,为什么从容器内 ping 到 172.18.0.1 失败?
  • 如果这不是从 swarm 容器中访问主机端口的有效方法,那么如何实现这一点呢?

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

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

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

    最佳答案

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

    在不禁用防火墙的情况下,我已经解决了我在 Ubuntu 16.04 上的问题,使用
    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。

    关于docker swarm 容器连接到主机端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43307645/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com