节点应用无法连接到MongoDB,但仅在Docker中

时间:2018-11-10 23:37:33

标签: node.js mongodb docker mongoose docker-compose

我有两个应用程序:

当我的节点应用程序在本地运行时,这两个应用程序可以完美地交互。现在,我将其放入Docker容器中,当我与docker compose up一起启动时,后端无法连接到MongoDB。

这是启动顺序的摘录:

mongodb_1   | 2018-11-10T22:22:52.481+0000 I NETWORK  [initandlisten] waiting for connections on port 27017
[...]
backend_1   | 2018-11-10T22:23:48.119Z 'MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]'

这是我的docker-compose.yml

version: '2'
services:

  mongodb:
    image: bitnami/mongodb:latest
    expose:
      - 27017
    environment:
      - ALLOW_EMPTY_PASSWORD=yes

  backend:
    build: ./backend
    environment:
      API_HOST: http://localhost:3000/
      APP_SERVER_PORT: 3000
    expose:
      - 3000
    volumes:
      - ./backend:/app/backend
    links:
      - mongodb
    depends_on:
      - mongodb

这是我对数据库的节点调用:

mongoose.connect('mongodb://localhost:27017/groceryList', {
  useNewUrlParser: true
});

我浏览了大约15个Stackoverflow问题,但仍未找到原因:

  • 当我的节点应用尝试尝试MongoDB时,它不是未准备好 连接。我将连接呼叫包装为自动重新连接 如here所述运行,并且错误不断重复。这不仅仅是关于“第一 连接”。
  • 我可以发布MongoDB容器的端口27017,并且 与Robo3T建立愉快的联系。数据库肯定可以正常工作。
  • 当我连接到mongodb://mongo:27017/groceryList时,同样适用,仅使用ENOTFOUND标志而不是ECONNREFUSED

我想念什么?

  • Docker 18.06.1-ce
  • docker-compose 1.22.0
  • 猫鼬5.3.6
  • MongoDB 4.0.3
  • 节点11.1.0
  • macOS 10.14.1

2 个答案:

答案 0 :(得分:1)

您的mongodb服务被命名为mongodb而不是mongo

尝试

mongoose.connect('mongodb://mongodb:27017/groceryList', {
  useNewUrlParser: true
});

通用格式为'mongodb://mongoServiceName:27017/dbname',它对同一网络内的容器使用docker的自动dns解析。

您可能已经从其他问题/答案中知道,在一个容器中,URL是相对于其自身的,因此,由于后端容器内部没有运行mongodb,因此它无法连接到它。

答案 1 :(得分:0)

不可能在容器中使用localhost:27017与其他容器通信,因为范围“ localhost”是自引用的(localhost:27017将在容器后端中查找端口27017-不是在 mongodb 容器中)

然后,您需要输入或输入服务名称(mongodb)或计算机的IP地址