2017-06-17 60 views
1

我是cassandra的新手,與docker相同。我的目標是連接到在java中運行docker的cassandra。我工作在Windows機器上Java連接到在docker內部運行的cassadra

我通過執行跑卡桑德拉(也試過版本2.2,3.10,沒有任何env.variables)

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

目前,我有這樣的搬運工ps的輸出:

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 

,我可以「泊塢窗EXEC - 它卡桑德拉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' 

我的測試代碼(也試過不指定任何協議版本,並與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:

I`ve只是試圖用-P選項來看,根據dock i found

現在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(); 

異常更改爲

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)) 
+0

我想你應該在你的碼頭機器中指定端口轉發。嘗試連接到本地主機,但連接到碼頭IP。即192.168.99.100,如果它可以工作,那麼它意味着問題在於端口轉發。 –

+0

你的意思是容器地址? 「碼頭檢查卡桑德拉」不包含容器的地址。我怎樣才能找到「碼頭IP」? – iteracia

+0

即「docker machine ip default」,如果您使用的是docker機器 https://docs.docker.com/machine/reference/ip/ –

回答

0

如果要使用默認端口連接到localhost,則需要轉發它。

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

使用-P基礎上,Dockerfile的EXPOSE選項將挑選隨機端口爲您服務。

0

感謝羅伯。答案是

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

然後連接到docker ps(我的32769)中顯示的端口。

相關問題