当容器需要连接宿主机时,为什么必须将 localhost 替换为 host.docker.internal?

cha*_*hai 1 docker

我目前正在学习docker的基础知识。我了解到,当容器需要连接到主机时(假设我有一个本地 mysql 数据库),localhost它必须使用 as 域,而不是用作host.docker.internal域。

所以不要这样:

createConnection(
 host: "localhost",
 ...
)
Run Code Online (Sandbox Code Playgroud)

我会这样做:

createConnection(
 host: "host.docker.internal",
 ...
)
Run Code Online (Sandbox Code Playgroud)

我想我明白为什么会这样,但我只是想澄清为什么 docker 不明白什么localhost意思,以及为什么它必须替换为host.docker.internal.

提前致谢。

Chr*_*cke 6

docker 非常清楚“localhost”的含义:当您创建容器时,您正在创建一组只能相互看到的隔离进程。它们存在于自己的 cgroup 中用于进程隔离,存在于网络命名空间中用于网络隔离。

因此,当某个容器中的某些服务侦听“localhost:8080”时,该容器中的其他进程可以连接到该端口。但其他容器中的进程则不能。他们可能需要有自己的进程在 localhost:8080 上监听。

在这种环境中,每个容器在虚拟网络上都有自己的 IP 地址,并且需要桥接到主机网络,localhost当然意味着“容器”,而不是“容器主机操作系统”。

这不是 docker 不理解的情况。这种到容器的本地主机重定向是容器化带来的隔离的基础。