无法从一个Docker容器ping到另一个容器

6l7fqoea  于 2023-05-28  发布在  Docker
关注(0)|答案(4)|浏览(252)

我们遇到了一个长期存在的网络问题。简而言之,一个容器不能ping(或ssh)另一个容器。有谁有时间和我沿着思考一下吗?

我们的设置:

  • Docker CE 18.06.03(在尝试修复问题时,我们从17.03升级,但没有帮助)
  • Swarm Classic(单机版)1.2.9
  • Consul作为Swarm后端,在五个节点上运行成员
  • 总共七个节点,其中六个承载容器
  • 每个容器在启动时都连接到一个覆盖网络
    到目前为止,我们已经尝试了:

这个问题在很大程度上难倒了我们。我们已经花了很多时间在上面,做了很多基本的故障排除,还有一些更高级的故障排除(很乐意详细说明)。(但我不认为我已经用尽了我们的选择,所以请不要犹豫,建议任何你可能认为会工作。)它是不一致的(发生在不同的图像,不同的节点),间歇性的,长期的(几个月)。我们做了两个更改,其中一个是MAC地址分配的解决方案(解释如下:https://github.com/docker/libnetwork/pull/2380;实际解决方法:https://github.com/systemd/systemd/issues/3374#issuecomment-452718898),这确实改善了这种情况,包括从日志中删除MAC地址分配错误。我们还进行了升级以获得此修复程序(https://github.com/docker/libnetwork/pull/1935),该修复程序处理IP重用。这也减少了问题(当时,没有容器可以通信)。我还使用netshoot容器运行了一些基础测试(如果你想了解更多信息,请告诉我)。
我们有一个解决方法来解决给定容器损坏的问题:我们删除这个容器的Consul数据,然后停止并重新启动它。据我所知,这似乎不是Consul数据本身的问题,而是来自Docker/Swarm在容器启动时重置了几个网络配置(如果这似乎引发了任何人的阅读,我可以说更多)。然后,容器可以经常ping其他容器,但并不总是。

具体问题:

似乎有一个时间窗口,在此期间,情况可能会更糟。它不一定与同时启动多个容器有关,但有一个清晰的模式:在一些时间窗口期间,容器没有被适当地配置为彼此通信。您会想到哪些故障排除步骤?
下面的内容是尝试从另外两个容器ping一个容器(82afb0dccbcc)的输出。它起初失败了,但后来成功了。
第一次尝试ping容器时,在2019-12-10T23:57:52+00:00

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82afb0dccbcc: user___92397089 crccheck/hello-world
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PING 82afb0dccbcc (172.24.0.165) 56(84) bytes of data.^M
^M
--- 82afb0dccbcc ping statistics ---^M
4 packets transmitted, 0 received, 100% packet loss, time 3033ms^M
^M
PING 82afb0dccbcc (172.24.0.165) 56(84) bytes of data.^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=2 ttl=64 time=0.083 ms^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=3 ttl=64 time=0.072 ms^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=4 ttl=64 time=0.073 ms^M
^M
--- 82afb0dccbcc ping statistics ---^M
4 packets transmitted, 3 received, 25% packet loss, time 3023ms^M
rtt min/avg/max/mdev = 0.072/0.076/0.083/0.005 ms^M
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

在上面的第一个ping测试中,我们注意到第一个容器的数据包丢失率为100%,第二个容器的数据包丢失率为25%。
几分钟后(2019-12-10T23:57:52+00:00),82afb0dccbcc可以从两个容器成功ping通:

82afb0dccbcc: user___92397089 crccheck/hello-world
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ping from ansible-provisioner:
PING 82afb0dccbcc (172.24.0.165) 56(84) bytes of data.^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=1 ttl=64 time=0.056 ms^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=2 ttl=64 time=0.073 ms^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=3 ttl=64 time=0.077 ms^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=4 ttl=64 time=0.087 ms^M
^M
--- 82afb0dccbcc ping statistics ---^M
4 packets transmitted, 4 received, 0% packet loss, time 3063ms^M
rtt min/avg/max/mdev = 0.056/0.073/0.087/0.012 ms^M
ping from ansible_container:
PING 82afb0dccbcc (172.24.0.165) 56(84) bytes of data.^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=1 ttl=64 time=0.055 ms^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=2 ttl=64 time=0.055 ms^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=3 ttl=64 time=0.060 ms^M
64 bytes from user___92397089.wharf (172.24.0.165): icmp_seq=4 ttl=64 time=0.085 ms^M
^M
--- 82afb0dccbcc ping statistics ---^M
4 packets transmitted, 4 received, 0% packet loss, time 3062ms^M
rtt min/avg/max/mdev = 0.055/0.063/0.085/0.015 ms^M
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
inkz8wg9

inkz8wg91#

您需要创建一个网络并将两个容器连接到该网络。
Docker嵌入式DNS服务器为连接到给定网络的容器启用名称解析。这意味着任何连接的容器都可以通过其容器名称ping同一网络上的另一个容器。
在container1中,您可以通过名称ping container2。因此,显式指定容器的名称非常重要,否则将无法工作。
创建两个容器:

docker run -d --name container1 -p 8001:80 test/apache-php
docker run -d --name container2 -p 8002:80 test/apache-php

现在创建一个网络:

docker network create myNetwork

然后将容器连接到网络:

docker network connect myNetwork container1
docker network connect myNetwork container2

检查您的容器是否是新网络的一部分:

docker network inspect myNetwork

现在测试连接,您将能够从container1 ping container2:

docker exec -ti container1 ping container2
2w2cym1i

2w2cym1i2#

我实际上是随机遇到这个问题的,但在我的情况下,两个容器已经在同一个网络上,所以我很困惑为什么一个容器不能ping另一个容器。
直到我运行docker network inspect myNetwork,随机注意到由于某种原因,两个容器都被分配了相同的mac地址...不知道为什么会这样甚至怎么会这样显然,这将排除ping,因为在LAN上,交换逻辑使用mac地址来路由流量。
我不得不停止并删除容器,然后重新创建它来更改Mac地址。

iq0todco

iq0todco3#

如果有任何webapp正在您的任何一个容器上运行,并且您想要从另一个容器ping/调用任何端点并想要使用响应,那么您可以按照以下步骤操作-
首先使用Docker网络建立容器间通信

1. docker network create dockerContainerCommunication

现在将容器连接到网络dockerContainerCommunication

2. docker network connect dockerContainerCommunication container1
3. docker network connect dockerContainerCommunication container2

现在启动你的容器(如果还没有启动)

4. docker start container1
5. docker start container2

1.检查您的网络。在这里,您还可以找到容器的IP地址。docker network inspect dockerContainerCommunication
1.现在连接到任何一个你想要使用Web应用程序的容器,然后使用curl +你在第6步中找到的IP地址ping其他容器。

docker attach container1

docker attach container2

然后运行curl命令

curl http://IP_ADDRESS:PORT_ON_WHICH_APP_IS_RUNNING/api/endpointPath

希望能帮上忙。

v2g6jxz6

v2g6jxz64#

如果你得到这个答案是因为其他人没有帮助,尝试重新启动你的电脑:)
我在重新安装Docker后也遇到了类似的情况。更准确地说,我运行Ubuntu,并使用Snap安装了Docker。由于某种原因,我需要使用apt安装它,所以我从snap中删除并使用apt安装。

  • 启动了一个新的终端
  • docker run hello-world运行正常
  • Docker DNS似乎正在工作,容器尝试使用主机名连接,正确的内部IP已解析
  • 要再次检查:docker exec -it mycontainer ping othercontainer将显示它试图ping通内部172.x.x.x IP
  • 我交叉引用了docker inspect的IP- IP正确
  • Ping从未返回-超时

万福玛丽:重启我的笔记本电脑-工作🎉

相关问题