ElasticsearchをDockerで動かす

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/148110da-5405-4c32-952d-74cfdbc4f26c.png)
作成日：2025年2月22日(土)
更新日：2025年3月1日(土) ８章のDockerコンテナでのプラグインの導入を刷新

## １．はじめに

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

## ２．データ分析ツール

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

| 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）については、クラウドサービスとして社内利用する限りにおいて問題ないと判断しています。

関連記事

- [AWS、商用サービス化を制限するライセンス変更に対抗し「Elasticsearch」をフォーク、独自のオープンソース版へ － Publickey](https://www.publickey1.jp/blog/21/awselasticsearch.html)

## ３．Elasticsearchとは

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

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

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

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

### 特徴と強み

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

### 主な利用シーン

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

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

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

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

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

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

## ４．Dockerの基本とメリット

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

```mermaid
graph TD
  A[Dockerの基本とメリット] --> B[Dockerの概要とコンテナ技術]
  A --> C[Dockerを利用する利点]
  A --> D[開発・運用での活用事例]

  B --> E[アプリケーションをコンテナとしてパッケージ化]
  B --> F[ホストOSのカーネルを共有し、リソース効率が高い]
  B --> G[起動時間が短縮される]

  C --> H[環境の分離と統一]
  C --> I[簡単なデプロイ]

  D --> J[ElasticsearchとKibanaの迅速な環境構築]
  D --> K[チーム開発での統一環境提供]
  D --> L[CI/CDパイプラインの効率化]

```

### 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）と組み合わせることで、テストやデプロイの自動化が容易になり、開発プロセスの効率化が図れます。

## ５．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)が必須です**<br>WSLストアからインストールが必要です<br>また、パッケージ導入ソフトウエアの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](https://blog.interfamilia.co.jp/2021/05/11/Docker%E4%B8%8A%E3%81%AE-Elasticsearch-%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/)

```
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コマンドで削除する必要があります。

```mermaid
graph TD
  subgraph Docker[Docker Deamon]
    docker[Docker Engine]
    style Docker fill:#fff2e6,stroke:#f5a623
  end

  subgraph Containers[Containers]
    subgraph Elasticsearch[Elasticsearch]
      es01[es01]
      style Elasticsearch fill:#f9f2ff,stroke:#9b51e0
    end

    subgraph Kibana[Kibana]
      kibana[kibana]
      style Kibana fill:#e6f3ff,stroke:#4a90e2
    end
    style Containers fill:#f5f5f5,stroke:#666
  end

  docker --> es01
  docker --> kibana
  es01 -->|ELASTICSEARCH_HOSTS=es01:9200| kibana

  subgraph Volumes[Volumes<br>elasticsearch_esdata]
    es_data[es-data]
    style Volumes fill:#e8f5e9,stroke:#4caf50
  end

  es01 -->|/usr/share/elasticsearch/data| es_data

```

**①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の起動**

```jsx
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
```

**④動作確認**

```jsx
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#
```

## ６．Esticsearch(Kibana)へのブラウザでのアクセス

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

Kibanaの画面
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/82761aad-98d3-40b5-8d94-065e28c5134c.png" width="70%">

Elasticsearchの画面
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/5e6b9de8-416f-4f9f-890d-bd314dc49514.png" width="70%">

## ７．Kibanaの簡単な使い方

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

**①CSVデータのインポート**

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

CSVデータのインポートは[Kibana]⇒[Home]の「ファイルをアップロード」メニューから行います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/5497a5b0-d055-4d18-8b9f-5b793f90fbf3.png" width="70%">

「ファイルをアップロード」の画面で、CSVファイルをドラッグ＆ドロップします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/ffea81dc-1f65-4e43-9a22-dd0a2f5042d1.png" width="70%">

アップロードしたファイルが解析されたら、「インポート」ボタンを押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/51ce6cf8-ab1c-410f-bc96-994a69c45a41.png" width="70%">

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/ca6f1db3-4970-4c9f-b2f5-b271280d9472.png" width="70%">

「地理ポイントフィールドを追加」を選び
![Kibana_地理ポイントフィールドを追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/5734a4ce-f904-481b-b957-3b15fd846c60.png)

緯度フィールド、経度フィールドに対応するフィールド名（今回の場合は「緯度」、「軽度」）を設定して「地理ポイントフィールド」名に「location」と入力して「追加」ボタンを押します。
「地理ポイントフィールド」は「緯度」、「軽度」を複合したGeolocationフィールドとなります。
![Kibana_地理ポイントフィールド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/93dcb58a-8eb5-4664-b14e-64f8a2c8fbb6.png)

「インポート」ボタンを押してファイルをインポートします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/d52263d9-dfd4-4f19-9503-b95be4492e08.png" width="70%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/9f01b187-76f9-48ee-93b1-cb0845303244.png" width="70%">

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

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

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

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

インポートしたCSVファイルは[Kibana]⇒[Discover]から確認できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/f0354f68-9ac4-4d5b-9c8f-214bf29432fe.png" width="70%">

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/19ddd181-e16b-40b8-a33f-3de4aed83068.png" width="70%">

④ビジュアライゼーションの作成
「ビジュアライゼーションの作成」ボタンを押してマップのビジュアライゼーションを作成します。
マップのビジュアライゼーションを作成するには先ほど作成したGeolocation(経度緯度をまとめたフィールド)をドロップします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/852dcd88-4ea8-4e55-bde5-7e354243248f.png" width="70%">

ドラッグするとベースマップとshinagawa-public-wifiというレイヤーが作成されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/5ff40c9a-1364-4b82-b6bd-1bcbc692dcad.png" width="70%">

マップを品川までマウスでズームするとマップ上に丸印が表示されていることがわかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/a1cf21e1-69d4-43d0-b91a-7d80e6469219.png" width="70%">

この状態でshinagawa-public-wifiのレイヤーの設定をしていきます。
設定はshinagawa-public-wifiの右横にマウスオーバーで現れる「鉛筆のアイコン」です。
![Kibana_Map_layer_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/e56034b6-a550-4103-a724-2cb349f14262.png)

レイヤー設定で名前を付けて
![Kibana_Map_layer_name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/dd29c535-e957-44f6-ad44-87f9adad84ef.png)

ツールチップフィールドと並び替えに「施設名」を選択します。
![Kibana_Map_layer_tips.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/98bfbb3a-3a35-49e7-9dcd-b0b72ec7919f.png)

レイヤースタイルを「マーカー」から「アイコン」に変更してラベルを「値」にして「施設名」を選択すると地図上に施設名が表示されます。
![Kibana_Map_layer_icons.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/5de78760-e117-4265-9d89-d35660ba3a10.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/6bad775d-d8ff-4845-a0c3-5e69114abb91.png" width="70%">

「変更を保持」ボタンを押して、マップを保存します。
この時にマップのタイトルも入力します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/d3973ea0-b282-4219-95d5-b858b11c9451.png" width="70%">
※ダッシュボードがまだ保存していない場合は「新規」を選び保存します。
ダッシュボードも保存しておきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/19e7fb24-7ed0-484e-b36d-823eda8974bd.png" width="70%">

元データの例があまりよくありませんが、ヴィジュアライゼーションを追加していくよ、こちらのようなダッシュボードを作成することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/df91fc75-1f58-401a-a893-eca7d8d75db6.png" width="70%">

## ８．Dockerコンテナでのプラグインの導入

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

日本語形態素解析エンジンのkuromojiを導入したカスタムDockerイメージを作成するため、DockerfileとDocker Composeファイルを用意しました。
こちらのGitHubプロジェクトpotofo/Elasticsearchでは以下のことを実現しています。

| No | 出来ること | 説明 |
| --- | --- | --- |
| 1 | 公式のDockerイメージでElasticsearch＋Kibanaを起動する | 公式の[docker.elastic.co/elasticsearch/elasticsearch](https://hub.docker.com/_/elasticsearch)のDockerイメージ使用してElasticsearch+Kibanaを起動します。プラグインなどの導入はコンテナ作成毎にDockerコンテナで実施する必要があります。 |
| 2 | データの永続化 | Elasticsearchコンテナ内の/usr/share/elasticsearch/data、Kibanaコンテナ内の/usr/share/kibana/dataをホストのDocker vulumesにマップしています。<br>これにより、Dockerコンテナを再作成してもデータの永続化が実現できています。 |
| 3 | カスタムDockerイメージのビルド | analysis-kuromojiとanalysis-icuプラグインを導入して、ローカル環境にDocker imageをビルドして実行する。 |
| 4 | potofoのDockerイメージを使ってカスタムDockerイメージを起動する | #3を企業プロキシ環境下でdocker compose buildしたところ、社内のサーバ証明書やプロキシ環境をベースイメージにうまく導入できなかったため、GitHub Actionを使用してDockerHubにカスタムDockerイメージをCI/CDで自動ビルドするようにしました。<br>これにより企業プロキシ環境化であってもdocker compose up -dコマンドひとつで、analysis-kuromoji、analysis-icuが利用できるようになります。 |

リポジトリをgit cloneしてご利用ください。

https://github.com/potofo/Elasticsearch

https://hub.docker.com/r/potofo/elasticsearch

### 8.1. potofo/Elasticsearchのセットアップ

①リポジトリのクローンと初期設定

```bash
git clone https://github.com/potofo/Elasticsearch.git
cd Elasticsearch
```

②環境変数の設定（.envファイル）

```bash
STACK_VERSION=8.17.0
ELASTIC_PASSWORD=your_password
MEM_LIMIT=1073741824
ES_PORT=9200
KIBANA_PORT=5601
```

※ここでSTACK_VERSIONを8.17.2などにしてDocker Composeを起動するとバージョンアップがされます。

### 8.2. potofo/Elasticsearchサービスの起動

**①公式のDockerイメージでElasticsearch+Kibanaを起動する**

```bash
docker compose -f docker-compose.build.yml up -d
```

**②カスタムDockerイメージをビルドしてElasticsearch+Kibanaを起動する**

こちらの方法では公式のElasticsearchをベースイメージとして、analysis-kuromojiとanalysis-icuプラグインを追加したDockerイメージを作成し、ローカルのDocker環境に保存します。
保存したイメージを起動することでkuromojiが使えるようになります。

```bash
docker compose -f docker-compose.build.yml build
docker compose -f docker-compose.build.yml up -d

```

**③potofoのDockerイメージを使ってカスタムDockerイメージを起動する**

会社のプロキシ環境でDockerイメージが上手くビルドできなかったため、GitHub ActionのWorkflow機能でGitHubのmainリポジトリにpush時にGitHub環境でDockerイメージをビルドし、DockerHubにプッシュするようにしています。従って、analysis-kuromojiとanalysis-icuプラグインが提供されます。

```bash
docker compose up -d
```

### 8.3. kuromojiの動作確認

Kibanaの開発ツール(コンソールから以下のコマンドを実行すればkuromojiによる分かち書きが確認できます。

インストールしたkuromojiをKibanaの開発ツール(コンソール)から試す

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/f6c800a6-8969-4273-8632-66327431ea87.png" width="70%">

## ９．参考URL

[Dockerコンテナ上のElasticsearchのデータを永続化する - Qiita](https://qiita.com/matyahiko2831/items/0b07a7577142c00d50e7)

[Elasticsearch with Dockerでkuromoji pluginを使う｜Koji Iino](https://note.com/lizefield/n/necadb7abf225)

[東京都オープンデータカタログサイトホームページ](https://portal.data.metro.tokyo.lg.jp/)