我们遇到了一个长期存在的网络问题。简而言之,一个容器不能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
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4条答案
按热度按时间inkz8wg91#
您需要创建一个网络并将两个容器连接到该网络。
Docker嵌入式DNS服务器为连接到给定网络的容器启用名称解析。这意味着任何连接的容器都可以通过其容器名称ping同一网络上的另一个容器。
在container1中,您可以通过名称ping container2。因此,显式指定容器的名称非常重要,否则将无法工作。
创建两个容器:
现在创建一个网络:
然后将容器连接到网络:
检查您的容器是否是新网络的一部分:
现在测试连接,您将能够从container1 ping container2:
2w2cym1i2#
我实际上是随机遇到这个问题的,但在我的情况下,两个容器已经在同一个网络上,所以我很困惑为什么一个容器不能ping另一个容器。
直到我运行
docker network inspect myNetwork
,随机注意到由于某种原因,两个容器都被分配了相同的mac地址...不知道为什么会这样甚至怎么会这样显然,这将排除ping,因为在LAN上,交换逻辑使用mac地址来路由流量。我不得不停止并删除容器,然后重新创建它来更改Mac地址。
iq0todco3#
如果有任何webapp正在您的任何一个容器上运行,并且您想要从另一个容器ping/调用任何端点并想要使用响应,那么您可以按照以下步骤操作-
首先使用Docker网络建立容器间通信
现在将容器连接到网络dockerContainerCommunication
现在启动你的容器(如果还没有启动)
1.检查您的网络。在这里,您还可以找到容器的IP地址。
docker network inspect dockerContainerCommunication
1.现在连接到任何一个你想要使用Web应用程序的容器,然后使用curl +你在第6步中找到的IP地址ping其他容器。
或
或
然后运行curl命令
希望能帮上忙。
v2g6jxz64#
如果你得到这个答案是因为其他人没有帮助,尝试重新启动你的电脑:)
我在重新安装Docker后也遇到了类似的情况。更准确地说,我运行Ubuntu,并使用Snap安装了Docker。由于某种原因,我需要使用apt安装它,所以我从snap中删除并使用apt安装。
docker run hello-world
运行正常docker exec -it mycontainer ping othercontainer
将显示它试图ping通内部172.x.x.x IPdocker inspect
的IP- IP正确万福玛丽:重启我的笔记本电脑-工作🎉