📜  docker 访问主机 localhost (1)

📅  最后修改于: 2023-12-03 15:00:30.156000             🧑  作者: Mango

以 Docker 访问主机 localhost

当我们运行 Docker 容器时,默认情况下,Docker 容器只能访问自己的内部网络,无法直接访问宿主机的网络。但在某些情况下,我们可能需要在容器中访问宿主机的网络,比如访问宿主机上运行的服务。

问题描述

假设我们在本地开发一个 Web 应用程序,该应用程序运行在本机的 8080 端口。现在我们希望在 Docker 容器中访问该应用程序,该怎么做?

在容器中直接访问 localhost:8080 无法正常工作,因为容器中的 localhost 是容器本身而非宿主机。此时,我们需要使用特殊的 IP 地址来访问宿主机。

宿主机 IP 地址

在 Docker 中,有两个特殊的 IP 地址可以用于访问宿主机,分别是 host.docker.internalgateway.docker.internal

其中,host.docker.internal 可以用于访问宿主机自身,gateway.docker.internal 可以用于访问宿主机所在的网络,默认情况下这两个地址均可以使用。

使用 host.docker.internal

在容器中使用 host.docker.internal 可以访问宿主机的网络。

docker run --rm -it alpine:latest ping host.docker.internal

以上命令将在容器中执行 ping host.docker.internal 命令,并输出以下结果:

PING host.docker.internal (192.168.65.2): 56 data bytes
64 bytes from 192.168.65.2: seq=0 ttl=37 time=0.874 ms
64 bytes from 192.168.65.2: seq=1 ttl=37 time=0.873 ms
64 bytes from 192.168.65.2: seq=2 ttl=37 time=0.869 ms
64 bytes from 192.168.65.2: seq=3 ttl=37 time=0.871 ms
^C
--- host.docker.internal ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.869/0.872/0.874 ms

通过以上示例我们可以看到,容器可以成功访问宿主机的网络,并获得了正确的 IP 地址。

使用 gateway.docker.internal

在某些情况下,我们需要访问宿主机所在的网络而非宿主机本身,此时可以使用 gateway.docker.internal

假设我们在本地运行了一个 MySQL 服务,该服务运行在本机的 3306 端口。现在我们希望在容器中连接该服务,该怎么做?

我们可以将容器内部的 MySQL 客户端连接到 gateway.docker.internal:3306,从而访问宿主机上的 MySQL 服务。

总结

通过以上介绍,我们学习了如何在 Docker 容器中访问宿主机的网络。当需要访问宿主机时,可以使用 host.docker.internal,当需要访问宿主机所在的网络时,可以使用 gateway.docker.internal