0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElasticsearchをDockerで動かす

Posted at

image.png

1.はじめに

コンピュータ業界で働いていると、日々の業務で大量のデータに囲まれていることに気づきます。
これらのデータは、コンピュータの利用状況の可視化、予実管理、不具合の予兆検知、そして障害発生時の原因分析など、さまざまな目的で活用されています。
つまり、大量のデータを検索・分析し、効果的にモニタリング・可視化する必要があるのです。
データ分析ツールには多くの選択肢がありますが、この記事ではオープンソースのElasticsearchに焦点を当て、WSL上のDockerでの実際の導入方法までを解説します。

2.データ分析ツール

大規模データ分析ツールの比較検討を行い、以下の主要な製品を評価しました:

No 項目 Elasticsearch OpenSearch Apache Solr Splunk
1 特徴 分散型検索エンジン、リアルタイム分析が可能 Elasticsearchフォーク、Apache 2.0ライセンス 高性能な全文検索エンジン、成熟した技術 高度な検索・分析機能、豊富な可視化オプション
2 主な用途 ログ分析、全文検索、メトリクス分析 ログ分析、全文検索、セキュリティ分析 サイト内検索、文書検索、eコマース ログ分析、セキュリティ監視、ビジネスインテリジェンス
3 コスト オープンソース(無料)、商用版は有料 オープンソース(無料) オープンソース(無料) 有料(比較的高価)
4 スケーラビリティ 高い(水平スケーリングが容易) 高い(Elasticsearchと同等) 中程度(設定が複雑) 高い(エンタープライズ向け)
5 GUIの使いやすさ 中程度(Kibanaを利用) 中程度(OpenSearch Dashboards) 低い(管理画面が基本的) 高い(直感的なUI)
6 コミュニティ支援 活発(大規模なコミュニティ、豊富なプラグイン) 成長中(Amazonがバックアップ) 安定(Apache財団のサポート) 限定的(企業主導の開発)

Elasticsearchを選択した理由

  • Dockerを使用すると導入障壁が低く、コストパフォーマンスに優れている(オープンソース)
  • Kibanaとの組み合わせにより、直感的なデータ可視化が可能
  • 現代のWebシステムで主流のJSON形式に対応しており、データ連携が容易
  • 標準的なRESTful APIを提供し、多様なプログラミング言語からアクセス可能

OpenSearchも有力な選択肢として検討しましたが、日本語対応、ツールの使いやすさ、コミュニティ支援などを総合的に評価した結果、Elasticsearchがより優れていると判断しました。ライセンス(SSPL、ELv2)については、クラウドサービスとして社内利用する限りにおいて問題ないと判断しています。

関連記事

3.Elasticsearchとは

Elasticsearchとは、開発者のShay Banonが妻の料理レシピ検索アプリを作ろうとしたことがきっかけで開発された、Apache Luceneをベースとする検索エンジンです。

当初、既存の検索エンジンでは十分な性能が得られなかったため、Shay Banon氏は自らオープンソースの検索ライブラリ「Compass」を開発しました。その後、さらにスケーラブルでリアルタイム検索が可能なシステムを目指して、2010年にElasticsearchを公開しました。

このプロジェクトは多くの企業や開発者に支持され、現在は大量データの検索や分析に広く利用されています。

Elasticsearchは分散検索エンジンとして、以下のような特徴と強みを持っています。

特徴と強み

特徴 説明
分散アーキテクチャ 複数のサーバー(ノード)にデータを分散保存し、高速な検索性能と高可用性を実現します。
リアルタイムデータ処理 データのインデックス作成や更新が即座に反映され、最新情報をリアルタイムで検索・取得できます。
高いスケーラビリティ データ量やトラフィックの増加に応じて、ノードを容易に追加し、システムの処理能力を水平に拡張できます。
多様なクエリ対応 テキスト、数値、地理情報など、さまざまなデータタイプの検索に対応し、複雑なクエリも柔軟に扱えます。
全文検索機能 大量の文書データから指定したキーワードを含むドキュメントを高速に検索できます。

主な利用シーン

利用シーン 説明
ログ解析 システムやアプリケーションのログデータを収集・分析し、障害検知や性能監視を行います。
全文検索 Webサイトやドキュメント管理システムで、高度な検索機能を提供します。
データ分析 ビジネスデータの集計や可視化を通じて、意思決定支援やトレンド分析を行います。
セキュリティ分析 セキュリティ関連のイベントデータを分析し、脅威の検出や対応をサポートします。
インフラ監視 システムやネットワークのメトリクスをモニタリングし、インフラの健全性を維持します。

