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
相关产品推荐
相关产品推荐

