No se puede conectar al clúster de ElasticSearch Docker que se ejecuta en una máquina virtual local utilizando la API de Java

Tengo Unbuntu ejecutándose como una máquina virtual usando Oracle VM. En esta VM en ejecución elasticsreach docker usando este command:

sudo docker run -d –name elasticsearch -p 9200: 9200 -p 9300: 9300 elasticsearch

En la configuration de networking de la máquina Oracle VM agregué este reenvío de puerto:

Invitado principal

127.0.0.1:9200 -> 127.0.0.1:9200 127.0.0.1:9300 -> 127.0.0.1:9300

Cuando trato de enviar una request HTTP usando chrome a la dirección 127.0.0.1:9200 y 127.0.0.1:9300 obtengo una respuesta sin problemas.

Cuando trato de conectarme con la API de cliente de Java obtengo esta exception:

[DEBUG] org.elasticsearch.client.transport – [Rattler] agregando dirección [[# transport # -1] [ran-pc] [inet [/127.0.0.1:9300]]] [DEBUG] org.elasticsearch.transport. netty – [Rattler] conectado al nodo [[# transporte # -1] [ran-pc] [inet [/127.0.0.1:9300]]] [DEBUG] org.elasticsearch.client.transport – [Rattler] no se pudo conectar al nodo descubierto [[Maestro de ceremonias] [LB14-DlsS-2XIDwduUj5sA] [c367b60225b2] [inet [/172.17.0.2:9300]]] org.elasticsearch.transport.ConnectTransportException: [Maestro de ceremonias] [inet [/172.17.0.2:9300] ] connect_timeout [30s] en org.elasticsearch.transport.netty.NettyTransport.connectToChannels (NettyTransport.java:825) ~ [elasticsearch-1.6.0.jar: na] en org.elasticsearch.transport.netty.NettyTransport.connectToNode (NettyTransport .java: 758) ~ [elasticsearch-1.6.0.jar: na] en org.elasticsearch.transport.netty.NettyTransport.connectToNode (NettyTransport.java:731) ~ [elasticsearch-1.6.0.jar: na] en org .elasticsearch.transport.TransportService.connectToNode (TransportService.java:216) ~ [elasticsearch-1.6.0. jar: na] en org.elasticsearch.client.transport.TransportClientNodesService $ NodeSampler.validateNewNodes (TransportClientNodesService.java:331) [elasticsearch-1.6.0.jar: na] en org.elasticsearch.client.transport.TransportClientNodesService $ SniffNodesSampler.doSample (TransportClientNodesService.java:503) [elasticsearch-1.6.0.jar: na] en org.elasticsearch.client.transport.TransportClientNodesService $ NodeSampler.sample (TransportClientNodesService.java:315) [elasticsearch-1.6.0.jar: na] en org.elasticsearch.client.transport.TransportClientNodesService.addTransportAddresses (TransportClientNodesService.java:174) [elasticsearch-1.6.0.jar: na] en org.elasticsearch.client.transport.TransportClient.addTransportAddresses (TransportClient.java:268) [ elasticsearch-1.6.0.jar: na] en infastructure.documents.ElasticSearchDocumentStore.lambda $ Connect $ 2 (ElasticSearchDocumentStore.java:104) [classes /: na] en infastructure.documents.ElasticSearchDocumentStore $$ Lambda $ 5 / 673384643.run (Desconocido Fuente) [classes /: na] at com.nurkiewicz.asyncretry.AsyncRetryExecutor.lambda $ doWithRetry $ 4 (AsyncRetryExecutor.java:55) [asyncretry-0.0.6.jar: na] en com.nurkiewicz.asyncretry.AsyncRetryExecutor $$ Lambda $ 6 / 3886839.call (Fuente desconocida) [asyncretry-0.0.6.jar: na] en com.nurkiewicz.asyncretry.SyncRetryJob.run (SyncRetryJob.java:23) [asyncretry-0.0.6.jar: na] en com.nurkiewicz.asyncretry.RetryJob.run ( RetryJob.java:95) [asyncretry-0.0.6.jar: na] en java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:511) [na: 1.8.0_45] en java.util.concurrent. FutureTask.run (FutureTask.java:266) [na: 1.8.0_45] en java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201 (ScheduledThreadPoolExecutor.java:180) [na: 1.8.0_45] en java.util.concurrent .ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (ScheduledThreadPoolExecutor.java:293) [na: 1.8.0_45] en java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) [na: 1.8.0_45] en java.util.concurrent .ThreadPoolExecutor $ Worker.run (ThreadPoo lExecutor.java:617) [na: 1.8.0_45] en java.lang.Thread.run (Thread.java:745) [na: 1.8.0_45] Causado por: java.net.ConnectException: Tiempo de espera agotado de la connection: no más información: /172.17.0.2:9300 en sun.nio.ch.SocketChannelImpl.checkConnect (Método nativo) ~ [na: 1.8.0_45] en sun.nio.ch.SocketChannelImpl.finishConnect (SocketChannelImpl.java:717) ~ [na : 1.8.0_45] en org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.connect (NioClientBoss.java:152) ~ [elasticsearch-1.6.0.jar: na] en org.elasticsearch.common.netty .channel.socket.nio.NioClientBoss.processSelectedKeys (NioClientBoss.java:105) ~ [elasticsearch-1.6.0.jar: na] en org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.process (NioClientBoss. java: 79) ~ [elasticsearch-1.6.0.jar: na] en org.elasticsearch.common.netty.channel.socket.nio.AbstractNioSelector.run (AbstractNioSelector.java:337) ~ [elasticsearch-1.6.0.jar : na] en org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.run (NioClientBoss.java:42) ~ [elasticsearch-1 .6.0.jar: na] en org.elasticsearch.common.netty.util.ThreadRenamingRunnable.run (ThreadRenamingRunnable.java:108) ~ [elasticsearch-1.6.0.jar: na] en org.elasticsearch.common.netty.util .internal.DeadLockProofWorker $ 1.run (DeadLockProofWorker.java:42) ~ [elasticsearch-1.6.0.jar: na] … 3 frameworks comunes omitidos

Como puede ver, se conecta con éxito a 127.0.0.1:9300, pero luego obtiene el nodo ip (172.17.0.2) y, por supuesto, falla la connection (no hay ping desde mi Windows que ejecute la máquina virtual hasta esta dirección IP) . Traté de desactivar el firewall y agregar este fuerte reenvío:

172.17.0.2:9300 -> 172.17.0.2:9300

o

172.17.0.2:9300 -> 10.0.0.15:9300

(10.0.0.15 es la ip de la VM) pero no tiene éxito.

Entiendo que el problema está en el reenvío de puertos, pero ¿cómo puedo solucionarlo?

Miré este tema , pero no encuentro aquí una respuesta, y supongo que es otro problema

El problema es que el clúster de Elasticsearch se encuentra en una networking diferente, que es la networking que Docker había creado.

Una forma de resolverlo es utilizar el túnel SSH en su máquina local a esa networking y reenviar desde un puerto local al 9300 remoto.

Aquí hay un ejemplo de cómo definir túneles SSH y un código de muestra sobre cómo conectarse a Elasticsearch utilizando la API del cliente JAVA.