我在 Ubuntu 上端口 80 上的 docker 容器中有一个 .net core 应用程序,它似乎绑定开始侦听 http://[::]:80 (ipv6)?。
我不认为这是 .net 特有的,而是 Ubuntu 盒子上的网络设置。
当我对本地主机执行 wget 时,我收到以下回复:
wget localhost
--2022-03-14 17:47:59-- http://localhost/
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html.27’
然而,当我使用地址 127.0.0.1 执行 wget 时,它会给出 404 not found。
wget 127.0.0.1
--2022-03-14 17:50:10-- http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2022-03-14 17:50:10 ERROR 404: Not Found.
从我读到的内容来看,这是由于 ipv6 和我的应用程序绑定到 ::
我尝试在 ubuntu 盒子上禁用 ipv6,除了阻止 wget localhost 返回任何内容之外没有任何效果。
谁能让我知道我做错了什么?
答案1
您当前正在侦听容器中的 IPv6 地址。
使用 时http://localhost
,您的操作系统将尝试 IPv4 和 IPv6。您可以在/etc/hosts
文件中验证这一点,因为 localhost 已映射到 IPv4 和 IPv6127.0.0.1
以及::1
.
例如,这是我的主机文件的一部分。
127.0.0.1 localhost
127.0.1.1 danny
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
# [...]
如果您想在仅侦听 IPv6 的同时访问容器,您可以使用http://localhost
您已经尝试过的方法或使用 IPv6 环回地址 来访问它http://[::1]
。括号应该是允许 URL 解释器识别主机的这一部分而不是端口分隔符。
例如,对于wget
,您可以像这样使用它:
wget http://[::1]
否则,您还需要侦听 IPv4 地址。因此,将其绑定到0.0.0.0:80
而不是[::]:80
允许您使用 来访问它http://127.0.0.1
。
综上所述,由于您在调用时确实收到了响应http://127.0.0.1
(它是 404,但它仍然是响应),这意味着可能有另一个服务正在侦听 IPv4 上的端口 80。因此,只需将其从 切换[::]:80
到0.0.0.0:80
可能会给您带来错误,表明其他东西正在使用该端口。