Elasticsearch8をDockerで使ってみる (1) シングルノード構成

概要

Elasticsearchクラスタ構築の第一歩として、Docker上でElasticsearchと戯れてみる。

参考: Install Elasticsearch with Docker | Elasticsearch Guide

シングルノード構成

イメージの準備

イメージはelasticsearchまたはdocker.elastic.co/elasticsearch/elasticsearchを用いる。(どちらも内容は一緒)

今回は以下のようなDockerfileを作成し用いる。

1FROM docker.elastic.co/elasticsearch/elasticsearch:8.5.0
2RUN elasticsearch-plugin install analysis-kuromoji

elasticsearch-plugin installはElasticsearchのプラグインをインストールするコマンドである。 Elasticsearchではプラグインのインストールがほぼほぼ必須なので、 このように自前のDockerfileを作成して利用することが多いようである。

ちなみに、analysis-kuromojiは日本語の解析を行うためのプラグインで、 日本語データを扱う場合はほぼ必須となる。

docker-composeの作成

先程のDockerfileと同じディレクトリにdocker-compose.ymlを作成し、以下の内容とする。

1services:
2  es:
3    build:
4      context: .
5    environment:
6      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
7    ports:
8      - 9200:9200

ES_JAVA_OPTS=-Xms512m -Xmx512mはヒープサイズの指定である。(XmsとXmxの両方に同じサイズを記述すれば良い)
感覚的にはここで指定したメモリ+500MBくらいが必要になる気がする。

コンテナの起動

以下のコマンドを実行してコンテナを立ち上げる。

1docker-compose up -d

しばらくしてから正常に立ち上がっていることを確認する。

1docker-compose ps

うまく行けばコンテナがrunningのまま動き続けているはずである。

Note

ちなみに、Linuxで動かすと以下のようなエラーが出て立ち上がらない場合がある。

1bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
2ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/docker-cluster.log
3...
4ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.

この場合、ホスト側でsysctl vm.max_map_count=262144などを実行してカーネルパラメータを修正する。

エンドポイントへの接続

Elasticsearch8.0以降はデフォルトでセキュリティ機能が有効になっているため、 単純にHTTPリクエストを送っただけではアクセスすることが出来ない。 本来このセキュリティ機能を使うにあたって事前にアカウントの作成やCA証明書の発行などを行う必要があるのだが、 公式イメージをシングルノード構成で使う場合はこれらが自動的にセットアップされるようになっている。

パスワードの生成

デフォルトアカウントのelasticユーザーにパスワードを設定する。

 1$ docker-compose exec es /usr/share/elasticsearch/bin/elasticsearch-reset-password
 2WARNING: Owner of file [/usr/share/elasticsearch/config/users] used to be [root], but now is [elasticsearch]
 3WARNING: Owner of file [/usr/share/elasticsearch/config/users_roles] used to be [root], but now is [elasticsearch]
 4This tool will reset the password of the [elastic] user to an autogenerated value.
 5The password will be printed in the console.
 6Please confirm that you would like to continue [y/N]y
 7
 8
 9Password for the [elastic] user successfully reset.
10New value: GsSBO_UdsAk3d=dyvm=H

New value:の右にランダム生成されたパスワードが表示されるので、記録しておく。

Info

(11/17追記) 今回はコマンドによりパスワードを設定したが、コンテナの環境変数ELASTIC_PASSWORDに設定することでもパスワードを変更可能である。

1    environment:
2      - "ELASTIC_PASSWORD=p@ssw0rd"

CA証明書のコピー

ElasticsearchはTLSを用いるために自己署名証明書を生成して用いている。 curl等でリクエストを送る際には元となったCA証明書が必要となるため、コピーしておく。

1docker-compose cp es:/usr/share/elasticsearch/config/certs/http_ca.crt .

リクエストを送ってみる

先程準備したパスワードとCA証明書を使ってリクエストを送ってみる。

 1$ curl --cacert http_ca.crt -u elastic https://localhost:9200
 2Enter host password for user 'elastic':
 3{
 4  "name" : "d14b64ba748f",
 5  "cluster_name" : "docker-cluster",
 6  "cluster_uuid" : "Efw7ehlyRqqnG8fYRLjbmQ",
 7  "version" : {
 8    "number" : "8.5.0",
 9    "build_flavor" : "default",
10    "build_type" : "docker",
11    "build_hash" : "c94b4700cda13820dad5aa74fae6db185ca5c304",
12    "build_date" : "2022-10-24T16:54:16.433628434Z",
13    "build_snapshot" : false,
14    "lucene_version" : "9.4.1",
15    "minimum_wire_compatibility_version" : "7.17.0",
16    "minimum_index_compatibility_version" : "7.0.0"
17  },
18  "tagline" : "You Know, for Search"
19}

次回

今回は、公式イメージの自動セットアップ機能を活用しつつ最低限のノードを立ち上げてみた。

次回はデータの永続化に関する設定と、それに伴って必要となる自前でのセキュリティ基盤の構築を行う。

Elasticsearch8をDockerで使ってみる (2) | 永続化とX-Packセキュリティ

関連記事