通过Java / Spring Boot连接到Docker Elasticsearch实例

我正在运行Docker的Elasticsearch实例。 图像来自jHipsterdocker中心回购: jhipster / jhipster-elasticsearch / – 我使用图像v1.3.2,因为我需要Elasticsearch 2.4.0(符合项目的春季启动版本)。

我使用docker docker-compose启动ES容器以及Logstash和Kibana映像。 这是启动ES容器的设置:

 jhipster-elasticsearch: image: jhipster/jhipster-elasticsearch:v1.3.2 ports: - 9400:9200 - 9500:9300 volumes: - ./log-es-config/elasticsearch_custom.yml:/usr/share/elasticsearch/config/elasticsearch.yml 

所以我使用REST和9400进行传输通信。

这是安装到ES config的elasticsearch_custom.yml中的configuration:

 cluster.name: "log-cluster" node.name: "log-node" http.host: 0.0.0.0 transport.host: 127.0.0.1 transport.tcp.port: 9500 transport.publish_port: 9500 

当我启动容器,这是我从http://localhost:9400/_nodes

 "cluster_name": "log-cluster", "nodes": { "xLsGj2DyTdCF89I7sAToVw": { "name": "log-node", "transport_address": "127.0.0.1:9500", "host": "127.0.0.1", "ip": "127.0.0.1", "version": "2.4.0", "build": "ce9f0c7", "http_address": "172.18.0.5:9200", "settings": { "cluster": { "name": "log-cluster" }, ... (I can put all response if needed) 

JAVA API:

现在我试图连接到这个ES节点,像这样:

  @Bean public ElasticsearchOperations logsElasticsearchOperations() throws UnknownHostException { Settings settings = Settings.settingsBuilder() .put("cluster.name", "log-cluster") .put("node.name", "log-node") .build(); Client client = TransportClient.builder() .settings(settings) .build() .addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("127.0.0.1", 9500))); ElasticsearchTemplate template = new ElasticsearchTemplate(client); template.createIndex(ProcessLog.class); log.debug("Elasticsearch for logs configured."); return template; } 

我得到的错误是最有名的一个:

Caused by: org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9500}]

我google了一下,尝试了不同的configuration方法, client.transport.sniff也设置为false ,但没有工作。 现在我花了很多时间来configuration这个,我仍然失去了一些东西。

预先感谢您的帮助。

更新:

当我启动应用程序时,也embedded了ES实例。 所以主机端口configuration是这样的:

  • embeddedES:9200(http),9300(tcp)
  • Docker的ES:9400(http),9500(tcp)

这里是完整docker-compose.yml

  version: '2' services: jhipster-elasticsearch: # elasticsearch 2.4.0 - to be in line with spring boot version image: jhipster/jhipster-elasticsearch:v1.3.2 ports: - 9400:9200 - 9500:9300 volumes: - ./log-es-config/elasticsearch_custom.yml:/usr/share/elasticsearch/config/elasticsearch.yml jhipster-logstash: image: jhipster/jhipster-logstash:v2.2.1 command: logstash -f /conf/logstash_custom.conf ports: - 5000:5000/udp - 6000:6000/tcp volumes: - ./logstash-log-es-conf/:/conf jhipster-console: image: jhipster/jhipster-console:v2.0.1 ports: - 5601:5601 jhipster-zipkin: image: jhipster/jhipster-zipkin:v2.0.1 ports: - 9411:9411 environment: - ES_HOSTS=http://jhipster-elasticsearch:9400 - ZIPKIN_UI_LOGS_URL=http://localhost:5601/app/kibana#/dashboard/logs-dashboard?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-1h,mode:quick,to:now))&_a=(filters:!(),options:(darkTheme:!f),panels:!((col:1,id:logs-levels,panelIndex:2,row:1,size_x:6,size_y:3,type:visualization),(col:7,columns:!(stack_trace),id:Stacktraces,panelIndex:7,row:1,size_x:4,size_y:3,sort:!('@timestamp',desc),type:search),(col:11,id:Log-forwarding-instructions,panelIndex:8,row:1,size_x:2,size_y:3,type:visualization),(col:1,columns:!(app_name,level,message),id:All-logs,panelIndex:9,row:4,size_x:12,size_y:7,sort:!('@timestamp',asc),type:search)),query:(query_string:(analyze_wildcard:!t,query:'{traceId}')),title:logs-dashboard,uiState:()) 

从您的泊坞窗撰写文件,主机上的端口9500映射到容器内的端口9300,即:

 ports: - 9500:9300 

因此,由于端口9500是Docker容器外部的TCP端口,因此在您的elasticsearch_custom.ymlconfiguration文件中,您应该有这个

 transport.tcp.port: 9300 transport.publish_port: 9300 

或者干脆把这两条线留出来,因为9300是默认的TCP端口。

我build议退后一步,安装Head Plugin( https://github.com/mobz/elasticsearch-head ),这样你可以看到你的集群,它会显示集群名称的详细信息。

也可以尝试从命令行发送一个简单的索引请求,以确保您可以连接到您的群集。

我设法通过在elasticsearch_custom.yml中将transport.host定义为0.0.0.0来实现这个工作,所以实例绑定到容器的ip。

也许这也应该是项目的github 回购的elasticsearch.yml的默认设置。