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

Docker Compose部署Node.js应用连接MongoDB失败求助

问题排查与解决

核心问题:network_mode: host导致服务名无法解析

你在两个服务中都配置了network_mode: host,这会让容器直接使用宿主机的网络栈,而非Docker Compose默认创建的桥接网络。在默认桥接网络里,Docker会自动维护服务名(比如mongo)到容器IP的DNS解析,但host网络下没有这个机制,所以应用容器无法通过mongo域名找到MongoDB服务,才会抛出getaddrinfo ENOTFOUND mongo错误。

解决步骤1:移除network_mode: host配置

删掉两个服务中的network_mode: host,让Docker Compose自动创建默认桥接网络,这样应用容器就能通过服务名mongo访问数据库了。修改后的配置如下:

version: "3.7"
services:
  iap:
    image: myrepo/myapp:v1
    volumes:
      - "appdata:/opt/myapp"
    ports:
      - "xxx:xxx"  # Web UI (TCP)
    depends_on:
      - mongo
  mongo:
    image: myregistry/mongo:4.2
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin
    ports:
      - "27017:27017"
    volumes:
      - mongodata:/data/db
      - "$PWD/seed-data:/docker-entrypoint-initdb.d/"
    command: mongod
volumes:
  appdata:
  mongodata:

注:如果你的应用或MongoDB必须使用host网络(比如需要访问宿主机特定硬件/服务),那应用里的MongoDB连接地址要改成localhost或宿主机实际IP,而非mongo。但一般不建议用host网络,会失去容器网络的隔离性和便利性。

初始化脚本的小问题

你的初始化脚本中,创建用户时roles里的db字段写的是test,但你切换到的数据库是pronghorn,这会导致权限不匹配。需要把db: 'test'改成db: 'pronghorn',修改后的脚本:

db.auth('admin', 'admin')

db = db.getSiblingDB('pronghorn')
db.createUser({
  user: 'test',
  pwd: 'test',
  roles: [
    {
      role: 'dbOwner',
      db: 'pronghorn'
    }
  ]
});

额外注意事项

  • depends_on仅保证启动顺序,不保证MongoDB完全就绪。如果应用启动时MongoDB还没初始化完成,可能仍会报错。可以添加健康检查,让应用等MongoDB就绪后再启动:
    在mongo服务中添加:
    healthcheck:
      test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"]
      interval: 5s
      timeout: 5s
      retries: 5
    
    然后修改iap服务的depends_on:
    depends_on:
      mongo:
        condition: service_healthy
    

内容的提问来源于stack exchange,提问作者insta girl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:05:21