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: 5iap服务的depends_on:depends_on: mongo: condition: service_healthy
内容的提问来源于stack exchange,提问作者insta girl
相关产品推荐
相关产品推荐

