从 docker 容器连接到主机 mongodb

Posted

技术标签:

【中文标题】从 docker 容器连接到主机 mongodb【英文标题】:Connect to host mongodb from docker container 【发布时间】:2018-01-09 16:33:15 【问题描述】:

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

然后我使用mup 在我的 DO 液滴上部署我的 Meteor 应用程序,它使用 docker 在容器内运行我的 Meteor 应用程序。到目前为止,一切都很好。 一个标准的 mongodb://... 连接 url 用于将应用程序连接到 mongodb。 现在我有以下问题:

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

我已经阅读了很多关于此的 *** 帖子,我已经尝试过使用:

--network="host" - 没有像它所说的那样工作 0.0.0.0:80 已经在使用或类似的东西(nginx 代理) --add-host="local:<MY-DROPLET-INTERNET-IP>" 并通过 mongodb://...@local:27017... 连接:也无法正常工作,因为我只能从本地主机访问我的 mongodb,而不能从公共 IP 访问

这一定是个常见问题!

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

希望有人能帮忙!

【问题讨论】:

【参考方案1】:

您可以使用:172.17.0.1,因为它是容器可以看到的默认主机 IP。但是你需要配置Mongo来监听0.0.0.0

从 docker 18.03 起the recommendation 是连接到特殊的DNS 名称host.docker.internal

对于以前的版本,您可以使用 DNS 名称 docker.for.mac.localhostdocker.for.windows.localhost

【讨论】:

你好先生是我今天的英雄!非常感谢!!在任何地方都找不到这个非常简单的答案。 @Robert: 172.17.0.1 是 mongo 容器的 IP 地址还是默认网桥的网关 IP?我尝试了 172.17.0.1,但我的部署失败了。我的 mongodb 容器 IP 是 172.17.0.2。如果我提供该 IP,一切正常。但是,这些 IP 可能会根据特定容器的部署方式/时间而改变。 172.17.0.1是网关IP,是运行docker的主机(不是容器)。是的,如果定义了自定义 docker 网络,该 IP 可能是另一个 IP。 docker.for.mac.localhost 对我来说非常有用,0.0.0.0 不起作用。 docs.docker.com/docker-for-mac/networking(我想从容器连接到主机上的服务)现在似乎有一个内置的 DNS host.docker.internal 用于容器连接主机。【参考方案2】:

在 /etc/mongod.conf 中将 bindIp 从 127.0.0.1 更改为 0.0.0.0。然后就可以了

【讨论】:

请注意,如果在面向公众的服务器上绑定到 0.0.0.0 可能会导致安全问题。【参考方案3】:

或在 ubuntu 上启动 mongod,并带有一个标志以绑定所有 IP 地址作为临时解决方法(开发/学习目的)

$ mongod --bind_ip_all

【讨论】:

以上是关于从 docker 容器连接到主机 mongodb的主要内容,如果未能解决你的问题,请参考以下文章

无法从另一个容器连接到 mongodb docker 容器

从 docker 容器连接到本地 mongodb

docker桥接模式

无法连接到 Docker 容器内的 MongoDB

docker从容器连接到主机隧道

无法从我的 Docker 容器内部连接到主机的 localhost