【发布时间】:2015-06-26 06:26:55
【问题描述】:
我有一个 docker 容器,它充当副本集的单个成员。我能够成功启动其中的三个并在其中运行一些 shell 脚本,以便将它们连接在一起作为副本集。我发现我可以从我的主机单独连接到每个成员,但是当我尝试通过在 boot2docker IP 和相应的端口,我发现应用程序在某个地方为每个容器 IP 交换了 boot2docker IP,并尝试直接连接到该 IP。
我假设发生这种情况是因为初始连接字符串只是一个种子列表,然后实际配置是通过与成员本身的通信提供的。这当然是一个问题,因为这些 IP 不存在于主机(运行应用程序的地方)上,只存在于 boot2docker 虚拟机中。如何让成员报告 boot2docker IP 而不是他们各自无法访问的 IP?
我遇到了与 elasticsearch 类似的东西,并且能够通过设置 network.publish_host 变量来修复它。 mongodb有类似的设置吗?我认为也许 bind_ip 是正确的,但无法使其工作,我是否使用不正确?我一直将它设置为 boot2docker IP,并且在启动时收到绑定错误。
另外,我可以确认这只是 boot2docker 的问题,因为我的朋友运行 ubuntu 和本地 docker 能够正常连接。
这是我在尝试将我的 bind_ip 设置为 boot2docker vm 时看到的错误:
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
这是我的 spring xml 中的连接字符串:
<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 端口上启动,但是我在 boot2docker 虚拟机上将它们的端口发布为 27017、27018 和 27019。
【问题讨论】:
标签: mongodb docker boot2docker replicaset