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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:35:35