Windows で Docker で Kibana を入れる

Windows に Kibana を入れてみようと思った。Elasticsearch も必要なので一緒にインストールする。また、環境を管理しやすくするために Docker を使いたい。今回使う PC には何も入っていないので、順にインストールしていくことにした。

Docker Desktop のインストール

Docker Desktop の Windowsインストーラをダウンロードして、インストールする。

www.docker.com

WSL 2 の設定

Docker Desktop のインストール直後、WSL の更新を行うようにダイアログが出た場合は、リンク先から「Linux カーネル更新プログラム パッケージ」をダウンロードしてインストールする。

インストールが終わったら、ダイアログに戻り、Docker Desktop を再起動する。

この手順は、Docker が WSL 2 をバックエンドとして使用するため。Windows 10 以降では Windows 上で Linux 環境を動かせる Windows Subsystem for Linux (WSL) が使えるようになったが、当初の WSL 1 と、後に出た WSL 2 では仕組みががっつり変わっている。Docker では WSL 2 を使うので、そのための更新が必要だということ。

Elasticsearch のインストール

Docker で Kibana をインストールする方法については、公式サイトに説明がある。Elasticsearch のインストール手順も含まれている。

www.elastic.co

前半は Elasticsearch のインストールで、以下のコマンドを実行せよと書いてある。コマンドプロンプトまたは PowerShell を起動して実行する。

docker network create elastic
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.2.0
docker run --name es-node01 --net elastic -p 9200:9200 -p 9300:9300 -t docker.elastic.co/elasticsearch/elasticsearch:8.2.0

僕の環境では、このうち 3 行目を実行したとき、どう見ても正常終了っぽいメッセージが出ていなかった。数行さかのぼって確認してみると、以下のエラーメッセージが見つかった。

ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch. bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

Linuxカーネルパラメーター vm.max_map_count が小さすぎて Elasticsearch を起動できないと言っている。Windows 上で動かそうとしているのに Linuxカーネルパラメーターを変えろと言われても……となるが、これには Docker が Windows 上でどうやって動いているかが関係している。

試しに wsl -l または wsl -l -v を使って、WSL 上に構築済みの Linux 環境をリストアップしてみる。

> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu                 Stopped         1
  docker-desktop-data    Running         2
  docker-desktop         Running         2

この出力例で Ubuntu と書かれているのは、僕が以前別件でインストールした Ubuntu なので、ここは環境によって異なる。

問題は docker-desktop と docker-desktop-data の方だ。

もともと Linux 用に開発された Docker を Windows 対応に移植したのではなく、「Windows 上で WSL を使って、Docker の動作に必要最低限の Linux 環境を構築し、そこに "Linux 版" の Docker をインストールする」という仕組みになっている。docker-desktop は、この「必要最低限の Linux 環境」を指している。

docker-desktop-data の方は、docker pull で取得したコンテナイメージを管理するための、もうひとつ別の Linux 環境のようだ。

ということは、docker-desktop の Linux 環境に入ってカーネルパラメーターを変更すればいいことになる。

具体的な方法をググって最初に見つけたのは、以下の手順だったが、これは不十分なようだ。

  1. wsl -d docker-desktop で、docker-desktop の Linux 環境に入る
  2. sysctl -w vm.max_map_count=262144 を実行する
  3. exit で docker-desktop の Linux 環境から抜ける

何が不十分かというと、Windows を再起動するとこの設定が消えてしまう。sysctl は実行中の Linux カーネルに対して変更を要求するためのコマンドで、保存は別途考える必要がある。通常の Linux では /etc/sysctl.conf に設定を使うとカーネル起動時に反映されるはずだが、 WSL 2 上の Linux ではそこが効かないらしい。このことは下記で議論されていた。

github.com

ここで紹介されていたのが、下記の記事。

stackoverflow.com

ここに寄せられている回答によれば、WSL 2 では /etc/sysctl.conf を読む仕組みがない (通常の Linux と異なり systemd などがない) ため、このファイルに書いても再起動時に反映されないのだという。そこで代わりに、C:\Users\<ユーザー名>\.wslconfig というファイルを作り、以下の内容を記載する。

[wsl2]
kernelCommandLine = "sysctl.vm.max_map_count=262144"

このファイルに書くと、WSL 2 で起動される全ての Linux 環境に適用されてしまうだろう。そこがちょっと嫌だ。上記の回答によると、Windows 11 では Linux 環境内の /etc/wsl.conf に記載することでも対応できるそうだが、編集をミスって Linux 環境が起動できなくなった場合に復旧方法がなく、事前にバックアップを取ることが推奨されていた。今回はちょっと面倒な気持ちが勝ったので、.wslconfig でやることにした。