これらの特徴と利用シーンにより、Elasticsearchは多様な業界で幅広く採用されています。

  • 複数のサーバーにデータを分散して保存し、高速な検索と高可用性を実現
  • リアルタイムでのデータ更新と検索が可能で、最新の情報をすぐに反映
  • スケーラビリティに優れ、データ量の増加に応じてノードを追加可能

主な利用シーンとしては:

  • **ログ解析:**システムログやアプリケーションログの収集・分析により、障害の検知や性能監視を実現
  • **全文検索:**Webサイトやドキュメント管理システムでの高度な検索機能の提供
  • **データ分析:**ビジネスデータの集計・可視化による意思決定支援やトレンド分析

これらの特徴により、Elasticsearchは多様な業界で幅広く採用されています。

4.Dockerの基本とメリット

ElasticsearchDockerで利用することで、環境構築やデプロイが効率化され、開発・運用がスムーズになります。以下に、Dockerの概要、利点、そしてElasticsearchの活用事例についてまとめました。

4.1. Dockerの概要とコンテナ技術

Dockerは、アプリケーションの実行環境を軽量なコンテナとしてパッケージ化し、どの環境でも一貫して動作させることができるプラットフォームです。従来の仮想マシンとは異なり、ホストOSのカーネルを共有するため、リソース効率が高く、起動時間も短縮されます。

4.2. Dockerを利用する利点

  • 環境の分離と統一
    Dockerコンテナは、アプリケーションとその依存関係を一つのパッケージにまとめるため、開発環境と本番環境の差異をなくし、「動作しない問題」を解決します。
  • 簡単なデプロイ
    Dockerイメージを使用することで、複雑な環境構築を自動化し、数秒でコンテナを起動できます。これにより、テスト環境の作成やCI/CDパイプラインの構築がスムーズになります。

4.3. 開発・運用での活用事例

  • Elasticsearchの環境構築
    Dockerを使用してElasticsearchとその可視化ツールであるKibanaの環境を迅速に構築できます。これにより、学習や開発時に手軽に環境を立ち上げることが可能です。
  • チーム開発での統一環境提供
    Docker Composeを使用して、バックエンド(例: RailsやDjango)とフロントエンド(例: ReactやVue)を含む統一された開発環境を構築し、チーム全体で同じ環境を共有できます。
  • CI/CDパイプラインの効率化
    DockerをCI/CDツール(例: GitHub ActionsやJenkins)と組み合わせることで、テストやデプロイの自動化が容易になり、開発プロセスの効率化が図れます。

5.ElasticsearchのDocker導入手順

ElasticsearchをDockerで動作させるには、ElasticsearchとKibanaのマルチコンテナ構成での構築がおすすめです。Elasticsearchを複数のコンテナに分散させて起動する事例は多く見られますが、同一ホスト上でのサービス分散にはあまりメリットがないため、今回はElasticsearchとKibanaのコンテナをそれぞれ1つずつ構築します。

Docker環境は、WindowsのWSL(Ubuntu)上のDocker環境で構築していきます。これにより、会社環境でも利用可能な構成となります。

5.1. 前提条件と環境準備

この記事では割愛しますが前提条件と環境準備で以下のソフトウェアや設定が必須です。

Docker Desktopは商用利用(*1)ができないためWSL(Ubuntu)上にDocker環境を構築し、DockerのコンテナとしてElasticsearchとKibanaを導入します。
※Docker Desktopは、WindowsコマンドやGUIでDockerコマンドを実行するためのクライアントを提供するだけであり、基盤となるWSLの使用は変わりません。

No ソフトウェア 説明 設定
1 WSL2(Windows Subsystem for Linux) Windows上でLinux環境を実行するための仮想化システム Windowsの機能として有効化が必要です
2 Ubuntu-22.04(WSL) WSL上で動作するLinuxディストリビューション *ElasticsearchをDockerで起動するにはvm.max_map_count = 262144対策(2)が必須です
WSLストアからインストールが必要です
また、パッケージ導入ソフトウエアのaptに対して企業プロキシの設定やプロキシサーバのサーバールート証明書などの設定が必要です。
3 Git バージョン管理システム 企業プロキシの設定やプロキシサーバのサーバールート証明書などの設定が必要です。
4 Docker コンテナ化プラットフォーム Docker EngineとDockerクライアントに企業プロキシの設定やプロキシサーバのサーバールート証明書などの設定が必要です。

