我对容器和Docker还不熟悉。在我的Windows 10笔记本电脑上(版本20H2 Build 19042.630),我安装了WSL2和Docker Desktop(Docker Engine v19.03.13)。当我运行下面的命令(来自docker文档)时:
容器可以正常启动,但我无法从WSL或Windows 10主机访问该容器。
在WSL中,如果我输入
从Windows 10主机上,如果我打开浏览器并尝试访问http://127.0.0.1,它只会抛出404错误。
从Windows 10主机上,当我打开Docker Desktop应用程序时,它显示容器正在运行并侦听端口80,但如果我停止容器...然后尝试重新启动它,它会抛出一个错误,指出:
docker run -d -p 80:80 docker/getting-started
容器可以正常启动,但我无法从WSL或Windows 10主机访问该容器。
在WSL中,如果我输入
curl http://127.0.0.1
,它会返回错误curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
从Windows 10主机上,如果我打开浏览器并尝试访问http://127.0.0.1,它只会抛出404错误。
从Windows 10主机上,当我打开Docker Desktop应用程序时,它显示容器正在运行并侦听端口80,但如果我停止容器...然后尝试重新启动它,它会抛出一个错误,指出:
(HTTP code 500)服务器错误 - 端口不可用:listen tcp 0.0.0.0:80:bind:尝试访问被其访问权限禁止的套接字
我已经尝试完全卸载WSL和Docker Desktop并重置TCP/IP堆栈,但最终结果仍然相同。我在桌面PC上执行了完全相同的安装步骤,一切正常,没有任何问题。我注意到在桌面PC上,第一次尝试访问“getting-started”容器时,它会产生一个弹出窗口,允许流量通过我的防火墙。我在笔记本电脑上从未得到过这个提示。我将PC上的防火墙规则与笔记本电脑进行了比较,并且PC对com.docker.backed
应用程序有4个规则,而笔记本电脑没有。我在笔记本电脑上手动复制了这些规则,但是并没有改变行为。
编辑:
在进一步研究此问题后,我发现了问题所在。容器尝试监听的端口已被我的笔记本电脑排除。找到了下面链接的Github问题,其中使用命令netsh interface ipv4 show excludedportrange protocol=tcp
显示了我的笔记本电脑上排除的端口列表。看起来是Hyper-V排除了这些端口,但Hyper-V存在于系统中的唯一原因是为WSL服务。截至今天,Github问题仍然未解决。