从 Docker 容器内部如何连接到主机的 localhost?


假设您在主机上有一个 Nginx 容器内运行的 Nginx Web 服务器,并且您在主机上运行一个 MySQL 数据库。现在,您想从 Nginx 容器访问主机上的 MySQL 服务器。并且,MySQL 在您的 localhost 上运行,主机没有将任何端口暴露给外部世界。因此,我们可以得出结论,MySQL 仅绑定到 localhost 上运行,并且无法访问外部世界,因为它没有绑定到 IP 地址。

在本文中,我们将解释从容器访问在您的 localhost 或主机上的任何其他程序上运行的 MySQL 的不同方法。

简而言之,如果您使用的是 Docker for Windows 或 Mac,您可以简单地使用 host.docker.internal 代替 127.0.0.1 连接到 MySQL。如果您使用 **--add-host host.docker.internal:host-gateway** 选项在本地 Linux 机器上启动 Docker 容器,您甚至可以在 Linux 主机上的连接中使用 host.docker.internal 字符串。

现在,让我们详细讨论解决方案。

方案 1。

在 Linux 机器上,一个简单的解决方案是使用 **--network=”host”** 选项以及 Docker run 命令。之后,Docker 容器中的 localhost (127.0.0.1) 将指向主机 Linux 机器。这将运行一个网络设置为主机的 Docker 容器。

此容器将与主机共享网络,并且容器的 localhost 将指向主机。请注意,现在从 Docker 容器暴露的任何端口都在您的主机上打开,并且无需使用发布选项。

您可以使用以下命令验证这一点。

在您的本地机器上 -

$ ip addr show eth0

以及运行容器时 -

$ docker run -it --network=host ubuntu:latest ip addr show eth0

执行这些命令后,您会发现容器和主机具有相同的 IP 地址并共享相同的网络堆栈。

方案 2。

如果您使用的是 Mac 主机,您可以使用 -

HOSTNAME= docker.for.mac.host.internal

或者

HOSTNAME = docker.for.mac.localhost

在您的 Docker run 命令中。然后您可以使用 -

mysql -uroot -hdocker.for.mac.localhost

在您的 Docker 容器内访问在您的主机上运行的 MySQL。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

方案 3。

您还可以使用桥接网络模式从 Docker 容器访问在主机上运行的 MySQL 服务。为此,您需要确保 MySQL 服务正在积极监听 172.17.42.1 地址的所有连接。您可以在 MySQL 配置文件中包含 **bind-address = 172.17.42.1**。

在主机模式下,您可以使用 -

**bind-address = 127.0.0.1** 在您的 MySQL 配置文件中,然后您可以从您的容器连接到 localhost。

$ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p

总而言之,这些是从 Docker 容器轻松连接到主机上运行的 MySQL 服务的各种方法。简而言之,您可以使用 **--network=host** 将 localhost 与 Docker 容器绑定,并使用主机名“127.0.0.1”从容器内访问 MySQL 服务。根据您使用的是 Mac、Windows 还是 Linux 主机,您可以选择最适合您自身需求的解决方案。

更新于:2021年8月6日

13K+ 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告