【问题标题】:connecting to local mongodb from docker container从 docker 容器连接到本地 mongodb
【发布时间】:2017-10-03 15:40:44
【问题描述】:

我有一个本地 mongoDB 服务器在 mongodb://127.0.0.1:27017 上运行。我的数据库名称是 localv2。我有一个带有 Dockerfile 的 node/express 应用程序,如下所示:

FROM node:7.5

RUN npm install -g pm2

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app
RUN npm install

COPY . /usr/src/app

EXPOSE 3002

ENV NODE_ENV local

CMD pm2 start --no-daemon server.js

server.js 文件通过以下代码连接到本地 mongodb:

app.db = mongoose.connect("mongodb://127.0.0.1:27017/localv2", options);

当我从使用上面的 Dockerfile 创建的映像启动容器时,这不起作用。我在某处读到 Docker 创建了一个具有自己网关 IP 地址的 VLAN。当我docker inspect我的容器时,我的网关IP地址:172.17.0.1。

即使将 mongodb 连接更改为

app.db = mongoose.connect("mongodb://172.17.0.1:27017/localv2", options)

并重新构建映像并启动一个新容器,我仍然收到错误:

MongoError: failed to connect to server [172.17.0.1:27017] on first connect [MongoError: connect ECONNREFUSED 172.17.0.1:27017]

运行容器的命令:docker run -p 3002:3002 image-name

请帮忙。

【问题讨论】:

  • 你如何运行你的mongo?它也在docker中吗?
  • 没有。它作为独立服务器运行。
  • 尝试找出您的 PC 本地 IP 地址而不是容器地址并将其添加到 mongo 连接配置中
  • @VladHolubiev 成功了。谢谢!

标签: node.js mongodb docker mongoose dockerfile


【解决方案1】:

在 Docker for Mac 上,如果您的 mongo 在本地主机上运行,​​您可以使用 host.docker.internal。您可以在 mongo 主机的 env 变量中读取代码并将其设置在 Dockerfile 中,如下所示:

ENV MONGO_HOST "host.docker.internal"

查看此处了解更多详情 https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

【讨论】:

  • 我更喜欢这个解决方案
【解决方案2】:

docker 容器与您的计算机是分开的,
因此您将无法连接到您的localhost
您应该在容器上运行 mongo 服务器并使用镜像名称进行连接。

mongodb://CONTAINER-NAME:port

【讨论】:

  • 这是一个更好的答案。
  • 这完全取决于你是否暴露了端口。如果您公开了内部 docker 容器端口,则可以使用 localhost 进行连接。
  • docker 容器是独立的但已连接,因此可以从容器内部连接到本地计算机,您只需要弄清楚本地计算机的 ip 地址在 docker 网络上是什么,这是当您可以指定本地机器名称并且 dns 将自动查找时,在他们破坏本地网络 dns 集成(〜版本 19.0)之前更容易
  • 如何在 docker-compose 文件中指定外部 mongo 数据库连接..
【解决方案3】:

在此处添加@vlad-holubiev 作为答案,因为它对我有用并帮助用户找到它。

使用network host option on docker run,如文档中所述:

将网络设置为托管容器将共享主机的网络 堆栈和来自主机的所有接口将可用于 容器。容器的主机名将与 主机系统。

docker run -d -e ROOT_URL=http://localhost -e MONGO_URL=mongodb://localhost:27017 --network="host"

【讨论】:

  • 试图解决同样的问题,不明白你是怎么用这个的:你用这个代码来运行你的容器?
  • 出现以下错误:节点:错误选项:--network=host!我该怎么办?
  • @jackOfAll,你用的是 windows/mac 操作系统吗?
  • @AbhishekPankar Mac
  • 网络主机只能在 linux 机器上工作。在这里查看docs.docker.com/network/host
猜你喜欢
  • 2019-06-26
  • 2018-04-11
  • 2019-02-24
  • 2018-01-09
  • 2015-11-28
  • 1970-01-01
  • 2017-11-10
  • 2018-12-01
  • 2021-05-06
相关资源
最近更新 更多