Mac M1下Docker Compose部署MongoDB Node报ENOTFOUND mongo1错误
问题原因
- YAML配置缩进错误:
networks、volumes配置块被错误放在services层级下,属于无效配置,Docker Compose不会按预期创建自定义retro网络,服务域名解析规则异常。 - 核心解析逻辑不匹配:
mongo1是Docker内置DNS为同一自定义网络内容器提供的内部域名,仅对同一网络内的容器生效。如果Node.js直接运行在M1 Mac宿主机、没有部署到对应Docker网络中,宿主机本身不存在这条DNS记录,自然会报getaddrinfo ENOTFOUND mongo1的错误。 - 之前尝试配置的
container-name、hostname参数仅修改容器内部的主机标识,不会同步到宿主机的解析规则,无法解决宿主机访问的解析问题。 - 副本集隐藏坑:MongoDB副本集会在初始化时记录节点的访问地址,如果初始化时填的是容器内部域名,客户端建立连接后会拿到这个内部地址做后续通信,宿主机访问时依然会触发解析错误。
修复方案
根据Node.js的部署方式二选一操作即可:
场景1:Node.js直接运行在Mac宿主机(非容器化)
- 先修正
docker-compose.yml的缩进错误,将networks、volumes块调整到与services平级的顶层位置,修正后配置如下:
services: mongo1: image: mongo:latest command: ["--replSet", "test-replica-set", "--bind_ip_all", "--port", "27017"] volumes: - mongodbdata1:/data/db ports: - "27017:27017" networks: - retro redis: image: redis:6.0.0 ports: - '${REDIS_PORT:-6379}:6379' networks: - retro dependencies: image: dadarek/wait-for-dependencies depends_on: - mongo1 - redis networks: - retro command: mongo1:27017 redis:6379 networks: retro: volumes: mongodbdata1: driver: local
- 停掉原有容器,重新执行
docker-compose up -d启动服务。 - 进入mongo1容器初始化副本集,注意节点地址填宿主机可访问的
127.0.0.1,避免后续客户端拿到内部域名解析失败:
# 替换为实际的mongo1容器名,可通过docker ps查看 docker exec -it <mongo1容器ID> mongosh # 在mongosh交互界面执行初始化命令 rs.initiate({ _id: "test-replica-set", members: [{ _id: 0, host: "127.0.0.1:27017" }] })
- 修改Node.js项目中的MongoDB连接串,主机名填
127.0.0.1即可,示例:
mongodb://127.0.0.1:27017/你的业务库名?replicaSet=test-replica-set
场景2:Node.js同样为容器化部署,通过该Compose文件管理
- 同样先修正上述YAML缩进错误。
- 在
services块中新增Node.js应用的服务配置,将其也加入retro网络,配置depends_on关联mongo1与redis服务即可。 - 副本集初始化时节点地址直接填
mongo1:27017,Node.js应用内的MongoDB连接串主机名也填mongo1,同一网络内的Docker DNS会自动完成解析。
内容的提问来源于stack exchange,提问作者SJaka
相关产品推荐
相关产品推荐

