Docker自定义网络无法访问宿主机端口解决办法

内容纲要

在 Docker 中,自定义网络中的容器默认情况下是无法访问宿主机上的端口的。这是因为在自定义网络中,容器之间是互联的,但相对于宿主机来说,它们处于独立的网络命名空间中。

如果您需要让自定义网络中的容器可以访问宿主机上的端口,可以使用特殊的 DNS 名称 host.docker.internal,该名称会被解析为宿主机的 IP 地址。例如,如果您想要从一个容器中访问宿主机上的 80 端口,则可以使用如下命令:

curl http://host.docker.internal:80

请注意,此功能目前仅适用于 Windows、macOS 和 Linux 的 Docker EE 和 Docker Desktop 版本。在其他环境中使用时可能会失败。
在 Ubuntu 20.04 上使用 Docker,是支持 host.docker.internal 这个特殊的 DNS 名称的。

但需要注意的是,这个功能在 Docker for Linux 的版本中可能会有所不同。您可以通过以下命令来测试是否支持该功能:

docker run --rm alpine ping host.docker.internal

如果输出类似于以下内容,则说明 host.docker.internal 正常工作:

PING host.docker.internal (172.17.0.1): 56 data bytes
64 bytes from 172.17.0.1: seq=0 ttl=37 time=0.253 ms
64 bytes from 172.17.0.1: seq=1 ttl=37 time=0.253 ms
64 bytes from 172.17.0.1: seq=2 ttl=37 time=0.234 ms

请注意,要使 host.docker.internal 正常工作,您必须使用最新版本的 Docker,并且在启动 Docker 守护程序时,要将 --add-host 标志设置为 host.docker.internal:host-gateway

要查看容器在私有网络中的IP地址,您可以使用以下命令:

docker inspect --format '{{ .NetworkSettings.Networks.<network_name>.IPAddress }}' <container_name_or_id>

其中,<network_name> 是您的 Docker 网络的名称,可以通过运行 docker network ls 命令来列出所有可用网络。<container_name_or_id> 是您要查看 IP 地址的容器的名称或 ID。

例如,如果您的 Docker 网络名称为 my_network,您要查看名为 my_container 的容器在该网络中的 IP 地址,则可以运行以下命令:

docker inspect --format '{{ .NetworkSettings.Networks.my_network.IPAddress }}' my_container

此命令将输出容器在 my_network 网络中分配的 IP 地址。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注