无法访问在WSL2中运行的Docker容器

4
我对容器和Docker还不熟悉。在我的Windows 10笔记本电脑上(版本20H2 Build 19042.630),我安装了WSL2和Docker Desktop(Docker Engine v19.03.13)。当我运行下面的命令(来自docker文档)时:
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问题仍然未解决。

无法绑定端口:Docker-for-Windows和Hyper-V排除重要端口范围但不使用 #3171


尝试映射到另一个端口时,'netsh'命令必须显示当前使用的端口。这就是发生在我身上的事情,但我的Windows已经将80端口绑定到其他服务上,我使用了另一个未使用的端口,现在可以正常工作了。 - Vielinko
2个回答

1
如果您的Docker容器内部使用localhost,则无法正常工作。我在wsl中使用docker时遇到了同样的问题,解决方法是将底层服务(在Docker内运行的服务)的IP更改为0.0.0.0
您可以通过执行docker ps来检查此内容。在我的情况下,我像这样运行了docker: docker run --rm -p 8080:8080 hello-python 然后将其绑定到以下端口(docker ps输出的一部分): 0.0.0.0:8080->8080/tcp 因此,基本上python代码必须使用0.0.0.0:8080而不是localhost:8080

0
在我的情况下,我能够通过以下命令找到 WSL 的 IP 地址: wsl hostname -I 我使用该 IP 地址和现有 Docker 容器的暴露端口,成功地运行了它。

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