Docker-Compose中Node.js连接MongoDB超时问题求助
解决Docker-Compose中MongoDB连接超时问题
以下是针对你遇到的MongoNetworkError: connection 0 to mongo:27017 timed out问题的几个有效解决方案:
1. 替换旧的links配置,使用依赖管理
links是Docker Compose的旧特性,推荐使用depends_on明确服务启动顺序。Docker Compose默认会为所有服务创建共享网络,无需额外配置即可通过服务名互相访问。修改你的docker-compose.yml:
version: '3' services: app: container_name: docker-node-mongo restart: always build: . ports: - '80:3000' depends_on: - mongo # 确保mongo服务优先启动 mongo: container_name: mongo image: mongo ports: - '27017:27017'
2. 添加MongoDB就绪检测,确保服务可用后再启动应用
depends_on仅保证启动顺序,不确保MongoDB服务完全就绪。添加healthcheck检测MongoDB状态,让应用在MongoDB真正可用后再启动:
version: '3' services: app: container_name: docker-node-mongo restart: always build: . ports: - '80:3000' depends_on: mongo: condition: service_healthy # 等待mongo健康检查通过 mongo: container_name: mongo image: mongo ports: - '27017:27017' healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5
3. 增强Mongoose连接的重试机制
即使MongoDB启动完成,也可能需要几秒时间接受连接。修改Mongoose连接代码,添加自动重试和超时配置:
mongoose .connect('mongodb://mongo:27017/docker-node-mongo', { useNewUrlParser: true, retryWrites: true, w: 'majority', connectTimeoutMS: 10000, socketTimeoutMS: 45000, keepAlive: true, autoReconnect: true, retryInterval: 1000, // 每秒重试一次 reconnectTries: Number.MAX_VALUE // 无限重试 }) .then(() => console.log('MongoDB连接成功')) .catch(err => console.error('MongoDB连接失败:', err));
4. 验证容器间网络连通性
如果以上方法无效,手动测试应用容器是否能访问MongoDB服务:
- 进入应用容器:
docker exec -it docker-node-mongo /bin/bash - 测试ping连通性:
ping mongo(无ping命令可先执行apt update && apt install iputils-ping) - 测试端口连通性:
telnet mongo 27017(无telnet命令可执行apt install telnet)
若网络不通,检查Docker是否正常运行,或是否有防火墙规则阻止容器间通信。
内容的提问来源于stack exchange,提问作者Parshant Khichi
相关产品推荐
相关产品推荐

