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