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 networknameContainers列表中包含api01、api02、mongo三个容器。
4. 检查Mongo容器启动日志
查看Mongo容器的日志,确认服务是否正常启动:
docker logs mongo
如果日志中没有出现waiting for connections on port 27017,说明Mongo服务未正常初始化,需排查容器启动失败原因(如权限、资源限制等)。
内容的提问来源于stack exchange,提问作者user19976230
相关产品推荐
相关产品推荐

