WSL2和Docker Desktop for Windows的网络问题

11

TL;DR

使用WSL2和Docker Desktop for Windows时,经常遇到网络问题。通常情况下,我可以通过找到WSL2实例的IP地址,并从容器内部引用该IP地址来访问从WSL2实例(在WSL2术语中称为“distribution”)启动的端口。但今天出现了问题。

我想要弄清楚是什么出了问题,而不是一遇到WSL2+DockerDesktop相关问题就重启电脑。可能是企业的Forticlient VPN也有干扰,但这不是我的选择。

Details

我通过以下方式找到IP:

WSL2:» ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128 
bond0            DOWN           
dummy0           DOWN           
sit0@NONE        DOWN           
eth0             UP             172.26.183.209/20 fe80::215:5dff:fef9:cc5c/64 

WSL2机器的IP地址是172.26.183.209

现在我在WSL2进程中监听端口8080上的Web服务器可以通过http://172.26.183.209:8080访问,这也经过了来自WSL2的nmapcurl的确认:

WSL2@~» nmap -Pn -p 8080 172.26.183.209            
Starting Nmap 7.80 ( https://nmap.org ) at 2020-12-23 16:15 CET
Nmap scan report for ubuntu-wsl2 (172.26.183.209)
Host is up (0.000045s latency).

PORT     STATE SERVICE
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.02 seconds

WSL2@~» curl http://172.26.183.209:8080 > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

然而,从容器内部来看:

[root@0467b7ef17e7 /]# nmap -Pn -p 8080 172.26.183.209
Starting Nmap 7.70 ( https://nmap.org ) at 2020-12-23 15:12 UTC
Nmap done: 1 IP address (0 hosts up) scanned in 0.43 seconds
[root@0467b7ef17e7 /]# curl http://172.26.183.209:8080
curl: (7) Failed to connect to 172.26.183.209 port 8080: No route to host

它还可以在 docker-desktop WSL2 容器内部运行:

WSL2@~» wsl.exe -d docker-desktop wget http://172.26.183.209:8080
Connecting to 172.26.183.209:8080 (172.26.183.209:8080)     
Connecting to host.docker.internal:8180 (192.168.0.202:8180)
index.html           100% |********************************|  7308  0:00:00 ETA

仅限于容器外部,直到我重启。AAAAAAARRRRRHHHHHHHHHHHHHHHH :-)

一个提示——有一件事对我来说不合理——这是在容器内部吗:

[root@0467b7ef17e7 /]# ping 172.26.183.209
PING 172.26.183.209 (172.26.183.209) 56(84) bytes of data.
From 172.26.0.2 icmp_seq=1 Destination Host Unreachable
From 172.26.0.2 icmp_seq=2 Destination Host Unreachable
From 172.26.0.2 icmp_seq=3 Destination Host Unreachable
^C
--- 172.26.183.209 ping statistics ---
6 packets transmitted, 0 received, +3 errors, 100% packet loss, time 202ms
pipe 4

“172.26.0.2”是什么?嗯……

网络设置:

(由于它在企业网络中,我已经修改了Ethernet 3的IP地址)

WSL2@~» ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128 
bond0            DOWN           
dummy0           DOWN           
sit0@NONE        DOWN           
eth0             UP             172.26.183.209/20 fe80::215:5dff:fef9:cc5c/64 
WSL2@~» ipconfig.exe

Windows IP Configuration


Ethernet adapter Ethernet 3:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::405f:b7d2:70b4:b405%19
   IPv4 Address. . . . . . . . . . . : 10.14.11.17
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . : 10.14.11.18

Ethernet adapter Ethernet 4:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :

Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::7cd1:5641:ac65:7004%15
   IPv4 Address. . . . . . . . . . . : 192.168.0.202
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.0.1

Ethernet adapter VirtualBox Host-Only Network:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::f06d:9785:cff5:2ad0%6
   IPv4 Address. . . . . . . . . . . : 192.168.225.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

Wireless LAN adapter Wi-Fi:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :

Wireless LAN adapter Local Area Connection* 7:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :

Wireless LAN adapter Local Area Connection* 10:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :

Ethernet adapter Ethernet 2:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :

Ethernet adapter Bluetooth Network Connection:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :

Ethernet adapter vEthernet (WSL):

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::c507:3c2b:62d:7270%39
   IPv4 Address. . . . . . . . . . . : 172.26.176.1
   Subnet Mask . . . . . . . . . . . : 255.255.240.0
   Default Gateway . . . . . . . . . :

WSL2@~» route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.26.176.1    0.0.0.0         UG    0      0        0 eth0
172.26.176.0    0.0.0.0         255.255.240.0   U     0      0        0 eth0

你找到那个问题的解决方案了吗? - noobed
1
我在使用Docker、WSL2和Windows时仍然遇到间歇性的网络问题。我不确定是否再次遇到了这个特定的问题,因此没有解决方法。 - Peter V. Mørch
我也遇到了同样的问题。通过Docker容器进行的网络调用会超时。你找到解决这个问题的方法了吗? - QStorm
我已经离开了那家公司,现在(谢天谢地)我只使用Linux,所以无法提供更多信息。 - Peter V. Mørch
这对我有用 https://stackoverflow.com/questions/72530567/windows-wsl2-and-vpn-networking/72530568#72530568 - dannylee8
4个回答

13

我曾经遇到过类似的问题,WSL2的IP地址与Docker内部使用的172.17.0.0/16地址空间发生了冲突。在我的情况下,在WSL2中:

$ hostname -I
172.17.112.35

更改Docker使用的地址空间为另一个与本地网络不冲突的地址解决了此问题。在Docker Desktop的设置中,在Docker Engine配置页面上设置"bip": "192.168.200.1/24"
来源:https://www.beyondjava.net/docker-wsl-network enter image description here 重启电脑或WSL可以暂时“修复”此问题,因为分配给WSL的IP恰好不与Docker使用的地址冲突。

2
这应该是置顶的答案。它阐述了基本冲突和永久解决方案。 - Lance McCarthy
我遇到的症状非常微妙。在启动 dockerd 后,网络将在短时间内正常工作,但最终我的整个 WSL 系统将失去互联网连接。这个解决方案有效。 - Nick
你是第一个真正解决这个永无止境的问题的人。谢谢! - Brigante
太棒了!谢谢! - undefined

0

我仍在寻找解决方案,但我找到了一个更快的解决方法:只需重新启动WSL2。从cmd窗口输入:

wsl --shutdown

Docker 会抱怨它意外停止了,但是当你重新启动它时,它会给你另一个消息,但这不会造成任何伤害。


0

你尝试过只重启容器而不是整个机器吗?听起来像是容器丢失了其网络配置。许多容器的东西都是在启动时编写的,从未更新或不一致地更新。


我不记得了。这种情况只会偶尔发生。我相当确定,但并不确定我是否尝试过那个方法。我也相当确定,但并不确定我是否尝试确认症状是否存在于多个容器中。下次再发生时,我会记住的... - Peter V. Mørch

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

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