从 docker 容器访问主机数据库

新手上路,请多包涵

如果我在某个主机上运行 mysql 数据库,并且该主机也在运行 docker 容器:我将如何从主机上运行的 docker 容器中访问 mysql 数据库?

例如,有没有办法将主机端口发布到容器(与 docker run -p 相反)?

原文由 Ryan Anderson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 482
2 个回答

关于如何以一致、易于理解和可移植的方式执行此操作,有几个长期的讨论。没有完整的解决方案,但我会将您链接到下面的讨论。

在任何情况下,您都想尝试使用 –add-host 选项来 docker run 将主机的 IP 地址添加到容器的 /etc/host 文件中。从那里连接到任何所需端口上的主机很简单:

将条目添加到容器主机文件

您可以使用一个或多个 –add-host 标志将其他主机添加到容器的 /etc/hosts 文件中。此示例为名为 docker 的主机添加静态地址:

  $ docker run --add-host=docker:10.180.0.1 --rm -it debian
    $$ ping docker
    PING docker (10.180.0.1): 48 data bytes
    56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms
    56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms
    ^C--- docker ping statistics ---
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms

注意:有时你需要连接到 Docker 主机,这意味着获取主机的 IP 地址。您可以使用以下 shell 命令来简化此过程:

  $ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }'"
 $ docker run  --add-host=docker:$(hostip) --rm -it debian

文档:

https://docs.docker.com/engine/reference/commandline/run/

关于从容器访问主机的讨论:

https://github.com/docker/docker/issues/1143

https://github.com/docker/docker/issues/10023

原文由 John Petrone 发布,翻译遵循 CC BY-SA 3.0 许可协议

来自 18.03 文档:

我想从容器连接到主机上的服务

主机有一个不断变化的 IP 地址(如果您没有网络访问权限,则没有)。从 18.03 开始,我们的建议是连接到特殊的 DNS 名称 host.docker.internal ,它解析为主机使用的内部 IP 地址。

网关也可以通过 gateway.docker.internal 访问。

示例:这是我用于容器内的 MySQL 连接字符串以访问主机上的 MySQL 实例的内容:

 mysql://host.docker.internal:3306/my_awesome_database

原文由 Kevin Chen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进