(*1) Docker Desktopの商用利用

Docker Desktopは、商用利用に関して特定の制限があります。具体的には、従業員数が250人以上、または年間収益が1,000万米ドル以上の企業がDocker Desktopを商用目的で使用する場合、有料のサブスクリプションが必要となります。一方、従業員数が250人未満で、年間収益が1,000万米ドル未満の小規模企業や、個人利用、教育目的、非商用利用、オープンソースプロジェクトでの利用に関しては、引き続き無料でDocker Desktopを使用できます。

そのため、商用環境でDockerを利用する際に、これらの制限を回避する方法として、WSL(Windows Subsystem for Linux)上にDocker環境を直接構築することが考えられます。このアプローチでは、Docker Desktopを使用せずに、WSL上のUbuntuなどのLinuxディストリビューションにDocker Engineをインストールし、ElasticsearchやKibanaといったコンテナを導入することが可能です。これにより、Docker Desktopの商用利用に関する制限を受けずに、Dockerの機能を活用できます。

(*2) vm.max_map_count対策

Elasticsearchでは少なくともプロセスが262144個のメモリマップを割り当てる必要がありますが殆どのLinuxシステムでは65530がデフォルト値として定義されています。
WSL上のUbuntuの設定が65530の場合262144に変更する必要があります。
vm.max_map_countの確認は「cat /proc/sys/vm/max_map_count」コマンド、書き換えは「/etc/sysctl.conf」の最終行に「vm.max_map_count=262144」を追加して「sysctl -p」コマンドで可能です。
※ここではsudoを省略するために「sudo su -」コマンドでrootユーザ権限でコマンドを設定しています。

Docker上の Elasticsearch が起動できないときの対処法 | Interfamilia Engineer Blog

root@Ardbeg:~/Elasticsearch# cat /proc/sys/vm/max_map_count
65530
root@Ardbeg:~/Elasticsearch# vi /etc/sysctl.conf
root@Ardbeg:~/Elasticsearch# tail -10 /etc/sysctl.conf
#net.ipv4.conf.all.log_martians = 1
#

###################################################################
# Magic system request Key
# 0=disable, 1=enable all, >1 bitmask of sysrq functions
# See https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html
# for what other values do
#kernel.sysrq=438
vm.max_map_count=262144
root@Ardbeg:~/Elasticsearch# sysctl -p
vm.max_map_count = 262144
root@Ardbeg:~/Elasticsearch# cat /proc/sys/vm/max_map_count
262144
root@Ardbeg:~/Elasticsearch#

Windows11のWSLではさらに以下のコマンドでも設定しておきます。

root@Ardbeg:~/Elasticsearch# sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
root@Ardbeg:~/Elasticsearch#

5.2. docker-compose.ymlを利用したセットアップ

この記事では、docker-compose.ymlと.envファイルを使用して、以下の構成でElasticsearchをDockerで起動します。

Dockerコンテナは稼働中にはデータを保持しますが、コンテナを削除するとデータは失われてしまいます。この問題を解決するため、docker-compose.ymlのvolumes機能を使用してデータを永続化します。

つまり、Dockerコンテナ内のデータをホストコンピュータのファイルシステム上に保存する仕組みです。

図に示すelasticsearch_es-dataは、Dockerのグローバル領域(Ubuntuの場合は/var/lib/docker/volumes/elasticsearch_es-data/)に保存されます。なお、プロジェクトフォルダ内にデータを保存することも可能です。

※Dockerのグローバル領域のvolumesデータは、docker volumeコマンドで一覧表示、確認、削除などの操作が可能です。データは永続化が目的のため、Dockerコンテナを削除しても残り続けます。不要になった場合は、必ずdocker volume rmコマンドで削除する必要があります。

①docker-compose.ymlのサンプルコード

ElasticsearchはオフィシャルがDockerイメージをdocker.elastic.coで配布しています。従って以下のようなdocker-composeファイルを作成して、docker compose up -dとすればElasticsearchを実行することができます。

