Java连接到docker中运行的cassadra

我对cassandra很陌生,和docker工人一样。 我的目标是连接到在java中运行docker的cassandra。 我正在研究Windows机器

我运行cassandra(也试过版本2.2,3.10,没有任何env.variables)

docker run --name cassandra -d -e CASSANDRA_RPC_ADDRESS=127.0.0.1 cassandra:3.0 

目前我有这样的dockerps输出:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f932d3e7e0dc cassandra:3.0 "/docker-entrypoin..." 5 seconds ago Up 5 seconds 7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp cassandra 

我可以用这样的输出“docker exec -it cassandra cqlsh”

 Connected to Test Cluster at 127.0.0.1:9042. [cqlsh 5.0.1 | Cassandra 3.0.13 | CQL spec 3.4.0 | Native protocol v4] 

在Java项目中我有gradle依赖

 compile group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '3.2.0' 

我的testing代码(也试过没有指定任何协议版本,并尝试与V5)

 public static void main(String[] args) { Cluster cluster = Cluster.builder() .addContactPoint("127.0.0.1") .withProtocolVersion(ProtocolVersion.V4) .build(); Session session = cluster.connect(); } 

而我得到这个例外:

 Exception in thread "main" com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [/127.0.0.1:9042] Cannot connect)) at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:232) at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79) at com.datastax.driver.core.Cluster$Manager.negotiateProtocolVersionAndConnect(Cluster.java:1600) at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1518) at com.datastax.driver.core.Cluster.init(Cluster.java:159) at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:330) at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:305) at com.datastax.driver.core.Cluster.connect(Cluster.java:247) at com.iter.cassandratest.Cassandratest.main(Cassandratest.java:17) 

任何想法,我做错了?

编辑1:

我刚刚尝试运行-P选项,根据我find的docker

现在ps输出是:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9eb54421aac2 cassandra:3.0 "/docker-entrypoin..." 4 seconds ago Up 3 seconds 0.0.0.0:32772->7000/tcp, 0.0.0.0:32771->7001/tcp, 0.0.0.0:32770->7199/tcp, 0.0.0.0:32769->9042/tcp, 0.0.0.0:32768->9160/tcp cassandra 

我改变了代码

 Cluster cluster = Cluster.builder() .addContactPoint("127.0.0.1") .withPort(32769) .withProtocolVersion(ProtocolVersion.V4) .build(); 

exception更改为

 All host(s) tried for query failed (tried: /127.0.0.1:32769 (com.datastax.driver.core.exceptions.TransportException: [/127.0.0.1:32769] Channel has been closed)) 

如果您想使用默认端口连接到本地主机,则需要将其转发。

 docker run --name cassandra -d \ -p 9042:9042 \ cassandra:3.0 

使用-P将根据EXPOSE选项为您select随机端口。

感谢Rober。 答案是

 docker run --name cassandra -P -d cassandra:3.0 

然后连接到docker ps(我的32769)显示的端口。