DockerCompose で ES + Kibana 環境を構築しました!

前回の記事で ElasticSearch と Kibana の両方を Docker で起動する方法を紹介した。

toohsk.hateblo.jp

しかし、 Docker の Link などを使って管理していたので、手動で管理するものがたくさんあり、大変だった。
なので、今回は Docker Compose を利用する方法を紹介する。

Docker Compose

今回の ElasticSearch と Kibana のように、複数のコンテナを連携して管理する方法をオーケストレーションという。
このオーケストレーションの方法はいくつかあり、今話題の Kubernetes などがあるが、今回はその一つの Docker Compose を使った。
Kubernetes の場合、複数の pods 間で service discovery を行ってくれる機能や pods のスケーリングなどの機能がある。
Docker Compose は kubernetes のような複雑な機能はないが、一つのファイルで複数のコンテナを管理できる。
なので、今回のように実験的に環境を作ることに関して言えば、 Kubernetes は必要過多なサービスになると判断して、
Docker Composeでコンテナのビルド、起動、シャットダウンなどを一括で管理できるメリットを取った。

ES + Kibana with Docker Compose

複数のファイルにまたがるので、 Github 上にリポジトリを作成しました。

github.com

ElasticSearch も Kibana も 6.4.0 を利用している。

ElasticSearch

日本語の文章を解析するためには形態素解析器を使って文章を品詞ごとに分解する必要がある。
そのため、 ElaskticSearch の Dockerfile では、形態素解析器に elasticsearch-analysis-kuromoji のパッケージをダウンロードした。
パッケージをダウンロードするために標準入力でインストールを許可する入力が必要となる場合がある。
Docker でイメージをビルドする際、標準入力できないので、今回は echo y を利用して y を標準入力している。

docker-compose.yml

このファイルの中で ElasticSearch と Kibana のイメージを管理している。
yaml ファイル形式になっており、読み方は key-value として読んでいくと良いかと思う。
詳しくは、リファレンス Compose ファイル・リファレンス — Docker-docs-ja 17.06.Beta ドキュメント を読むのがいいと思う。 このリポジトリ内で注意するべき点がいくつかあるので、以下にメモしておく。

build

4行目と24行目に build key がある。
これは value 名のディレクトリに存在する Dockerfile をビルドする。
なので、ここの valuedocker-compose.yml がある構築用コンテクストのパスを指定する必要がある。
そして、各行の次の行で container-name でコンテナ名をつけている。こちらはときにディレクトリとは関係ないので自分が好きな名前をつければ良い。
ちなみに build 済みのイメージを利用することもでき、 image を利用し、イメージ名を指定すればよい。
詳しくは、 Compose ファイル・リファレンス — Docker-docs-ja 17.06.Beta ドキュメント に記載されている。

volumes

Docker は基本的にコンテナ内のデータは揮発性であり、毎回コンテナを起動すると初期状態で起動される。
つまり、前回 ElasticSearch に入力したデータは残らない。
データを保存したい場合、 docker の data volume として保存する必要がある。
今回は、 docker-compose.yml の30行目で data volume をローカルの docker 環境に構築し、利用するようにしている。
なので、真新しい環境を構築するためには、コンテナの再構築・再起動以外に、この volume を削除する必要がある。

辞書のマウント

kuromoji で形態素解析を行うにあたり、カスタマイズした辞書を利用するように template に記載している。
そのため、 docker-compose.yml の8行目で辞書をマウントしている。
この辞書は csv 形式で1行が一つの形態素解析の結果を表しており、
本文中の形式,形態素解析の結果,ヨミ,品詞 の形にしなければならない。

まとめ

今回は DockerCompose を利用した ES + Kibana 環境を構築した。
ES 環境で日本語の解析を試しに行いたい場合は、お手軽に試せるので是非活用してください。

わからないところなどはコメントや Github の issue にお願いします!