无法连接到使用Java API在本地虚拟机上运行的ElasticSearch Docker群集

我使用Oracle VM将Unbuntu作为虚拟机运行。 在这个虚拟机中使用这个命令运行elasticsreach docker:

sudo docker运行-d –name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch

在Oracle VM机器networking设置中,我添加了这个端口转发:

主持嘉宾

127.0.0.1:9200 – > 127.0.0.1:9200 127.0.0.1:9300 – > 127.0.0.1:9300

当我尝试发送http请求使用铬到地址127.0.0.1:9200和127.0.0.1:9300我得到一个没有问题的答复。

当我尝试使用Java客户端API进行连接时,出现以下exception:

[DEBUG] org.elasticsearch.client.transport – [Rattler]添加地址[[#transport#-1] [ran-pc] [inet [/127.0.0.1:9300]]] [DEBUG] org.elasticsearch.transport。 netty – [Rattler]连接到节点[[#transport#-1] [ran-pc] [inet [/127.0.0.1:9300]]] [DEBUG] org.elasticsearch.client.transport – [Rattler]无法连接发现节点[[Ringmaster]] [LB14-DlsS-2XIDwduUj5sA] [c367b60225b2] [inet [/172.17.0.2:9300]]] org.elasticsearch.transport.ConnectTransportException:[Ringmaster] [inet [/172.17.0.2:9300] ] org.elasticsearch.transport.netty.NettyTransport.connectToNode(NettyTransport.java:825)〜[elasticsearch-1.6.0.jar:na]的connect_timeout [30s] .java:758)〜[elasticsearch-1.6.0.jar:na] at org.elasticsearch.transport.netty.NettyTransport.connectToNode(NettyTransport.java:731)〜[elasticsearch-1.6.0.jar:na] at org .elasticsearch.transport.TransportService.connectToNode(TransportService.java:216)〜[elasticsearch-1.6.0。 jar:na] org.elasticsearch.client.transport.TransportClientNodesService $ NodeSampler.validateNewNodes(TransportClientNodesService.java:331)[elasticsearch-1.6.0.jar:na] $ SniffNodesSampler.doSample (TransportClientNodesService.java:503)[elasticsearch-1.6.0.jar:na] at org.elasticsearch.client.transport.TransportClientNodesService $ NodeSampler.sample(TransportClientNodesService.java:315)[elasticsearch-1.6.0.jar:na]在org.elasticsearch.client.transport.TransportClient.addTransportAddresses(TransportClient.java:268)[org.elasticsearch.client.transport.TransportClientNodesService.addTransportAddresses(TransportClientNodesService.java:174)[elasticsearch-1.6.0.jar:na]在Infastructure.documents.ElasticSearchDocumentStore $$ Lambda $ 5 / 673384643.run(未知)中的[classes /:na] [infisstructure.documents.ElasticSearchDocumentStore.lambda $ Connect(ElasticSearchDocumentStore.java:104)[elasticsearch-1.6.0.jar:na]来源)[classes /:na] at com.nurkiewicz.asyncretry.AsyncRetryExecutor.lambda $ doWithRetry $ 4(AsyncRetryExecutor.java:55)[asyncretry-0.0.6.jar:na] at com.nurkiewicz.asyncretry.AsyncRetryExecutor $$ Lambda $ 6 / 3886839.call(Unknown Source) [asyncretry-0.0.6.jar:na] at com.nurkiewicz.asyncretry.SyncRetryJob.run(SyncRetryJob.java:23)[asyncretry-0.0.6.jar:na] at com.nurkiewicz.asyncretry.RetryJob.run( RetryJob.java:95)java.util.concurrent.Executors中的[asyncretry-0.0.6.jar:na] $ java.util.concurrent中的RunnableAdapter.call(Executors.java:511)[na:1.8.0_45] FutureTask.run(FutureTask.java:266)[na:1.8.0_45] at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201(ScheduledThreadPoolExecutor.java:180)[na:1.8.0_45] .scheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)[na:1.8.0_45] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[na:1.8.0_45] at java.util.concurrent .ThreadPoolExecutor $ Worker.run(ThreadPoo lExecutor.java:617)[na:1.8.0_45]在java.lang.Thread.run(Thread.java:745)[na:1.8.0_45]引发:java.net.ConnectException:连接超时:没有进一步information:/172.17.0.2:9300 at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)〜[na:1.8.0_45] at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)〜[na :1.8.0_45] org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.connect(NioClientBoss.java:152)〜[elasticsearch-1.6.0.jar:na] at org.elasticsearch.common.netty .channel.socket.nio.NioClientBoss.processSelectedKeys(NioClientBoss.java:105)〜[elasticsearch-1.6.0.jar:na] at org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.process(NioClientBoss。 java:79)〜[elasticsearch-1.6.0.jar:na] at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337)〜[elasticsearch-1.6.0.jar :na] at org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.run(NioClientBoss.java:42)〜[elasticsearch-1 .6.0.jar:na] at org.elasticsearch.common.netty.util org.elasticsearch.common.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)〜[elasticsearch-1.6.0.jar:na] .internal.DeadLockProofWorker $ 1.run(DeadLockProofWorker.java:42)〜[elasticsearch-1.6.0.jar:na] … 3个常用框架省略

正如你可以看到它成功连接到127.0.0.1:9300,但它然后得到节点IP(172.17.0.2),当然连接到它失败(没有从我的Windows运行虚拟机到这个IP ping) 。 我试图禁用防火墙,并添加此堡垒转发:

172.17.0.2:9300 – > 172.17.0.2:9300

要么

172.17.0.2:9300 – > 10.0.0.15:9300

(10.0.0.15是VM的IP)但是没有成功。

我明白这个问题是在端口转发中,但我该如何解决呢?

我看了这个问题 ,但我没有在这里find答案,并猜测它是另一个问题

问题是Elasticsearch集群位于Docker创build的networking的不同networking上。

解决这个问题的方法之一是在本地机器上使用SSH隧道连接到该networking,并从本地端口转发到远程9300。

以下是如何定义SSH隧道的示例以及如何使用JAVA客户端API连接到Elasticsearch的示例代码。