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

docker-compose部署MERN应用时Mongoose连接Mongo容器报ECONNREFUSED错误

问题根因与修复方案

核心错误点

  1. 官方Mongo镜像默认内部监听端口为27017,你所有配置中错误使用了27018作为容器内部端口,导致连接被拒绝
  2. 使用MongoDB root角色用户连接业务库时,未指定认证源authSource=admin,会出现认证失败问题
  3. 本地运行正常是因为你本地Mongo实例自行修改为监听27018端口,和Docker容器内的默认配置不匹配

修复步骤

1. 修改docker-compose.yml中mongodb服务配置

修正端口映射与暴露配置:

version: '3.1'
services:
  app:
    restart: always
    build: .
    ports:
      - 3000:3000
    # links为废弃特性,同compose下服务默认网络互通,可直接删除该配置
    # links:
    #   - mongodb
    depends_on:
      - mongodb
  mongodb:
    image: mongo
    ports:
      # 左侧为宿主机映射端口,右侧为容器内部Mongo默认监听端口27017
      - 27018:27017
    expose:
      - "27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
      MONGO_INITDB_DATABASE: names
  mongo-express:
    image: mongo-express
    ports:
      - 8080:8081
    depends_on:
      - mongodb
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: admin
      ME_CONFIG_MONGODB_ADMINPASSWORD: password
      ME_CONFIG_MONGODB_SERVER: mongodb
    restart: unless-stopped

2. 修改Mongoose连接配置

修正连接端口,新增认证源参数:

// 容器内网使用服务名mongodb+容器内部端口27017,新增authSource指定认证库为admin
const mongoURI = `mongodb://${MONGOUN}:${MONGOPW}@mongodb:27017/names?authSource=admin`;

mongoose.connect(mongoURI, { useUnifiedTopology: true, useNewUrlParser: true })
  .then(() => {
    console.log('mongo connection established');
  })
  .catch((error) => {
    console.log(`mongo connect error on ${mongoURI}`);
    console.log(error);
  });

可选优化(解决启动顺序问题)

如果修改后仍偶发连接失败,是因为Node应用启动速度远快于Mongo初始化速度,可直接保留现有restart: always配置,应用会自动重试直到Mongo启动完成。

通用排查方向

  • 进入容器内部验证网络连通性:执行docker exec -it 你的app容器名 sh,先后执行ping mongodb验证域名解析、nc -zv mongodb 27017验证端口连通性
  • 查看Mongo容器运行日志:执行docker logs 你的mongodb容器名,确认Mongo启动是否正常、有无报错信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:42:06