从 docker 容器连接到本地 mongodb

Posted

技术标签:

【中文标题】从 docker 容器连接到本地 mongodb【英文标题】:connecting to local mongodb from docker container 【发布时间】: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中吗? 没有。它作为独立服务器运行。 docs.docker.com/engine/reference/run/#network-host 尝试找出您的 PC 本地 IP 地址而不是容器地址并将其添加到 mongo 连接配置中 @VladHolubiev 成功了。谢谢! 【参考方案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

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

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

从 docker 容器连接到主机 mongodb

无法连接到 Docker 容器内的 MongoDB

Springboot 应用程序无法使用 docker-compose 连接到 MongoDB 容器

在单独的 docker 容器 (AWS ECS) 中连接到 MongoDB

如何从 Docker 容器连接到本地 Redis 服务器?