Node.js Nodejs应用程序docker无法连接到mongodb docker容器
我有一个Node.js Nodejs应用程序docker无法连接到mongodb docker容器,node.js,mongodb,docker,Node.js,Mongodb,Docker,我有一个nodejs应用程序,它已停靠,需要一个复制的MongoDB数据库。我已经在docker compose中构建了我的复制MongoDB,并且工作得很好。如果我运行命令docker inspect MongoDB primary | grep IPAddress其打印: "IPAddress": "", "IPAddress": "172.18.0.2", 现在在我的应用程序中,我将此ip作为mongoconnection字符串(当然是协议名)提供,但应用程序无法
nodejs
应用程序,它已停靠,需要一个复制的MongoDB数据库。我已经在docker compose中构建了我的复制MongoDB,并且工作得很好。如果我运行命令docker inspect MongoDB primary | grep IPAddress
其打印:
"IPAddress": "",
"IPAddress": "172.18.0.2",
现在在我的应用程序中,我将此ip作为mongoconnection字符串(当然是协议名)提供,但应用程序无法连接到MongoDB并抛出此错误消息(应用程序也是docker容器):
这是我的mongodb docker撰写文件:
version: '2'
services:
mongodb-primary:
image: 'bitnami/mongodb:latest'
environment:
- MONGODB_REPLICA_SET_MODE=primary
volumes:
- 'mongodb_master_data:/bitnami'
mongodb-secondary:
image: 'bitnami/mongodb:latest'
depends_on:
- mongodb-primary
environment:
- MONGODB_REPLICA_SET_MODE=secondary
- MONGODB_PRIMARY_HOST=mongodb-primary
- MONGODB_PRIMARY_PORT_NUMBER=27017
mongodb-arbiter:
image: 'bitnami/mongodb:latest'
depends_on:
- mongodb-primary
environment:
- MONGODB_REPLICA_SET_MODE=arbiter
- MONGODB_PRIMARY_HOST=mongodb-primary
- MONGODB_PRIMARY_PORT_NUMBER=27017
volumes:
mongodb_master_data:
driver: local
我的节点js应用程序dockerfile是:
FROM node:6.0
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm install --only=productio
# Bundle app source
COPY . .
EXPOSE 3001
CMD [ "npm", "start" ]
如何修复此问题?您的
docker compose
不会像您的主机PC一样自动将tcp端口公开给外部世界(我假设您的节点在主机上运行,并且不包括在docker compose
中)。这是docker bridge networks的行为,您可以在
您必须执行以下操作之一:
将NodeJs容器包含到docker compose
或
暴露来自docker compose.yml的端口您的docker compose
不会像您的主机PC一样自动将tcp端口暴露到外部世界(我假设您的nodeJs
在主机上运行,不包括在docker compose
中)。这是docker bridge networks的行为,您可以在
您必须执行以下操作之一:
将NodeJs容器包含到docker compose
或
暴露docker compose.yml中的端口
我遇到了同样的问题,添加了端口为我解决了这个问题。
确保您的连接url包含图像名称:
mongodb://mongo:27017/
而不是本地主机
mongo:
图片:mongo
揭露:
- 27017
端口:
- "27017:27017"
卷数:
-./data/db:/data/db
我也遇到了同样的问题,添加了端口为我解决了这个问题。
确保您的连接url包含图像名称:
mongodb://mongo:27017/
而不是本地主机
mongo:
图片:mongo
揭露:
- 27017
端口:
- "27017:27017"
卷数:
-./data/db:/data/db
欢迎提供更多详细信息。至少docker-run
命令和更好的Dockerfile
@grapes我编辑了我的问题。您可能需要为容器提供端口映射,您确定已经完成了吗care@grapes当我键入mongo 172.18.0.2
时,它与主mongo实例的连接没有任何错误。我认为其他容器应该以这种方式连接,但应用程序不能。您试图从哪里运行应用程序?您不应该将该内部IP地址用于任何用途(甚至不应该查找),如果您重新生成容器并且无法从非主机访问,则该地址可能会更改。欢迎提供更多详细信息。至少docker-run
命令和更好的Dockerfile
@grapes我编辑了我的问题。您可能需要为容器提供端口映射,您确定已经完成了吗care@grapes当我键入mongo 172.18.0.2
时,它与主mongo实例的连接没有任何错误。我认为其他容器应该以这种方式连接,但应用程序不能。您试图从哪里运行应用程序?您不应该将该内部IP地址用于任何事情(甚至不应该查找),如果您重新生成容器并且无法从非主机访问,则该地址可能会更改。谢谢。当我在docker compose上添加节点应用程序时,应该使用哪个地址?我认为IP地址不再有效。我应该使用主机名或docker名称而不是IP地址吗?您不应该再使用IP地址,然后使用主机名。主机名是服务的名称,例如mongodb primary
,谢谢。当我在docker compose上添加节点应用程序时,应该使用哪个地址?我认为IP地址不再有效。我应该使用主机名或docker名称而不是IP地址吗?您不应该再使用IP地址,然后使用主机名。主机名是服务的名称,例如mongodb primary
FROM node:6.0
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm install --only=productio
# Bundle app source
COPY . .
EXPOSE 3001
CMD [ "npm", "start" ]