Node.js应用程序docker无法连接到mongodb docker容器

时间:2018-12-25 13:33:49

标签: node.js mongodb docker

我有一个nodejs应用程序,该应用程序已docker化,并需要一个复制的MongoDB数据库。我已经在docker-compose中构建了复制的MongoDB,并且工作正常。如果我运行命令docker inspect MongoDB-primary |grep IPAddress,则其输出为:

"IPAddress": "",
            "IPAddress": "172.18.0.2",

现在在我的应用程序中,我将此IP作为mongoconnection字符串(当然带有协议名称)给出,但是应用程序无法连接到MongoDB并抛出此错误消息(应用程序也是docker容器):

 message: 'failed to connect to server [172.18.0.2:27017] on first connect [MongoNetworkError: connection 1 to 172.18.0.2:27017 timed out]',

这是我的mongodb docker compose文件:

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

我该如何解决?

2 个答案:

答案 0 :(得分:3)

您的docker-compose不会像主机PC一样自动将tcp端口公开给外部世界(我假设您的nodeJs在主机上运行,​​而没有包含在docker-compose中)。这是docker bridge networks的行为,您可以在https://docs.docker.com/network/bridge/

阅读更多内容

您必须执行以下一项操作:

将您的NodeJs容器包含到docker-compose

暴露来自docker-compose.yml的端口

答案 1 :(得分:0)

我遇到了同样的问题,并添加了端口为我修复了该问题。 确保您的连接网址包含图片名称: mongodb://mongo:27017/,而不是本地主机。

mongo:
    image: mongo
    expose:
      - 27017
    ports:
      - "27017:27017"
    volumes:
      - ./data/db:/data/db