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

Docker Compose部署MongoDB副本集后Compass连接报错getaddrinfo ENOTFOUND host.docker.internal

问题描述

通过docker-compose创建MongoDB副本集,成员已正常运行,可通过mongosh连接并执行rs.status()命令,但使用指定连接字符串通过MongoDB Compass连接时,出现错误:getaddrinfo ENOTFOUND host.docker.internal。

应用模块中的连接字符串:

'mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0&serverSelectionTimeoutMS=2000',
{
  maxStalenessSeconds: 120,
  readPreference: 'secondaryPreferred',
},

docker-compose文件:

services:
  mongo1:
    image: mongo:7.0
    command: ['--replSet', 'rs0', '--bind_ip_all', '--port', '27017']
    ports:
      - 27017:27017
    healthcheck:
      test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'localhost:27017',priority:1},{_id:1,host:'localhost:27018',priority:0.5},{_id:2,host:'localhost:27019',priority:0.5}]}) }" | mongosh --port 27017 --quiet
      interval: 5s
      timeout: 30s
      start_period: 0s
      start_interval: 1s
      retries: 30
    volumes:
      - 'mongo1_data:/data/db'
      - 'mongo1_config:/data/configdb'

  mongo2:
    image: mongo:7.0
    command: ['--replSet', 'rs0', '--bind_ip_all', '--port', '27018']
    ports:
      - 27018:27018
    volumes:
      - 'mongo2_data:/data/db'
      - 'mongo2_config:/data/configdb'

  mongo3:
    image: mongo:7.0
    command: ['--replSet', 'rs0', '--bind_ip_all', '--port', '27019']
    ports:
      - 27019:27019
    volumes:
      - 'mongo3_data:/data/db'
      - 'mongo3_config:/data/configdb'

volumes:
  mongo1_data:
  mongo2_data:
  mongo3_data:
  mongo1_config:
  mongo2_config:
  mongo3_config:
问题原因

副本集初始化时使用localhost作为成员主机地址,导致副本集配置中记录的成员地址是localhost:xxxx。当外部客户端(如宿主机的MongoDB Compass)连接时,MongoDB会返回这些成员地址给客户端,客户端需要解析这些地址才能和所有副本集成员通信:

  • 对于Docker容器内的服务,localhost指向容器自身,无法正确解析到其他副本集成员;
  • 对于宿主机的客户端,localhost指向宿主机,但副本集返回的地址在某些场景下会被转换为host.docker.internal,而宿主机无法解析这个地址,从而触发getaddrinfo ENOTFOUND错误。
解决方案

1. 修改副本集初始化配置,使用Docker服务名

更新docker-compose中mongo1的healthcheck测试命令,将成员主机地址替换为Docker服务名(mongo1、mongo2、mongo3),这样容器间能通过服务名通信,同时方便宿主机配置解析:

healthcheck:
  test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'mongo1:27017',priority:1},{_id:1,host:'mongo2:27018',priority:0.5},{_id:2,host:'mongo3:27019',priority:0.5}]}) }" | mongosh --port 27017 --quiet

2. 配置宿主机hosts文件,解析Docker服务名

在宿主机的hosts文件中添加映射,让mongo1、mongo2、mongo3指向本地回环地址:

  • Linux/macOS:编辑/etc/hosts,添加一行:
    127.0.0.1 mongo1 mongo2 mongo3
    
  • Windows:以管理员身份编辑C:\Windows\System32\drivers\etc\hosts,添加同样内容。

3. 调整连接字符串(按需)

  • 如果应用运行在宿主机:保持原连接字符串不变,使用localhost加映射端口;
  • 如果应用运行在Docker容器:连接字符串改为使用服务名,确保容器能通过Docker网络访问副本集:
    'mongodb://mongo1:27017,mongo2:27018,mongo3:27019/?replicaSet=rs0&serverSelectionTimeoutMS=2000',
    {
      maxStalenessSeconds: 120,
      readPreference: 'secondaryPreferred',
    },
    

4. 重启副本集服务

删除原有容器和数据卷,重新启动服务以应用配置:

docker-compose down -v
docker-compose up -d

等待健康检查完成(约30秒),再使用MongoDB Compass连接,连接字符串使用:

mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0&serverSelectionTimeoutMS=2000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:45:21