docker-compose.ymlファイルは.envファイルを自動的に読み込み、その中の環境変数をdocker-compose.yml内で利用できます。そのため、パスワードなどの環境依存の設定は.envファイルにまとめています。

version: '3.8'

services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    container_name: es01
    environment:
      - xpack.security.enabled=false
      - discovery.type=single-node
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - ${ES_PORT}:9200
    volumes:
      - es-data:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
    container_name: kibana
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - ELASTICSEARCH_HOSTS=http://es01:9200
      - xpack.security.enabled=true
      - xpack.security.authc.providers=[]
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
      - I18N_LOCALE=${I18N_LOCALE}
    mem_limit: ${MEM_LIMIT}
    depends_on:
      - es01
volumes:
  es-data:
    driver: local

②.envファイル

環境依存となる、ElastisearchのバージョンやElasticsearch、Kibanaのパスワード、公開ポート、メモリ、ライセンスなどをこちらのファイルにまとめています。

# Specify base informations
# You can confirm the version provided by Docker at the following URL.
# https://hub.docker.com/_/elasticsearch
STACK_VERSION = 8.17.0
ELASTIC_PASSWORD = elastic
KIBANA_PASSWORD = elastic
ES_PORT = 9200
# License trial... free 30days , basic ... Apache 2.0 License
# If set to trial, the self-generated license gives access only to all the features of a x-pack for 30 days. You can later downgrade the cluster to a basic license if needed.
# For details on the license, please refer to https://www.elastic.co/subscriptions.
LICENSE = basic
MEM_LIMIT = 1073741824
KIBANA_PORT = 5601
I18N_LOCALE = ja-JP

③docker composeの起動

root@Ardbeg:~/elasticsearch# tree -a .
.
├── .env
└── docker-compose.yml

0 directories, 2 files

root@Ardbeg:~/elasticsearch# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

root@Ardbeg:~/elasticsearch# docker compose up -d
WARN[0000] /root/elasticsearch/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 3/3
  Network elasticsearch_default  Created                                                                          0.3s
  Container es01                 Started                                                                          1.0s
  Container kibana               Started                                                                          1.9s

④動作確認

root@Ardbeg:~/elasticsearch# docker ps
CONTAINER ID   IMAGE                                                  COMMAND                  CREATED          STATUS          PORTS                                                 NAMES
0bf0e99e5003   docker.elastic.co/kibana/kibana:8.17.0                 "/bin/tini -- /usr/l…"   23 seconds ago   Up 21 seconds   0.0.0.0:5601->5601/tcp, :::5601->5601/tcp             kibana
1ed3e36667a0   docker.elastic.co/elasticsearch/elasticsearch:8.17.0   "/bin/tini -- /usr/l…"   23 seconds ago   Up 22 seconds   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 9300/tcp   es01

root@Ardbeg:~/elasticsearch# docker volume ls
DRIVER    VOLUME NAME
local     elasticsearch_es-data
local     vscode
root@Ardbeg:~/elasticsearch# docker volume inspect elasticsearch_es-data
[
    {
        "CreatedAt": "2025-02-22T10:35:40+09:00",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.config-hash": "7ecd86989a7672dfa2444a9dd46362abeb18657e5af7085761b79e8950281e9a",
            "com.docker.compose.project": "elasticsearch",
            "com.docker.compose.version": "2.32.4",
            "com.docker.compose.volume": "es-data"
        },
        "Mountpoint": "/var/lib/docker/volumes/elasticsearch_es-data/_data",
        "Name": "elasticsearch_es-data",
        "Options": null,
        "Scope": "local"
    }
]
root@Ardbeg:~/elasticsearch#

6.Esticsearch(Kibana)へのブラウザでのアクセス

docker psコマンドでKibanaが5601ポート、es01が9200ポートで動作していることを確認後、ブラウザでhttp://localhost:5601/にアクセスしてKibanaの管理画面を確認できます。
http://localhost:9200にアクセスするとElasticsearchからJSONレスポンスが返されます。シンプルな応答ですが、バージョン情報などを確認することができます。

Kibanaの画面
Kibana画面.png

Elasticsearchの画面
Elasticsearchの画面.png

7.Kibanaの簡単な使い方

Kibanaの概念は最初は少し難しく感じるかもしれませんが、以下で基本的な使い方を順を追って説明しますので、実際に試してみてください。

①CSVデータのインポート

