Docker Compose部署Node.js+MongoDB应用连接失败求助
问题解决:Node.js应用无法连接Docker Compose部署的MongoDB
核心问题定位
错误日志明确显示MongooseServerSelectionError: getaddrinfo ENOTFOUND mongo,说明你的Node应用在尝试解析名为mongo的主机,但Docker Compose配置中Mongo服务的名称是mongo-db,导致DNS解析失败,无法建立连接。
分步解决方案
1. 修正MongoDB连接字符串
确保Node代码中的连接字符串与Docker Compose里的服务名称严格一致:
mongoose.connect('mongodb://mongo-db:27017/test', { useNewUrlParser: true });
注意:错误日志显示应用尝试连接mongo:27017,请检查实际代码是否存在拼写错误,比如误将mongo-db写成mongo。
2. 添加Mongo服务就绪等待机制
depends_on仅保证服务启动顺序,不保证MongoDB完全初始化完成。可以通过两种方式解决:
- 在Node代码中添加重连逻辑:
const connectWithRetry = () => { mongoose.connect('mongodb://mongo-db:27017/test', { useNewUrlParser: true }) .then(() => console.log('MongoDB连接成功')) .catch(err => { console.log('连接失败,5秒后重试:', err); setTimeout(connectWithRetry, 5000); }); }; connectWithRetry(); - 使用等待脚本:
修改Dockerfile-node,加入wait-for-it脚本等待Mongo服务就绪后再启动应用:FROM node:15.3.0 WORKDIR /app # 下载并赋予执行权限 ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /app/wait-for-it.sh RUN chmod +x /app/wait-for-it.sh COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 # 等待mongo-db:27017就绪后启动应用 CMD ["./wait-for-it.sh", "mongo-db:27017", "--", "node", "app.js"]
3. 简化MongoDB服务配置(可选)
自定义的Dockerfile-mongo没有必要,官方mongo:4.4镜像已默认配置数据卷和启动命令,可直接在docker-compose.yml中使用官方镜像,减少自定义配置的潜在问题:
version: '3' services: node-app: build: context: . dockerfile: Dockerfile-node ports: - 3000:3000 depends_on: - mongo-db networks: - mongo-db mongo-db: image: mongo:4.4 ports: - 27017:27017 volumes: - mongo-data:/data/db networks: - mongo-db volumes: mongo-data: networks: mongo-db: name: mongo-db
验证步骤
- 停止当前运行的容器:
docker-compose down - 按照上述修改调整代码和配置文件
- 重新构建并启动服务:
docker-compose up --build - 查看日志,确认Node应用成功连接MongoDB
内容的提问来源于stack exchange,提问作者trungpham
相关产品推荐
相关产品推荐

