连接到Docker中用Java运行的MongoDB副本集(Windows)

我想用docker设置一个MongoDB副本集。 设置似乎很好,但我无法通过我的Java-app连接到群集。 我正在使用VirtualBox作为驱动程序在Windows 10上运行Docker版本17.06.0-ce。

我遵循这个教程的指示: http : //www.sohamkamani.com/blog/2016/06/30/docker-mongo-replica-set/

所以我首先在Docker中创build了my-mongo-clusternetworking,并使用以下命令运行3个容器:

$ docker run --name mongo1 -d --net mongo-cluster -p 9042:27017 mongo:3.6.0 mongod --replSet my-mongo-set $ docker run --name mongo2 -d --net mongo-cluster -p 9142:27017 mongo:3.6.0 mongod --replSet my-mongo-set $ docker run --name mongo3 -d --net mongo-cluster -p 9242:27017 mongo:3.6.0 mongod --replSet my-mongo-set 

然后我连接到mongo1容器,并使用以下configuration设置副本集:

 config = {"_id" : "my-mongo-set", "members" : [{"_id" : 0,"host" : "mongo1:27017"},{"_id" : 1,"host" : "mongo2:27017"},{"_id" : 2,"host" : "mongo3:27017"}]} rs.initiate(config) 

这似乎工作得很好。 我可以从mongo1容器的日志中知道所有的容器是相互连接的。

现在我试图从我的Java-app连接到副本集。 我正在使用mongodb驱动程序版本3.6.0。 这是我用来连接到docker中运行的副本集的代码:

 List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>(); serverAddresses.add(new ServerAddress(InetAddress.getByName("192.168.99.100"), 9042)); serverAddresses.add(new ServerAddress(InetAddress.getByName("192.168.99.100"), 9142)); serverAddresses.add(new ServerAddress(InetAddress.getByName("192.168.99.100"), 9242)); MongoClient client = new MongoClient(serverAddresses); 

这是日志输出(MongoSocketException在最后也出现mongo1:27017和mongo2:27017):

 Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Cluster created with settings {hosts=[192.168.99.100:9042, 192.168.99.100:9142, 192.168.99.100:9242], mode=MULTIPLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500} Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Adding discovered server 192.168.99.100:9042 to client view of cluster Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Adding discovered server 192.168.99.100:9142 to client view of cluster Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Adding discovered server 192.168.99.100:9242 to client view of cluster Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Cluster description not yet available. Waiting for 30000 ms before timing out Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Opened connection [connectionId{localValue:2, serverValue:5}] to 192.168.99.100:9142 Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Opened connection [connectionId{localValue:1, serverValue:14}] to 192.168.99.100:9042 Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Opened connection [connectionId{localValue:3, serverValue:5}] to 192.168.99.100:9242 Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Monitor thread successfully connected to server with description ServerDescription{address=192.168.99.100:9242, type=REPLICA_SET_SECONDARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 6, 0]}, minWireVersion=0, maxWireVersion=6, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=5002651, setName='my-mongo-set', canonicalAddress=mongo3:27017, hosts=[mongo3:27017, mongo2:27017, mongo1:27017], passives=[], arbiters=[], primary='mongo1:27017', tagSet=TagSet{[]}, electionId=null, setVersion=1, lastWriteDate=Wed Dec 27 21:36:00 CET 2017, lastUpdateTimeNanos=440549516217673} Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Monitor thread successfully connected to server with description ServerDescription{address=192.168.99.100:9142, type=REPLICA_SET_SECONDARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 6, 0]}, minWireVersion=0, maxWireVersion=6, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=5542139, setName='my-mongo-set', canonicalAddress=mongo2:27017, hosts=[mongo3:27017, mongo2:27017, mongo1:27017], passives=[], arbiters=[], primary='mongo1:27017', tagSet=TagSet{[]}, electionId=null, setVersion=1, lastWriteDate=Wed Dec 27 21:36:00 CET 2017, lastUpdateTimeNanos=440549516254709} Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Monitor thread successfully connected to server with description ServerDescription{address=192.168.99.100:9042, type=REPLICA_SET_PRIMARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 6, 0]}, minWireVersion=0, maxWireVersion=6, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=4113767, setName='my-mongo-set', canonicalAddress=mongo1:27017, hosts=[mongo3:27017, mongo2:27017, mongo1:27017], passives=[], arbiters=[], primary='mongo1:27017', tagSet=TagSet{[]}, electionId=7fffffff0000000000000001, setVersion=1, lastWriteDate=Wed Dec 27 21:36:00 CET 2017, lastUpdateTimeNanos=440549515190458} Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Discovered cluster type of REPLICA_SET Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Adding discovered server mongo3:27017 to client view of cluster Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Adding discovered server mongo2:27017 to client view of cluster Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Adding discovered server mongo1:27017 to client view of cluster Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Canonical address mongo2:27017 does not match server address. Removing 192.168.99.100:9142 from client view of cluster Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Server 192.168.99.100:9242 is no longer a member of the replica set. Removing from client view of cluster. Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Server 192.168.99.100:9042 is no longer a member of the replica set. Removing from client view of cluster. Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Canonical address mongo1:27017 does not match server address. Removing 192.168.99.100:9042 from client view of cluster Dez 27, 2017 9:36:07 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: No server chosen by com.mongodb.Mongo$4@67784306 from cluster description ClusterDescription{type=REPLICA_SET, connectionMode=MULTIPLE, serverDescriptions=[ServerDescription{address=192.168.99.100:9242, type=UNKNOWN, state=CONNECTING}, ServerDescription{address=mongo3:27017, type=UNKNOWN, state=CONNECTING}, ServerDescription{address=mongo2:27017, type=UNKNOWN, state=CONNECTING}, ServerDescription{address=mongo1:27017, type=UNKNOWN, state=CONNECTING}, ServerDescription{address=192.168.99.100:9042, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out Dez 27, 2017 9:36:09 PM com.mongodb.diagnostics.logging.JULLogger log INFORMATION: Exception in monitor thread while connecting to server mongo3:27017 com.mongodb.MongoSocketException: mongo3 at com.mongodb.ServerAddress.getSocketAddress(ServerAddress.java:188) at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:59) at com.mongodb.connection.SocketStream.open(SocketStream.java:57) at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:114) at java.lang.Thread.run(Thread.java:745) Caused by: java.net.UnknownHostException: mongo3 at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) at java.net.InetAddress.getAllByName0(InetAddress.java:1276) at java.net.InetAddress.getAllByName(InetAddress.java:1192) at java.net.InetAddress.getAllByName(InetAddress.java:1126) at java.net.InetAddress.getByName(InetAddress.java:1076) at com.mongodb.ServerAddress.getSocketAddress(ServerAddress.java:186) ... 5 more