Mongodb,Boot2Docker和副本集连接

我有一个docker容器,充当副本集的单个成员。 我能够成功启动其中三个,并在其中运行一些shell脚本,以便将它们作为副本集连接在一起。 我发现我可以从我的主机单独连接到每个成员,但是当我尝试连接到副本集(在我的情况下,通过spring-data-mongodb)列出每个成员在boot2docker IP和相应的端口,我发现应用程序交换每个容器IP的boot2docker IP,并试图直接在该IP连接。

我假设发生这种情况是因为初始连接string只是一个种子列表,然后通过与成员自己的通信提供实际的configuration。 这当然是一个问题,因为这些IP在主机(应用程序运行的地方)上不存在,只存在于boot2docker虚拟机中。 我怎样才能让成员报告boot2docker IP而不是他们个人不可达的IP?

我碰到类似elasticsearch的东西,并能通过设置network.publish_hostvariables来修复它。 有没有类似MongoDB的设置? 我想也许bind_ip是正确的,但一直无法做到这一点,我用错了吗? 我一直把它设置为boot2docker IP,并在启动时收到绑定错误。

此外,我可以确认这只是一个与boot2docker扔进混合的问题,因为我的朋友运行的Ubuntu和本地docker能够连接就好了。

这是我看到的错误,当试图将我的bind_ip设置为boot2docker虚拟机:

 Starting mongod process using command: /usr/bin/mongod --storageEngine wiredTiger --auth --dbpath /data/db/ --replSet rs0 --bind_ip 127.0.0.1,192.168.59.103 --keyFile /mongodb-keyfile 2015-04-19T16:34:41.123+0000 E NETWORK [initandlisten] listen(): bind() failed errno:99 Cannot assign requested address for socket: 192.168.59.103:27017 

这是我的连接string在我的springxml:

 <mongo:mongo id="mongo" replica-set="192.168.59.103:27017,192.168.59.103:27018,192.168.59.103:27019"/> 

这里是我的应用程序看到的错误(如果我刚开始的东西,而不尝试改变bind_ip等)

 Client view of cluster state is {type=ReplicaSet, servers=[{address=172.17.0.34:27017, type=Unknown, state=Connecting}, {address=172.17.0.35:27017, type=Unknown, state=Connecting}, {address=172.17.0.36:27017, type=Unknown, state=Connecting}] at com.mongodb.BaseCluster.getServer(BaseCluster.java:82) ~[mongo-java-driver-2.13.0.jar:na] 

这些IP是每个容器的IP,并且每个容器确实在端口27017上启动,但是随后我将它们的端口在2702,27018和27019上发布在boot2docker VM上。

我find了一个解决scheme。 从本质上来说,对于mongo客户(在我的情况下,弹簧数据)重要的是副本集成员自己报告的地址。 初始连接string只是一个遍历的种子列表,直到其中一个指定的成员用副本集configuration的完整详细信息响应客户端。

这意味着为重试尝试logging的实际IP以及实际上将来与副本集的所有未来交互都由副本集在客户端请求由副本集configuration的内容决定的configuration时向客户端报告的内容决定文件。

由于副本集是使用docker容器IP启动的,因此这些是logging在副本集configuration文档中的IP,然后在启动时报告给应用程序,所以一旦客户端切换到使用这些IP,它就不能再连接到容器,因为docker IP不会暴露在boot2docker虚拟机之外。

解决scheme(在我的情况下)是更改副本集的初始configuration,而不是提供成员的IPs,就像它是从主机启动(以及真正的他们只是在boot2docker机器上公开的不同端口)。 这意味着configuration文件中的地址可以被主机上的任何客户端访问,而不仅仅是boot2docker中的地址。

按照本教程,通过docker设置mongodb集群之后,我遇到了类似的问题。 为了能够打开一个适当的副本集连接到这个集群,我做了以下两个修改指令:

  1. 我没有使用专用的docker网桥,而是通过启动每个节点(例如)来使用托pipenetworking:

docker运行-p 30001:30001 – 名称mongo1 – networking主机mongo mongod –replSet rs1 –port 30001

(“–net host”使用主机networking,然后必须重新映射端口以使用主机上的可用端口。在此设置中,不确定是否需要端口转发选项)

  1. 我在Docker机器上运行Windows,所以我使用以下命令检索了虚拟机的ip:

docker机器env

然后将IP插入副本集configuration,因此(在这种情况下,虚拟机的IP为192.168.99.100):

 config = { "_id" : "rs1", "members" : [ { "_id" : 0, "host" : "192.168.99.100:30001" }, { "_id" : 1, "host" : "192.168.99.100:30002" }, { "_id" : 2, "host" : "192.168.99.100:30003" } ] } 

显然这整个设置仅用于testing,不是为生产而devise的。

你必须在你的容器的IP地址中启动你的mongod

试试这个:/ usr / bin / mongod –auth –dbpath / data / db / –replSet rs0 –bind_ip 172.17.0.34

172.17.0.34是你的容器的地址(mongod primairy)