Docker MongoDB容器与Node.js连接失败,求可运行示例
问题分析
错误getaddrinfo ENOTFOUND mongo的核心原因是:你的Node.js应用在本地主机运行,而mongo是Docker Compose创建的内部服务域名,仅在Docker默认网络内可解析,本地系统无法识别该名称。
解决方案1:将Node.js应用纳入Docker Compose(推荐)
让Node与Mongo处于同一Docker网络,直接通过服务名mongo连通,这是容器化应用的标准部署方式。
1. 新增Dockerfile
在项目根目录创建Dockerfile:
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . CMD ["npm", "run", "dev"]
2. 完整docker-compose.yml配置
version: '3.1' services: mongo: image: mongo restart: always environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example # 可选:暴露端口到本地,方便用MongoDB Compass调试 ports: - "27017:27017" node-app: build: . restart: always ports: - "3000:3000" # 可根据你的Node应用端口调整 depends_on: - mongo # 确保Mongo先启动 volumes: - .:/app # 挂载本地目录实现热重载 environment: - MONGO_URI=mongodb://root:example@mongo:27017/
3. 修改index.js(优化配置)
从环境变量读取连接字符串,提升灵活性:
const mongoose = require('mongoose') const mongoUri = process.env.MONGO_URI || 'mongodb://root:example@mongo:27017/' mongoose .set('strictQuery', false) .connect(mongoUri) .then(() => console.log('Connected!')) .catch((e) => console.log('Mongo Error:', e.message)) // 以下Book模型代码保持不变 const Book = mongoose.model('Book', new mongoose.Schema({ title: { type: String, required: true, unique: true, minlength: 2 }, published: { type: Number, required: true, }, author: { type: String, required: true, }, })); const book = new Book({ title: 'Harry Potter', published: 1997, author: "J. K. Rowling" }) // book.save()
4. 启动服务
执行命令:
docker-compose up --build
此时Node应用在容器内运行,可直接通过mongo服务名连接数据库。
解决方案2:本地运行Node.js,Mongo容器暴露端口
若不想将Node应用容器化,可通过端口映射让本地直接访问Mongo容器。
1. 修改docker-compose.yml添加端口映射
version: '3.1' services: mongo: image: mongo restart: always environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example ports: - "27017:27017" # 将Mongo端口映射到本地
2. 修改index.js连接字符串
把mongo替换为localhost:
mongoose .set('strictQuery', false) .connect('mongodb://root:example@localhost:27017/') .then(() => console.log('Connected!')) .catch((e) => console.log('Mongo Error:', e.message))
3. 启动并测试
docker-compose up -d npm run dev
本地Node应用即可通过localhost访问Mongo容器。
补充说明
depends_on仅保证服务启动顺序,不确保Mongo完全就绪。若需等待Mongo初始化完成,可在Dockerfile中引入wait-for-it等工具。- 方案1中的
volumes: .:/app配置可实现本地代码修改后,容器内nodemon自动重启,适配开发场景。
内容的提问来源于stack exchange,提问作者user2301515
相关产品推荐
相关产品推荐

