6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[v8.6] Elasticsearch/Kibanaをdocker-composeでインストールする手順(試用用途)

Posted at

はじめに

下記の記事にてWindows/Linux上でのElasticsearchのインストールをご紹介していました。

今回はdocker-composeを利用した手順を示したいと思います。現時点最新バージョンの8.6.2で実施しています。

docker-composeを使うメリットはいくつかあります。

  • 自分のPCや仮想マシンの環境を汚さずに済む
  • 設定ファイルを作ってしまえば、コマンド一発で立ち上がる
  • KibanaとElasticsearch間のセキュア通信の設定が自動で行われる
  • 環境依存がない(docker-composeさえ動けば良い)

本手順を試した環境

  • クラウド:GCP
  • OS: Debian GNU/Linux 11 (bullseye)
  • スペック: e2.mediumインスタンス (2 vCPU, 4GB mem)
  • Docker version 20.10.23, build 7155243
  • Docker Compose version v2.16.0

素の状態ではdocker/docker-composeは入っていないので、インストールを終えましょう

準備

vm.max_map_count

恐らく素のままだとElasticsearchが立ち上がりません。
下記コマンドを実行しておきます
sudo sysctl -w vm.max_map_count=262144
https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html

ファイアウォールルール

ローカルのPCやGUIのある環境(Windowsとか)で行う場合は特に必要ありません。
GUIの無い仮想マシン等に展開する場合は外部からKibanaにアクセスするので5601ポートを開けておきます。
直接Elasticsearchにアクセスする場合は9200も開けておきます。
GCPだとこのような感じになります。
スクリーンショット 2023-03-10 14.04.03.png

ドキュメント

基本的には下記のリンクで良いのですが、このdocker-composeファイルをそのまま使うと3ノード構成になってしまいます。
https://www.elastic.co/guide/en/elasticsearch/reference/8.6/docker.html#docker-compose-file
少しだけファイルを編集して1ノードで起動します。

設定ファイル

適当なディレクトリを作成して以下のように2つのファイルを作成したディレクトリに置きます。

.
├── .env
├── docker-compose.yml

docker-compose.yml

下記のものをそのままコピーして使います。

version: "2.2"

services:
  setup:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    container_name: setup
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
    user: "0"
    command: >
      bash -c '
        if [ x${ELASTIC_PASSWORD} == x ]; then
          echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
          exit 1;
        elif [ x${KIBANA_PASSWORD} == x ]; then
          echo "Set the KIBANA_PASSWORD environment variable in the .env file";
          exit 1;
        fi;
        if [ ! -f config/certs/ca.zip ]; then
          echo "Creating CA";
          bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
          unzip config/certs/ca.zip -d config/certs;
        fi;
        if [ ! -f config/certs/certs.zip ]; then
          echo "Creating certs";
          echo -ne \
          "instances:\n"\
          "  - name: es01\n"\
          "    dns:\n"\
          "      - es01\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          > config/certs/instances.yml;
          bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
          unzip config/certs/certs.zip -d config/certs;
        fi;
        echo "Setting file permissions"
        chown -R root:root config/certs;
        find . -type d -exec chmod 750 \{\} \;;
        find . -type f -exec chmod 640 \{\} \;;
        echo "Waiting for Elasticsearch availability";
        until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
        echo "Setting kibana_system password";
        until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
        echo "All done!";
      '
    healthcheck:
      test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"]
      interval: 1s
      timeout: 5s
      retries: 120
    mem_limit: ${MEM_LIMIT}
  es01:
    depends_on:
      setup:
        condition: service_healthy
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    container_name: es01
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata01:/usr/share/elasticsearch/data
      - ./:/etc/elasticsearch
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01
      - discovery.seed_hosts=es01
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es01/es01.key
      - xpack.security.http.ssl.certificate=certs/es01/es01.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es01/es01.key
      - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120
  kibana:
    depends_on:
      es01:
        condition: service_healthy
    image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
    container_name: kibana
    volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - SERVERNAME=kibana
      - ELASTICSEARCH_HOSTS=https://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
      - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
    mem_limit: ${MEM_LIMIT}
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  kibanadata:
    driver: local

envファイル

docker-compose.ymlで使う変数です。
必要に応じて変更してください。
MEM_LIMITは小さすぎると起動しません。

.env
STACK_VERSION = 8.6.2
ELASTIC_PASSWORD = elastic
KIBANA_PASSWORD = elastic
ES_PORT = 9200
CLUSTER_NAME = test_cluster
LICENSE = trial
MEM_LIMIT = 1073741824
KIBANA_PORT = 5601

起動

作成したディレクトリでdocker-compose up -dと実行します。
最初はイメージを持ってくるため時間がかかります。
コンテナイメージの大きさはこのような感じです。

$ docker images
REPOSITORY                                      TAG       IMAGE ID       CREATED       SIZE
docker.elastic.co/kibana/kibana                 8.6.2     65e53ffb7df5   3 weeks ago   727MB
docker.elastic.co/elasticsearch/elasticsearch   8.6.2     04485c81cc2d   3 weeks ago   1.29GB

Kibana ログイン

docker-compose logs -fを実行して以下の部分が出てきたらKibanaにログインできます。

kibana  | [2023-03-10T05:13:52.067+00:00][INFO ][status] Kibana is now available (was degraded)

自分のPCやGUIのある仮想マシンを使ってそのマシン上から使用する場合はhttp://localhost:5601
異なる場所の場合はhttp://<IP address>5601

エラー

以下のような感じになって失敗する場合がありました。

takeo_furukubo_elastic_co@takeo-docker-vm:~/elastic/singlenode$ docker-compose up -d
[+] Running 3/4
 ⠿ Network singlenode_default  Created                                                                                      0.1s
 ⠿ Container setup             Healthy                                                                                      2.5s
 ⠿ Container es01              Error                                                                                       41.9s
 ⠿ Container kibana            Created        

この場合一度docker-compose downとしてからdocker-compose up -dとすると起動します。

メモリ不足

docker-compose up -dを再度実行しても立ち上がらない場合はメモリが足りない可能性があります。
メモリが足りない場合もdocker-composeの表示としては上記と同じようになります。
失敗がかなり早いので、見分けはつきやすいです。
docker logs es01を実行してERROR: Elasticsearch exited unexpectedlyが表示されています。
ホストのメモリを増やすか、MEM_LIMITを増やしましょう。

停止

docker-compose.ymlファイルのある場所でdocker-compose down

削除

全てのコンテナイメージやボリュームなどまとめて消したい場合は停止後にdocker system prune -a
勿論Elasticsearch以外も消してしまいますのでご注意を。

最後に

本手順が完了すればKibanaでデータ分析ができるようになります。
今後以下のような内容で記載する予定です。

  • Elastic Agentが使えるようにdocker-composeでFleetを立ち上げる
  • Elasticsearchを複数立ち上げる
  • Master Dedicatedを立ち上げる

Elastic Cloud 無料トライアル

こちらからElastic Cloudの14日間無料トライアルを是非お試しください
Elastic Cloud 無料トライアル

手順は下記リンクをご参照ください
Elastic Cloud について 〜実際にデプロイメントを作ってみよう〜

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?