我有一个在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
server.js文件与本地mongodb有一个连接,代码如下:
app.db = mongoose.connect("mongodb://127.0.0.1:27017/localv2", options);
当我从使用上面的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)
并重新构建图像并启动一个新容器,我仍然收到错误:
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
请帮忙。
答案 0 :(得分:14)
在这里添加@ vlad-holubiev作为答案,因为它对我有用并帮助用户找到它。
使用文档中指定的network host option on docker run:
将网络设置为主机容器将共享主机的网络 堆栈和来自主机的所有接口都可用于 容器。容器的主机名将与主机名匹配 主机系统。
docker run -d -e ROOT_URL=http://localhost -e MONGO_URL=mongodb://localhost:27017 --network="host"
答案 1 :(得分:11)
在Mac的Docker上,如果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 :(得分:10)
docker容器与您的计算机分开,
因此,您将无法连接到localhost
您应该在容器上运行mongo服务器并使用映像名称连接。
mongodb://CONTAINER-NAME:port