Docker部署MongoDB副本集节点无法互访(名称解析失败)
解决MongoDB副本集连接时的域名解析失败问题
问题根源
你的应用运行在Multipass的Ubuntu主机环境中,而非MongoDB节点所在的mongoCluster Docker网络内。当MongoDB驱动从副本集获取节点列表后,得到的是mongo1:27017这类Docker内部主机名,Ubuntu主机无法解析这些域名,导致出现dial tcp: lookup mongo1: Temporary failure in name resolution错误。
解决方案
方案一:修改副本集配置为外部可访问地址
该方案让副本集返回的节点地址是Ubuntu主机能直接访问的IP和端口,适合长期稳定使用:
- 进入主节点mongo1的MongoShell:
sudo docker exec -it mongo1 mongosh -u myuser -p mypassword
- 重新配置副本集(替换
<Multipass虚拟机IP>为你的Ubuntu虚拟机实际IP,比如192.168.64.10):
rs.reconfig({ _id: "myReplicaSet", members: [ {_id: 0, host: "<Multipass虚拟机IP>:27017"}, {_id: 1, host: "<Multipass虚拟机IP>:27018"}, {_id: 2, host: "<Multipass虚拟机IP>:27019"} ] }, {force: true})
- 更新应用的MongoDB连接URI:
mongodb://myuser:mypassword@<Multipass虚拟机IP>:27017,<Multipass虚拟机IP>:27018,<Multipass虚拟机IP>:27019/?retryWrites=true&w=majority
方案二:在Ubuntu主机添加hosts映射
通过修改主机hosts文件,让系统能解析Docker内部节点的主机名:
- 查询每个Mongo容器的内部IP:
# 查询mongo1的IP sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mongo1 # 查询mongo2的IP sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mongo2 # 查询mongo3的IP sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mongo3
- 编辑Ubuntu主机的
/etc/hosts文件:
sudo nano /etc/hosts
添加以下内容(替换为上一步获取的容器实际IP):
172.18.0.2 mongo1 172.18.0.3 mongo2 172.18.0.4 mongo3
- 保存退出后,应用原连接URI即可正常使用:
mongodb://myuser:mypassword@localhost:27017/?retryWrites=true&w=majority
额外建议
如果你的应用也通过Docker部署,可将应用容器加入mongoCluster网络,此时应用可直接使用mongo1、mongo2这类主机名连接副本集,无需上述任何修改。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

