Docker for Windows(和 Docker for Mac)利用带有 Linux 内核的虚拟机为 linux 容器提供运行时环境。
这意味着容器确实运行在与您的 Windows 主机不同的主机(具有另一个名称和 IP)上,如下图所示
|--------------------------------------------------------|
| Windows host |----------------------------------| |
| | Docker VM | |
| docker cli | |-------------| |-------------| | |
| | | ContainerA | | ContainerB | | |
| | | | | | | |
| | |-------------| |-------------| | |
| |----------------------------------| |
|--------------------------------------------------------|
docker cli 在 windows 上运行,但所有容器都在 Docker VM 内运行。
当你运行命令时
Docker VM 上的docker run --rm -it --name containerA -p 45678:45678 ubuntu:14.04 bash 端口 45678 被转发到 containerA 中的端口 45678。
此外,Docker CLI 负责将 Windows 主机上的端口 45678 转发到 Docker VM。这样做的结果是,当您在 Windows 机器上使用 localhost:45678 或 <my-windows-hostname>:45678 时,您最终会通过链进入容器:
<my-windows-hostname>:45678 -> <docker VM>:45678 -> ContainerA:45678
您要做的是通过 另一个 容器的已发布端口访问另一个容器,而不是 Windows 主机。为此,您需要拥有 Docker VM 的内部主机名或 IP,而不是 Windows 主机。这就是你可以使用host.docker.internal 的目的。
来自Docker for Windows Documentation
主机有一个不断变化的 IP 地址(如果您没有网络,则没有
使用权)。从 18.03 起,我们的建议是连接到
特殊的 DNS 名称 host.docker.internal,解析为内部
主机使用的 IP 地址。
这是出于开发目的,将
不适用于 Docker Desktop 之外的生产环境
窗户。