我正在试验docker swarm。我在尝试设置mongodb集群时遇到了这个问题。
我创建了一个由3个节点组成的集群。我在每个节点中启动了3个mongodb服务(mongo1,mongo2,mongo3)。所有服务都在称为mongo
的同一网络中。我无法从另一个mongo服务连接到任何其他mongo服务。
mongo_client=556a565e88d1
docker exec -it $mongo_client mongo mongo1/foo
docker exec -it $mongo_client mongo mongo2/foo
docker exec -it $mongo_client mongo mongo3/foo
以上mongo
命令无法连接。根据错误消息,我知道每个主机名mongo1, mongo2, mongo3
都可以正确解析。我可以在错误消息中看到IP地址为10.0.0.2:27017, 10.0.0.36:27017 & 10.0.0.40:27017
。
示例错误:
MongoDB shell version: 3.2.21
connecting to: mongo3/foo
2018-12-20T02:45:05.042+0000 W NETWORK [thread1] Failed to connect to 10.0.0.40:27017, in(checking socket for error after poll), reason: errno:111 Connection refused
2018-12-20T02:45:05.043+0000 E QUERY [thread1] Error: couldn't connect to server mongo3:27017, connection attempt failed :
connect@src/mongo/shell/mongo.js:231:14
@(connect):1:6
exception: connect failed
我无法理解原因。我可以从端口27017上的同一容器连接到mongo,它可以正常工作。但是,当我尝试使用10.0.0.2:27017连接时,它失败了。
可能是mongod仅在本地主机地址上侦听。我关注了this article。在此提到,与mongo的连接基于服务名称。如果在任何其他端口上监听mongod,那么本文中就会提到它。
更新
我检查了运行mongod
的容器的IP地址。它是10.0.0.44
,而服务名称则解析为10.0.0.43
。我可以看到容器IP与服务IP之间的区别。
我尝试使用来自同一网络中另一个容器的容器IP连接到mongod,它起作用了。
这表明同一覆盖网络中的容器能够使用IP地址相互通信。但是,如何使用服务名称连接到mongod?
任何有关此问题的说明将是有益的。
谢谢!