【问题标题】:Nodejs application docker unable to connect to mongodb docker containerNodejs应用程序docker无法连接到mongodb docker容器
【发布时间】:2019-05-24 04:09:33
【问题描述】:

我有一个 dockerized 的 nodejs 应用程序,需要一个复制的 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" ]

我该如何解决这个问题?

【问题讨论】:

  • 欢迎了解更多详情。至少docker run 命令和更好的Dockerfile
  • @grapes 我编辑了我的问题。
  • 您可能需要为容器提供端口映射,您确定这样做了吗
  • @grapes 当我输入 mongo 172.18.0.2 时,它连接到主要的 mongo 实例,没有任何错误。我希望其他容器应该以这种方式连接,但应用程序不能。
  • 您试图从哪里运行应用程序?您永远不应该将该内部 IP 地址用于任何事情(甚至查找它),如果您重建容器并且无法从主机外访问,它可能会发生变化。

标签: node.js mongodb docker


【解决方案1】:

您的docker-compose 不会像您的主机 PC 那样自动将 tcp 端口暴露给外部世界(我假设您的nodeJs 在主机上运行并且不包含在docker-compose 中)。这是docker bridge networks的行为,你可以在https://docs.docker.com/network/bridge/阅读更多

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

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

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

【讨论】:

  • 谢谢。当我在 docker-compose 上添加我的节点应用程序时,我应该使用哪个地址?我认为该 IP 地址不再有效。我应该使用主机名或码头名称而不是 IP 地址吗?
  • 你不应该再使用 IP 地址了 - 使用主机名。主机名是服务的名称,例如mongodb-primary
【解决方案2】:

我遇到了同样的问题,添加 ports 为我解决了这个问题。 确保您的连接 url 包含图像名称: mongodb://mongo:27017/ 而不是本地主机。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2022-01-12
    • 2020-12-23
    • 2019-07-30
    • 1970-01-01
    相关资源
    最近更新 更多