如何使用TransportClient连接到官方Docker镜像中运行的ElasticSearch?
(首先,我知道Can not connect to elasticsearch container in docker。我的问题仍然存在。)如何使用TransportClient连接到官方Docker镜像中运行的ElasticSearch?
我在ElasticSearch上踢轮胎。
我已经run the official Docker image from the command line as described in the official documentation,指定cluster.name
为elasticsearch
(文档声称是默认的,但检查发现它实际上是docker-cluster
默认):
$ docker run -p 9200:9200 -p 9300:9300 -e "http.host=0.0.0.0" -e "transport.host=127.0.0.1" -e "xpack.security.enabled=false" -e "cluster.name=elasticsearch" docker.elastic.co/elasticsearch/elasticsearch:5.4.2
你会注意到,我已经disabled the X-Pack security, following official documentation。
你会注意到,我一直都暴露端口9200和端口9300
在http://localhost:9200/_cat/health指向浏览器的结果是:
1498166019 21:13:39 docker-cluster yellow 1 1 3 3 0 0 3 0 - 50.0%
...不自信地填写我,但是按照official documentation运行时,我想这就是你所得到的结果。
无论如何,接下来,使用Java,我已经建立了Client
像这样:
this.client = new PreBuiltTransportClient(Settings.builder()
.put("cluster.name", "elasticsearch")
.put("client.transport.sniff", true)
.build())
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
你会注意到我指定127.0.0.1
作为主机名(匹配transport.host
财产)和9300
作为该端口(匹配暴露的端口)。
然后我运行:this.client.prepareGet("argle", "bargle", "1").get();
。我期待看到某种“嘿,假人,argle
不存在”的错误。
相反,这会导致可怕的:
NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{q00tH2RKTlCkXut03lYHOg}{127.0.0.1}{127.0.0.1:9300}]]
我在做什么错?官方文档的哪部分是不正确的?
官方文档希望您将transport.host
Docker环境变量设置为127.0.0.1
。这需要设置为0.0.0.0
。
所以连接到用于测试目的的官方ElasticSearch多克尔图像,你需要这样运行:
$ docker run -p 9200:9200 -p 9300:9300 -e "http.host=0.0.0.0" -e "transport.host=0.0.0.0" -e "xpack.security.enabled=false" docker.elastic.co/elasticsearch/elasticsearch:5.4.2
群集名称将是,相反的是文档告诉你 - docker-cluster
(不elasticsearch
)。这样就意味着,相反的是文档告诉你,你需要建立你的Java客户端这样的:
this.client = new PreBuiltTransportClient(Settings.builder()
.put("cluster.name", "docker-cluster")
.build())
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
此外,必须不有client.transport.sniff
设置为true
。如果使用此配置将其设置为true
,则会得到原始异常。
在我的情况下,“xpack.security.enabled = false”是解决方案。
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:5.4.1
ports:
- 9200:9200
- 9300:9300
container_name: elasticsearch
ulimits:
memlock:
soft: -1
hard: -1
mem_limit: 1g
environment:
- cluster.name=docker-cluster
- node.name=one
- bootstrap.memory_lock=false
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- network.publish_host=192.168.99.100
- transport.publish_port=9300
volumes:
- /usr/share/elasticsearch/data
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:5.4.1
ports:
- 9201:9200
- 9301:9300
container_name: elasticsearch2
ulimits:
memlock:
soft: -1
hard: -1
mem_limit: 1g
environment:
- cluster.name=docker-cluster
- node.name=two
- bootstrap.memory_lock=false
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- network.publish_host=192.168.99.100
- transport.publish_port=9301
- "discovery.zen.ping.unicast.hosts=192.168.99.100"
- "discovery.zen.minimum_master_nodes=2"
volumes:
- /usr/share/elasticsearch/data