今回は「東京都オープンデータカタログサイト」の品川区のFREE Wi-Fiのスポットデータ(PublicWIFI.csv)を使用させていただきます。
KibanaはSJISファイルの読み込みで文字化けが起こるので、エディタで事前にUTF-8に変換しました。

CSVデータのインポートは[Kibana]⇒[Home]の「ファイルをアップロード」メニューから行います。
Kibana_ファイルをアップロード.png

「ファイルをアップロード」の画面で、CSVファイルをドラッグ&ドロップします。
Kibana_ドラッグ&ドロップ.png

アップロードしたファイルが解析されたら、「インポート」ボタンを押します。
Kibana_インポート.png

重要:「データを追加するその他の方法」画面で「高度な設定」を選び、インデックス名(ここではshinagawa-public-wifi)を入力して「別のフィールドを追加」ボタンを押します。

Kibana_データーのインポート.png

「地理ポイントフィールドを追加」を選び
Kibana_地理ポイントフィールドを追加.png

緯度フィールド、経度フィールドに対応するフィールド名(今回の場合は「緯度」、「軽度」)を設定して「地理ポイントフィールド」名に「location」と入力して「追加」ボタンを押します。
「地理ポイントフィールド」は「緯度」、「軽度」を複合したGeolocationフィールドとなります。
Kibana_地理ポイントフィールド.png

「インポート」ボタンを押してファイルをインポートします。
Kibana_インポーボタン.png

Kibana_データを追加するその他の方法.png

※CSVファイルインポート時に緯度経度をGeolocationとして認識させます。デフォルトではDuble型で認識されてしまい地図上にマップできません。

※CSVファイルの漢字コードは事前にエディタなどで、UTF-8に変換する必要があります。

※日付はYYYY-MM-DD形式である必要があります。

②Discoverでのインデックスの確認

インポートしたCSVファイルは[Kibana]⇒[Discover]から確認できます。
Kibana_Discover.png

③ダッシュボードの作成
ダッシュボードは[Kibana]⇒[Analytics]⇒[Dashboards]メニューから作成します。
Kibanaでは可視化させて見せたいダッシュボードに複数のビジュアライゼーションを配置すると、各々のビジュアライゼーションがドリルダウン(クリックした情報)に基づいて細分化され表示されます。

Kibana_ダッシュボード.png

④ビジュアライゼーションの作成
「ビジュアライゼーションの作成」ボタンを押してマップのビジュアライゼーションを作成します。
マップのビジュアライゼーションを作成するには先ほど作成したGeolocation(経度緯度をまとめたフィールド)をドロップします。
Kibana_ビジュアライゼーション.png

ドラッグするとベースマップとshinagawa-public-wifiというレイヤーが作成されます。
Kibana_Map_layer.png

マップを品川までマウスでズームするとマップ上に丸印が表示されていることがわかります。
Kibana_Map_layer_visu.png

この状態でshinagawa-public-wifiのレイヤーの設定をしていきます。
設定はshinagawa-public-wifiの右横にマウスオーバーで現れる「鉛筆のアイコン」です。
Kibana_Map_layer_edit.png

レイヤー設定で名前を付けて
Kibana_Map_layer_name.png

ツールチップフィールドと並び替えに「施設名」を選択します。
Kibana_Map_layer_tips.png

レイヤースタイルを「マーカー」から「アイコン」に変更してラベルを「値」にして「施設名」を選択すると地図上に施設名が表示されます。
Kibana_Map_layer_icons.png

Kibana_Map_layer_complete.png

「変更を保持」ボタンを押して、マップを保存します。
この時にマップのタイトルも入力します。
Kibana_Map_layer_save.png
※ダッシュボードがまだ保存していない場合は「新規」を選び保存します。
ダッシュボードも保存しておきます。

Kibana_Dashboard_with_map.png

元データの例があまりよくありませんが、ヴィジュアライゼーションを追加していくよ、こちらのようなダッシュボードを作成することができます。

Kibana_Dashboard_complete.png

8.プラグインの導入

Dockerコンテナでプラグインを永続的に利用するにはDockerイメージのリビルドが必要です。

<後日書き足します。>

9.参考URL

Dockerコンテナ上のElasticsearchのデータを永続化する - Qiita

Elasticsearch with Dockerでkuromoji pluginを使う|Koji Iino

東京都オープンデータカタログサイトホームページ

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?