从docker容器连接到本地mongodb

cha*_*ryp 21 mongoose mongodb node.js docker dockerfile

我有一个在mongodb://127.0.0.1:27017上运行的本地mongoDB服务器.我的数据库名称是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
Run Code Online (Sandbox Code Playgroud)

server.js文件与本地mongodb有一个连接,代码如下:

app.db = mongoose.connect("mongodb://127.0.0.1:27017/localv2", options);
Run Code Online (Sandbox Code Playgroud)

当我从使用上面的Dockerfile创建的图像中旋转容器时,这不起作用.我在某地读到Docker创建了一个带有自己的gatway IP地址的VLAN.当docker inspect我的容器,我的网关IP地址:172.17.0.1.

即使改变mongodb连接

app.db = mongoose.connect("mongodb://172.17.0.1:27017/localv2", options)
Run Code Online (Sandbox Code Playgroud)

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

MongoError: failed to connect to server [172.17.0.1:27017] on first connect [MongoError: connect ECONNREFUSED 172.17.0.1:27017]
Run Code Online (Sandbox Code Playgroud)

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

请帮忙.

elp*_*dev 17

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

在docker上使用网络主机选项,如文档中所指定:

通过将网络设置为主机,容器将共享主机的网络堆栈,并且主机的所有接口都可供容器使用.容器的主机名将与主机系统上的主机名匹配.

docker run -d -e ROOT_URL=http://localhost -e MONGO_URL=mongodb://localhost:27017 --network="host"
Run Code Online (Sandbox Code Playgroud)


air*_*r44 13

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

ENV MONGO_HOST "host.docker.internal"

有关https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds的详细信息,请参见此处

  • 与其他所有解决方案相比,我更喜欢这个解决方案 (2认同)

Dan*_*aub 10

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

mongodb://CONTAINER-NAME:port
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更好的答案。 (2认同)