You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Node.js连接MongoDB遇ECONNREFUSED错误求助

问题排查与修复方案

核心问题分析

你遇到的MongoServerSelectionError: connect ECONNREFUSED错误,根源在于两处端口配置错误,以及容器间通信逻辑的误解:


1. 修正Mongo容器的端口映射配置

Mongo镜像默认监听端口是27017,但你的docker-compose中错误地写为2716,导致容器内的Mongo服务无法被正确访问。

修改docker-compose的mongo服务配置:

version: '3.8'
services:
  mongo:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    ports:
      - "2617:27017"  # 宿主机端口2617映射到容器内部默认的27017
  web:
    build: 
      context: .
    ports:
      - "8080:8080"
    environment:
      NODE_ENV: production
    depends_on:
      - mongo

2. 修正Node应用的Mongo连接端口

在Docker Compose的内部网络中,web容器连接mongo服务时,必须使用容器内部的端口(27017),而非宿主机的映射端口(2617)。端口映射仅用于宿主机外部访问Mongo,容器间通信直接用服务内部端口。

修改.env文件中的DB_PORT:

BASE_URL=http://localhost:8080
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=root
DB_HOST=mongo
DB_PORT=27017  # 改为容器内部的Mongo默认端口
DB_NAME=ptcgp

修改后生成的正确连接字符串为:

mongodb://root:root@mongo:27017/ptcgp?retryWrites=true&writeConcern=majority&authSource=admin

3. 可选优化:确保Mongo服务就绪后启动应用

depends_on仅保证容器启动顺序,不确保Mongo服务完全就绪。添加健康检查可避免应用在Mongo未初始化完成时发起连接:

mongo:
  image: mongo
  environment:
    MONGO_INITDB_ROOT_USERNAME: root
    MONGO_INITDB_ROOT_PASSWORD: root
  ports:
    - "2617:27017"
  healthcheck:
    test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
    interval: 5s
    timeout: 5s
    retries: 5
web:
  build: 
    context: .
  ports:
    - "8080:8080"
  environment:
    NODE_ENV: production
  depends_on:
    mongo:
      condition: service_healthy  # 等待Mongo健康检查通过后启动

内容的提问来源于stack exchange,提问作者Masiar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:57:15