試しに、wsl --shutdown で WSL をシャットダウンすると、Docker Desktop から「Docker バックエンドが停止されたけど、再起動する?」という趣旨の通知が表示されたので、そこに表示されていた Restart ボタンを押したところ、docker-desktop と docker-desktop-data の両方が再度起動状態になった。

確認のため、wsl -d docker-desktopLinux 環境に入り sysctl vm.max_map_count を実行すると、現在の値が

vm.max_map_count = 262144

と表示された。無事に反映されているようだ。確認が済んだので exitLinux 環境を抜ける。

先ほど作りかけたコンテナは残っているのでそれを起動しなおせばよさそうだが、試しにやってみたところ、初回にだけ表示されるというパスワードなどの情報が表示されなかった。

ということで、docker container rm es-node01 でいったん削除して、先ほどの 3 行目を再度実行。すると、無事に以下のメッセージが表示された。

--------------------------------------------------------------------------------------------------------------------------------------------
-> Elasticsearch security features have been automatically configured!
-> Authentication is enabled and cluster connections are encrypted.

->  Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
  <パスワード>

->  HTTP CA certificate SHA-256 fingerprint:
  <フィンガープリント>

->  Configure Kibana to use this cluster:
* Run Kibana and click the configuration link in the terminal when Kibana starts.
* Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes):
  <Kibana連携用のトークン>

-> Configure other nodes to join this cluster:
* Copy the following enrollment token and start new Elasticsearch nodes with `bin/elasticsearch --enrollment-token <token>` (valid for the next 30 minutes):
  <Elasticsearch複数ノード連携用のトークン>

  If you're running in Docker, copy the enrollment token and run:
  `docker run -e "ENROLLMENT_TOKEN=<token>" docker.elastic.co/elasticsearch/elasticsearch:8.2.0`
--------------------------------------------------------------------------------------------------------------------------------------------

ふむふむ……って、Kibana と連携させるためのトークン、有効期間が 30 分しかないの!?

とりあえず、上記の出力は後で必要になるので、コピーして安全な場所に保存しておく。

Kibana のインストール

手順の続きを読むと、プロンプトを新しく立ち上げて、以下の 2 行を実行しろとある。

docker pull docker.elastic.co/kibana/kibana:8.2.0
docker run --name kib-01 --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.2.0

時間に余裕がないので慌てているのだが、なぜここで docker pull をさせるのか。回線遅い人が途方に暮れるよ?

と思いつつ、無事に終わったので 2 行目を実行したところ、

Go to http://0.0.0.0:5601/?code=<6桁の数字> to get started.

と表示された。この URL をブラウザで開けばいいんだな! と思ってクリックしたが、開けない。

よく見るとアドレスが 0.0.0.0 になっている。えぇと、サーバーアプリがポートを開くとき、アドレスとして 0.0.0.0 を指定すると「任意のネットワークからの接続を受け付ける」という意味になるんだったはず。たぶん Kibana はそれをそのまま出力しているんだろう。先ほどのコマンドに -p 5601:5601 が含まれているから、Windows のポート 5601 に接続すれば、コンテナ内の 5601 につながるはず。

ということは、表示されたアドレスの 0.0.0.0 の部分を 127.0.0.0 に置き換えて http://127.0.0.1:5601/?code=<6桁の数字> にすればつながるはずだ。

ということでブラウザのアドレスバーでそのアドレスを入力したら、無事に Kibana の画面が表示された。

Enrollment token の入力欄があったので、先ほど Elasticsearch の初回起動時に表示された Kibana 連携用のトークンをコピーして貼り付け、Configure Elastic ボタンを押す。

しばらくすると初期設定が完了して、ログイン画面が表示された。

ユーザー名に elastic を、パスワードに Elasticsearch 初回起動時に表示されたパスワードを入力してみると、ログインできた。

次に "Start by adding integrations" というメッセージが表示された。よくわからないが、さっそく何かの製品と連携してデータを取り込むか、と聞かれているようだ。試しに "Add integrations" を押すと、連携できる製品の一覧が表示された。ここで選択すれば、例えば AWS EC2 のログを自動で取り込むように設定できるっぽい。

この状態で画面左側のハンバーガーメニューから Home を選ぶと、また "Start by adding integrations" のメッセージに戻ってしまう。ここで "Explore my own" を選択すると、以降は表示されなくなった。

完了!

ということで、ひとまず Kibana の画面が表示されるところまではできた。

もう午前 4 時だ……。寝ます。