如何使用TransportClient连接到官方Docker镜像中运行的ElasticSearch?

时间:2017-06-22 20:59:10

标签: java elasticsearch

(首先,我知道Can not connect to elasticsearch container in docker。我的问题仍然存在。)

我在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}]]

我做错了什么?官方文档的哪一部分不正确?

2 个答案:

答案 0 :(得分:1)

官方文档要求您将transport.host Docker环境变量设置为127.0.0.1。这需要设置为0.0.0.0

因此,要连接到官方ElasticSearch Docker镜像以进行测试,您需要像这样运行它:

$ 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,你得到了原来的例外。

答案 1 :(得分:0)

就我而言,“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