从 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.localhost
或 docker.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的主要内容,如果未能解决你的问题,请参考以下文章