无法通过java-client连接到Dockerized elasticsearch

我使用OFFICIAL REPO elasticsearch docker镜像设置了一个elasticsearch容器。 然后运行它

docker run -dP elasticsearch 

容易和工作。 ps的信息是

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 658b49ed9551 elasticsearch:latest "/docker-entrypoint. 2 seconds ago Up 1 seconds 0.0.0.0:32769->9200/tcp, 0.0.0.0:32768->9300/tcp suspicious_albattani 

我可以通过端口32769-> 9200使用http-client访问服务器

 baihetekiMacBook-Pro:0 baihe$ curl 10.211.55.100:32769 { "status" : 200, "name" : "Scorpia", "cluster_name" : "elasticsearch", "version" : { "number" : "1.4.5", "build_hash" : "2aaf797f2a571dcb779a3b61180afe8390ab61f9", "build_timestamp" : "2015-04-27T08:06:06Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline" : "You Know, for Search" } 

现在我需要我的JAVA程序来处理dockerized elasticsearch。 Java节点客户端只能通过32768-> 9300(集群节点通话端口)连接到elasticsearch。 所以我configuration我的java这样的运输客户端

  Settings settings = ImmutableSettings.settingsBuilder() .put("client.transport.sniff", true) .put("client.transport.ignore_cluster_name", true).build(); client = new TransportClient(settings); ((TransportClient) client) .addTransportAddress(new InetSocketTransportAddress( "10.211.55.100", 32768)); 

然后我在控制台中得到以下错误:

 Caused by: org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [] at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:305) at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:200) at org.elasticsearch.client.transport.support.InternalTransportIndicesAdminClient.execute(InternalTransportIndicesAdminClient.java:86) at org.elasticsearch.client.support.AbstractIndicesAdminClient.exists(AbstractIndicesAdminClient.java:170) at org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequestBuilder.doExecute(IndicesExistsRequestBuilder.java:53) at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:91) at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:65) at cct.bigdata.yellowbook.service.impl.ResourceServiceImpl.<init>(ResourceServiceImpl.java:49) at cct.bigdata.yellowbook.config.YellowBookConfig.resourceService(YellowBookConfig.java:21) at cct.bigdata.yellowbook.config.YellowBookConfig$$EnhancerBySpringCGLIB$$e7d2ff3e.CGLIB$resourceService$0(<generated>) at cct.bigdata.yellowbook.config.YellowBookConfig$$EnhancerBySpringCGLIB$$e7d2ff3e$$FastClassBySpringCGLIB$$72e3e213.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:312) at cct.bigdata.yellowbook.config.YellowBookConfig$$EnhancerBySpringCGLIB$$e7d2ff3e.resourceService(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166) ... 31 common frames omitted 

当我直接在主机上运行elasticsearch时。 一切都好。

我检查docker集线器上所有的elasticsearch的dockerfile。 看来他们全都是这样做的:

 EXPOSE 9200 9300 

我想知道有没有人试图做类似的事情。 9300是正常的TCP端口还是UDP端口? 运行容器时,我需要做一些特殊的事情吗? 谢谢!

如果你设置"client.transport.sniff"false它应该工作。

如果你仍然想要使用嗅探按照下面的说明: https : //github.com/olivere/elastic/wiki/Docker

详细的讨论在这里: https : //github.com/olivere/elastic/issues/57#issuecomment-88697714

这适用于我(在docker-compose.yml中)。

 version: "2" services: elasticsearch5: image: docker.elastic.co/elasticsearch/elasticsearch:5.5.3 container_name: elasticsearch5 environment: - cluster.name=elasticsearch5-cluster - http.host=0.0.0.0 - network.publish_host=127.0.0.1 - transport.tcp.port=9700 - discovery.type=single-node - xpack.security.enabled=false ports: - "9600:9200" - "9700:9700" 

指定network.publish_host和transport.tcp.port似乎有窍门。 sniff = true仍然有效。