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

Docker部署MongoDB副本集节点无法互访(名称解析失败)

解决MongoDB副本集连接时的域名解析失败问题

问题根源

你的应用运行在Multipass的Ubuntu主机环境中,而非MongoDB节点所在的mongoCluster Docker网络内。当MongoDB驱动从副本集获取节点列表后,得到的是mongo1:27017这类Docker内部主机名,Ubuntu主机无法解析这些域名,导致出现dial tcp: lookup mongo1: Temporary failure in name resolution错误。

解决方案

方案一:修改副本集配置为外部可访问地址

该方案让副本集返回的节点地址是Ubuntu主机能直接访问的IP和端口,适合长期稳定使用:

  1. 进入主节点mongo1的MongoShell:
sudo docker exec -it mongo1 mongosh -u myuser -p mypassword
  1. 重新配置副本集(替换<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})
  1. 更新应用的MongoDB连接URI:
mongodb://myuser:mypassword@<Multipass虚拟机IP>:27017,<Multipass虚拟机IP>:27018,<Multipass虚拟机IP>:27019/?retryWrites=true&w=majority

方案二:在Ubuntu主机添加hosts映射

通过修改主机hosts文件,让系统能解析Docker内部节点的主机名:

  1. 查询每个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
  1. 编辑Ubuntu主机的/etc/hosts文件:
sudo nano /etc/hosts

添加以下内容(替换为上一步获取的容器实际IP):

172.18.0.2 mongo1
172.18.0.3 mongo2
172.18.0.4 mongo3
  1. 保存退出后,应用原连接URI即可正常使用:
mongodb://myuser:mypassword@localhost:27017/?retryWrites=true&w=majority

额外建议

如果你的应用也通过Docker部署,可将应用容器加入mongoCluster网络,此时应用可直接使用mongo1、mongo2这类主机名连接副本集,无需上述任何修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:05:16