MongoServerSelectionError:将 Node.js 应用程序与在 Docker 上运行的 MongoDB 连接时出现连接 ECONNREFUSED

问题描述 投票:0回答:1

Docker-compose 文件看起来像这样

version: '3.8'
services:
  mongo:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    ports:
      - "2617:2716"
  web:
    build: 
      context: .
    ports:
      - "8080:8080"
    environment:
      NODE_ENV: production
    depends_on:
      - mongo

.env 文件看起来像这样

BASE_URL=http://localhost:8080
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=root
DB_HOST=mongo
DB_PORT=2617
DB_NAME=ptcgp

我通过这个字符串连接:

const mongoURI = 'mongodb://' + process.env.MONGO_INITDB_ROOT_USERNAME + ':' 
  + process.env.MONGO_INITDB_ROOT_PASSWORD + '@' 
  + process.env.DB_HOST + ':' 
  + process.env.DB_PORT + '/' 
  + process.env.DB_NAME + '?retryWrites=true&writeConcern=majority&authSource=admin';
mongoose.connect(mongoURI);

mongoURI
看起来像这样:
mongodb://root:root@mongo:2617/ptcgp?retryWrites=true&writeConcern=majority&authSource=admin
这对我来说看起来是正确的......

它返回以下错误:

MongoServerSelectionError: connect ECONNREFUSED 172.20.0.2:2617
MongoDB connection error. Please make sure MongoDB is running.
,但 MongoDB 容器正在运行。

我正在对 Docker 中运行的另一个项目执行同样的操作,端口设置为 2717:27017(因此是此部署中端口的选择)并且它正在工作。

node.js mongodb docker docker-compose
1个回答
0
投票

Mongo 默认监听 27017 端口。

当容器在 docker 桥接网络上相互通信时,它们不使用映射的端口。映射的端口用于与桥接网络外部的容器进行通信。因此,如果您只需要与其他容器通信,则无需映射端口。

由于每个容器都有自己的IP地址,因此容器可以毫无问题地使用相同的端口号。但是当您将它们映射到主机端口时,您需要确保映射的端口号不会冲突。

因此,要将 Mongo 端口映射到主机端口 2617,您应该这样做

ports:
  - "2617:27017"

但是由于端口 2617 仅用于从 Docker 网络外部访问 Mongo,因此您应该从 Web 应用程序使用端口 27017。

© www.soinside.com 2019 - 2024. All rights reserved.