从Docker容器连接到主机上的MongoDB

27

我想连接到运行在我的主机上(DO droplet,Ubuntu 16.04)的mongodb。它在默认的本地端口27017上运行。

然后我使用mup部署我的Meteor应用程序到我的DO droplet上,它使用docker在容器中运行我的Meteor应用程序。到目前为止一切顺利。 使用标准的 mongodb://... 连接URL将应用程序连接到mongodb。 现在我遇到了以下问题:

mongodb://...@localhost:27017... 显然在docker容器内不起作用,因为 localhost 不是主机的 localhost。

我已经阅读了许多关于此问题的stackoverflow帖子,我已经尝试过使用:

  • --network="host" - 没有起作用,因为它说端口 0.0.0.0:80 已经被占用或类似的消息(nginx代理)
  • --add-host="local:<MY-DROPLET-INTERNET-IP>" 并通过 mongodb://...@local:27017... 连接:由于我只能从 localhost 访问我的 mongodb 而不能从公共 IP 访问,因此也无法正常工作

这一定是一个常见的问题!

tl;dr - 有什么正确的方法可以在docker容器内暴露主机的localhost,以便我可以连接到运行在主机上的服务?(包括它们的端口,例如27017)。

希望有人能够帮助!

4个回答

43
你可以使用:172.17.0.1 作为默认主机IP,容器可以看到它。但是您需要配置Mongo以侦听0.0.0.0
从Docker 18.03开始,建议连接到特殊的DNS名称host.docker.internal
对于早期版本,您可以使用DNS名称docker.for.mac.localhostdocker.for.windows.localhost

您真是今天的英雄!非常感谢您!我在其他地方找不到这个非常简单的答案。 - Patrick DaVader
@Robert:172.17.0.1是mongo容器的IP地址还是默认桥接的网关IP?我尝试使用172.17.0.1但部署失败。我的mongodb容器IP是172.17.0.2。如果我使用该IP,一切正常。然而,这些IP可能会根据特定容器的部署方式/时间而更改。 - aman_novice
172.17.0.1 是网关 IP,它是运行 Docker 的主机(而不是容器)。如果定义了自定义的 Docker 网络,则该 IP 可能是另一个。 - Robert
4
docker.for.mac.localhost 对我的情况非常有用,0.0.0.0 不能使用。 - dimpiax
1
似乎现在容器内置了一个名为 host.docker.internal 的 DNS,用于连接主机。 - Ting Yi Shih
显示剩余2条评论

3

在 /etc/mongod.conf 中将 bindIp 从 127.0.0.1 改为 0.0.0.0。这样它就会工作了。


请注意,在公共服务器上绑定到0.0.0.0可能会导致安全问题。 - Cristik

0

或者在 Ubuntu 上使用一个标志启动 mongod,将所有 IP 地址绑定为临时解决方法(用于开发/学习目的)

$ mongod --bind_ip_all

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接