假设您在主机的 Nginx 容器中运行了一个 Nginx Web 服务器。您的主机上运行着一个 MySQL 数据库。现在,您想从 Nginx 容器访问主机中的 MySQL 服务器。此外,MySQL 运行在您的本地主机上,主机不会向外界公开任何端口。因此,我们可以得出结论,MySQL 必须仅在 localhost 上运行,并且外部世界无法访问,因为它不受 IP 地址的约束。
在本文中,我们将解释您可以通过哪些不同的方式从容器访问本地主机上运行的 MySQL 或主机中的任何其他程序。
在简短的讨论中总结一下,如果您使用的是 Windows 或 Mac 的 Docker,您可以简单地使用 host.docker.internal 而不是 127.0.0.1 连接到 MySQL。如果您使用--add-host host.docker.internal:host-gateway选项在本地 Linux 机器上启动了 Docker 容器,您甚至可以在 Linux 主机的连接中使用 host.docker.internal 字符串。
现在,让我们详细讨论解决方案。
在 Linux 机器上,一个简单的解决方案是使用--network=”host”选项和 Docker run 命令。之后,Docker 容器中的 localhost (127.0.0.1) 将指向主机 Linuxmachine.This运行一个 Docker 容器,并将网络设置设置为主机。
此容器将与主机共享网络,并且容器的 localhost 将指向主机。请注意,从您的 Docker 容器公开的任何端口现在都已在您的主机中打开,而且无需使用发布选项。
您可以通过使用以下命令列出 IP 地址来验证这一点。
在您的本地机器上 -
$ ip addr show eth0
在运行容器时 -
$ docker run -it --network=host ubuntu:latest ip addr show eth0
在执行这些命令时,您会发现容器和主机具有相同的 IP 地址并共享相同的网络堆栈。
如果您使用的是 Mac 主机,则可以使用 -
HOSTNAME= docker.for.mac.host.internal
要么
HOSTNAME = docker.for.mac.localhost
在您的 Docker 运行命令中。然后你可以使用 -
mysql -uroot -hdocker.for.mac.localhost
在您的 Docker 容器内访问在您的主机中运行的 MySQL。
您还可以使用桥接网络模式访问在 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将本地主机与您的 Docker 容器绑定,它们使用主机名“127.0.0.1”访问容器内的 MySQL 服务。根据您使用的是 Mac、Windows 还是 Linux 主机,您可以选择满足您自己需求的最佳解决方案。