コンテナ上のESでlocalhostへのアクセスできない

以下のdocker-compose.ymlとDockerfile、elasticsearch.ymlの設定で
コンテナを作成しました。(使用するポート番号は9600)

そこでlocalhost:9600にアクセスしてもERR_EMPTY_RESPONSEとなってしまいます。

設定ファイルのパラメータに何か不足があるのでしょうか?

docker-compose.yml

version: '2.2'
services:
elasticsearch7-4:
build: elasticsearch-ver7.4.0-kuromoji
container_name: elasticsearch7-4
environment:
- node.name=es01
- cluster.initial_master_nodes=es01
- cluster.name=docker-cluster-es7-4
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata7-4:/usr/share/elasticsearch-7-4/data
ports:
- 9600:9600
volumes:
esdata7-4:
driver: local

Dockerfile

FROM docker.elastic.co/elasticsearch/elasticsearch:7.4.0
RUN elasticsearch-plugin install analysis-kuromoji
ADD config/elasticsearch.yml /usr/share/elasticsearch-7-4/config/
RUN chown elasticsearch:elasticsearch config/elasticsearch.yml

elasticsearch.yml

cluster.name: 'docker-cluster-es7-4'
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
xpack.security.enabled: false

elasticsearch.ymlの中で、Elasticsearchの待ち受けポートを9600にするような記述が見当たらないようです。

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-http.html

もしかすると、コンテナ側9200で、ホスト側で9600を期待しているということはありませんか?
とすると、以下のようにすれば解消できるのではと思います。

ports:
    - 9600:9200

コンテナ側も9600だとすると、まずコンテナ側のログを見てみると良いと思います。
publish_addressやbound_addressあたりで待ち受けポートが確認できるかと。

{"type": "server", "timestamp": "2019-10-15T11:20:52,815Z", "level": "INFO", "component": "o.e.h.AbstractHttpServerTransport", "cluster.name": "docker-cluster", "node.name": "8f4e1d21ed7d", "message": "publish_address {172.19.0.2:9200}, bound_addresses {0.0.0.0:9200}", "cluster.uuid": "GjKNsm0FTf2GnCm2MOXuvg", "node.id": "jbVXMQUSQXyNsbMUAZ1hug"  }

ご参考になれば幸いです。

回答ありがとうございます。
コンテナ側のログのmessageではpublish_addressやbound_addressが確認できなかったのですが、
回答に載せて頂いた記事によるとデフォルトで9200-9300で設定されており、
設定してないなら疎通できないということで、ご教示いただいた設定で試したところうまくいきました。ありがとうございます。

elasticsearch.ymlでhttp.port:9600にして再度試したところ同じようなエラーになったのですが、
これは何故でしょうか?

Dockerfileの中の記述が気になります。

ADD config/elasticsearch.yml /usr/share/elasticsearch-7-4/config/
RUN chown elasticsearch:elasticsearch config/elasticsearch.yml

Dockerコンテナ内に設定ファイルをホストからコピーして、所有者を変更する部分だと思いますが、
正しくは、/usr/share/elasticsearch/configにコピーすべきではないでしょうか?

また、cluster-nameやhttp.portの指定であれば、コンテナの環境変数に指定することでも設定ができます。

docker-composeであれば、このような感じになります。

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.0
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - http.port=9999
  (以下略)

ご参考になれば幸いです。

1 Like

返信が遅れてしまってすみません。
ご指摘いただいたようにelasticsearch.ymlではなく、docker-composeでポート指定したところうまくいきました。
回答に記載していた↓のドキュメントでは、http.portがデフォルトで9200-9300ということですが、この設定が反映されるのはelasticsearch.ymlではなくdocker-compose.ymlなのはなぜなのでしょうか?
何が言いたいかというと、Elasticsearchの設定を行う役割をelasticsearch.ymlをメインにして行えばよいのか、docker-composeに全てもたせるのか?という疑問があります。

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-http.html

自分の場合elasticsearch.ymlでは下記のような設定をし、

cluster.name: 'docker-cluster-es7-4'
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
xpack.security.enabled: false

docker-composeでは

elasticsearch7-4:
build: elasticsearch-ver7.4.0-kuromoji
container_name: elasticsearch7-4
environment:
- node.name=es01
- cluster.initial_master_nodes=es01
- cluster.name=docker-cluster-es7-4
- bootstrap.memory_lock=true
- http.port=9600
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata7-4:/usr/share/elasticsearch-7-4/data
ports:
- 9600:9600
volumes:
esdata7-4:
driver: local

という設定をしており、結局ESの設定はどのymlファイルでやるべきなのかがわからないというところです。

この設定が反映されるのはelasticsearch.ymlではなくdocker-compose.ymlなのはなぜなのでしょうか?

http.portの設定をelasticsearch.ymlに設定した場合でも、もちろん設定は反映されます。

以前提示された内容ですと、elasticsearch.ymlが意図しない場所に置かれてしまっていますので正しい場所に配置するようにします。
(configファイルの読み先を変えるような設定をしていない前提です)
そうすれば、設定ファイルで指定したhttp.portの値が有効になっていることが確認できるかと思います。

  • Dockerfile例(COPY行を見てください。 usr/share/elasticsearch/config/elasticsearch.ymlに設定ファイルをおいています)
FROM docker.elastic.co/elasticsearch/elasticsearch:7.4.0

RUN elasticsearch-plugin install analysis-kuromoji
COPY config/elasticsearch.yml /usr/share/elasticsearch/config/elasticsearch.yml
RUN chown elasticsearch:elasticsearch config/elasticsearch.yml

次に、docker-composeでの環境変数の指定とelasticsearch.ymlの使い分けについてです。
どういう使い方をされたいのかという用途や目的によって考え方は変わるかと思います。

例えば、ベースとなるような共通的な設定はelasticsearch.ymlにおいておき、
個々のノードごとにちょっとずつ違う設定をしたい場合は、個々にymlファイルを用意するのも面倒と考えれば、環境変数で動的に変更できるようにしておくことも考えられます。

もちろん環境変数ではなく、volume mountでymlファイルを渡すという考え方もあるかと思います。

version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.0
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - discovery.type=single-node
      - bootstrap.memory_lock=true
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      # ↓ イメージに含めるのではなく、コンテナ起動時に外から渡す形にする
      - ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml``

これも、どのぐらいのコンテナ数があるのか、どのぐらいelasticsearch.ymlのパターンがありそうなのかによってどれが良いのかは変わってくるかと思うので、
どうすべき、ということは一概には言えないかと。

ご参考になれば幸いです。

1 Like

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.