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

Docker Compose部署下NodeJS服务无法连接MongoDB问题排查

Docker Compose部署NodeJS服务无法连接MongoDB的排查与解决

以下是针对你遇到的MongooseServerSelectionError: connect ECONNREFUSED错误的排查方向和解决办法:

1. 核心问题:depends_on不等待Mongo服务就绪

depends_on仅能保证Mongo容器在Node服务容器之前启动,但Mongo容器启动后需要几秒时间完成数据库初始化、端口监听等操作。此时Node服务尝试连接,自然会遇到连接拒绝。

解决办法:

  • 添加连接重试逻辑:在Mongoose连接配置中启用自动重试,确保服务等待Mongo就绪后再建立连接:
    const url = 'mongodb://mongo:pass@mongo:27017/?authSource=admin';
    await mongoose.connect(url, {
      retryWrites: true,
      w: 'majority',
      connectTimeoutMS: 10000,
      socketTimeoutMS: 45000,
      autoReconnect: true,
      reconnectTries: Number.MAX_VALUE,
      reconnectInterval: 1000
    });
    
  • 使用等待工具:在Node服务启动前,通过wait-for-it或dockerize等工具等待Mongo的27017端口就绪。例如修改docker-compose.yml中的API服务配置:
    api01: &api
      # 其他配置不变
      command: ["./wait-for-it.sh", "mongo:27017", "--", "node", "server.js"]
      volumes:
        - ./wait-for-it.sh:/app/wait-for-it.sh # 将本地的wait-for-it.sh挂载到容器内
    

2. 连接字符串缺少认证源

你使用的是Mongo的root用户(通过MONGO_INITDB_ROOT_USERNAME创建),这类用户默认存储在admin数据库中。当前连接字符串未指定authSource,Mongo会尝试在默认的test数据库中查找用户,导致认证失败,间接表现为连接拒绝。

修正连接字符串:

const url = 'mongodb://mongo:pass@mongo:27017/?authSource=admin';

3. 验证容器网络连通性

确认所有服务处于同一Docker网络,且Node容器能访问Mongo容器:

  • 进入API容器,测试Mongo主机名解析:
    docker exec -it api01 ping mongo
    
  • 直接用Mongo客户端测试连接:
    docker exec -it api01 mongo mongodb://mongo:pass@mongo:27017/?authSource=admin
    
  • 检查容器所属网络:
    docker network inspect networkname
    
    确保输出的Containers列表中包含api01、api02、mongo三个容器。

4. 检查Mongo容器启动日志

查看Mongo容器的日志,确认服务是否正常启动:

docker logs mongo

如果日志中没有出现waiting for connections on port 27017,说明Mongo服务未正常初始化,需排查容器启动失败原因(如权限、资源限制等)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:27:49