Windows Docker容器无法ping通主机。

5

我在运行一个windows docker容器,这个容器运行在一个Windows Server 2016主机上,使用默认配置。

当使用命令:

docker run -it microsoft/windowsservercore powershell

启动docker容器后,运行以下命令:

ping <hostIPAddress>

会显示请求超时。我已经检查过,可以ping通8.8.8.8和google.com等网址,甚至在同一子网内的其他机器都可以ping通,唯独无法ping通主机。

我已经添加了‘--dns’到‘docker run’命令中,但这只允许我通过主机名而不是IP地址来ping通主机。

有没有其他人遇到过这个问题并且有解决方案?


我现在也遇到了同样的问题,你有没有找到解决办法呢? - Martin
仍然没有解决方案,恐怕无法解决。 - WillM
几个月后。这个问题有解决方案了吗?我看到有些人正在放弃整个NAT的想法。 - Mark
6个回答

3
我找到了一个折衷方案(我不想称它为解决方案): Windows容器网络驱动程序:创建一个“透明”的网络:
docker network create -d transparent trans

将容器连接到此网络

docker run --network=trans ...

重要提示:请注意,使用这个网络的容器需要从主机子网获取IP地址,并且直接暴露给它。

可能相关(这是关于从主机访问容器):

根据https://github.com/Microsoft/Virtualization-Documentation/issues/253#issuecomment-217975932的说法(JMesser81):

这是我们 Windows NAT 实现(WinNAT)中已知的限制,即您无法从容器(NAT 主机)直接访问静态端口映射中的外部端口。


1
在我的情况下,我有一个在我的Windows主机上运行的企业管理的McAfee防火墙。我无法添加任何额外的防火墙规则,但幸运的是有一条规则允许从172.16.0.0/24访问。
我使用了“docker network create -d transparent trans”,它按照描述工作,但我不满意分配给容器的来自主机网络的IP地址。
我做了以下操作:
  • docker network create --driver=nat --subnet=172.16.0.0/24 br0
  • 将--network=br0添加到我的docker run命令中

1
希望这能帮到某些人。
在 Windows 10 上,当在 0.0.0.0:5057 上托管 Linux 容器时,我能够使用在控制面板>所有控制面板项目>网络连接中找到的 vEthernet(默认开关)NIC 的 IP 地址从我的 Windows 主机(PowerShell)ping 服务器。

Win10 host IP of Linux Container


原始问题是如何从Docker容器中ping主机,而不是如何从主机ping容器。 - undefined

0

我遇到了同样的问题。

我的解决方法是重新启动 Docker 服务,之后它就可以正常工作了。我仍在寻找一个永久性的解决方案。

root@a6c40eb25cbf:/# ping xxx.xx.xx.xxx
PING xxx.xx.xx.xxx (xxx.xx.xx.xxx): 56 data bytes
64 bytes from xxx.xx.xx.xxx: icmp_seq=0 ttl=37 time=3.541 ms
64 bytes from xxx.xx.xx.xxx: icmp_seq=1 ttl=37 time=2.643 ms
64 bytes from xxx.xx.xx.xxx: icmp_seq=2 ttl=37 time=1.857 ms
^C--- xxx.xx.xx.xxx ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss

0

这对我有效,希望对你也有用。

目前,在Windows上运行Docker,必须安装WSLWSL2并启用虚拟化。 从PowerShell安装WSL的命令如下command

wsl --install -d Ubuntu

显然,您需要在Windows上下载并安装Docker Desktop。安装后,需要从Docker桌面设置中启用WSL集成。

enter image description here

在配置好WSL和Docker桌面版之后,您可以创建/使用容器。例如:

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

最后,您必须确定WSL的IP,您必须打开第一步安装的Linux发行版,在我们的情况下是Ubuntu,这将打开您的终端,然后我们将执行以下操作:
ifconfig

你将会识别出 eth0 的 IP。例如:172.27.123.123

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 172.27.123.123  netmask 255.255.240.0  broadcast 172.27.127.255
    inet6 fe80::215:5dff:fecf:b4  prefixlen 64  scopeid 0x20<link>
    ether 00:15:5d:cf:00:b4  txqueuelen 1000  (Ethernet)
    RX packets 4389  bytes 299784 (299.7 KB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 4343  bytes 315643 (315.6 KB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

现在你可以在Windows的CMD中ping这个IP地址。

注意:连接将取决于容器的端口,例如:172.27.123.123:8080。


0
最近我在尝试使用Docker和WSL2时遇到了这个问题。我尝试了改变VSCode/Xdebug的设置,禁用防火墙,以及各种互联网/网络故障排除步骤,但是似乎没有任何修复的办法或者任何原因可以解释为什么我的Docker容器无法访问我的WSL2主机IP。
最后,我绝望地卸载了Docker并重新安装,然后神奇地发现Xdebug又可以工作了!所以如果其他方法都失败了,试试重新安装Docker Desktop。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接