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" ]