在 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 地址。