从 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的主要内容,如果未能解决你的问题,请参考以下文章
Springboot 应用程序无法使用 docker-compose 连接到 MongoDB 容器