Docker上の Elasticsearch が起動できないときの対処法
初めまして。株式会社 Interfamilia の見習い社員、Wakaと申します。
実は私、数年前まではホテル等の宿泊施設で、接客業に従事しておりました。
2020年11月に未経験者枠で入社。以来、日々プログラミングの勉強に取り組みつつ、様々な開発業務に携わっております。
今回の記事では、そんな見習い社員の自分が、勉強する中で得た知識をご紹介したいと思います!
目次
※docker関連ソフト (docker-desktop等) がインストール済の状態を想定しています。
Windows 10 Pro
Docker version 20.10.5
Elasticsearch 6.3.2
WSLディストリビューション
>wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)
docker-desktop
docker-desktop-data
- docker-desktop上の仮想OS
# uname -a
Linux DESKTOP-OFFH5IN 4.19.128-microsoft-standard #1 SMP Tue Jun 23 12:58:10 UTC 2020 x86_64 Linux
Dockerコンテナ上のElasticsearchを起動した際、エラーが発生して、起動に失敗する場合があります。
何度か再起動を試みましたが…以下のメッセージが出力され、エラーが解消されません。
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
どうやら vm.max_map_count
の設定値が少ないことが原因らしいです。
ネット検索してみると、同じ事象についての対処法がいくつか確認できました。結構よく起こるエラーなんですね。
Linux系OSのカーネルパラメータの1つ。
Dockerは Linuxコンテナの技術を応用したツールなので、同様のパラメータ設定が適用されます。
問題の vm.max_map_count
ですが、1つのプロセスが使用可能な仮想メモリマップ領域の上限値 を設定するパラメータとのこと。デフォルト値は 65530
です。
通常であれば、デフォルト値の 65530
で問題ありません。
しかし、Elasticsearchを起動する場合は、これでは足りないようです。
このため、カーネルパラメータを調整して、vm.max_map_count=262144
と値を変更すれば良さそうです!
パラメータの変更方法としては、以下の3つが挙げらます。
- ルート権限で
sysctl
コマンドを実行すると、パラメータ設定の変更が可能です。
sysctl -w vm.max_map_count=262144
- ただし、この方法は一時的な設定変更になります。OSシャットダウンで値が消去され、再起動時には反映されません。
/proc/sys
配下ファイルに、パラメータ設定を直接書き込みます。- カーネルの挙動を決定するファイルなので、確実に設定反映が可能。
echo "262144" > /proc/sys/vm/max_map_count
- 結構デリケートなファイルなので、
vi
などで編集するのは好ましくない様子。
なお、/procディレクトリのファイルは仮想ファイルであるため、このディレクトリのファイルをviなどのエディタで編集することは厳禁です。
- この方法も一時的な設定変更となります。OSシャットダウンで値が消去され、再起動時には反映されません。
/etc/sysctl.conf
などの設定ファイルに値を保存すると、パラメータ設定が変更されます。- こちらは永続的な設定変更になります。OSシャットダウン ⇒ 再起動しても、値が消えません!
- ファイルに書かれた設定値を、OS起動時にオーバーライドする仕組みのようです。
「/etc/sysctl.conf」は、OS起動時に/proc/sys/ディレクトリのファイルに設定する値を記述しておくファイルです。
このファイル自体は/procディレクトリにあるファイルではありませんので、viエディタなどで編集することができます。
カーネルパラメータの設定用ファイルとしては、以下が挙げられます。
/etc/sysctl.conf
/etc/sysctl.d/
配下のファイル
以前は
/etc/sysctl.conf
が使用されていましたが、現在は/etc/sysctl.d/
が主流のようです。- Linuxディストリビューションによって異なりますが、少なくとも CentOS等では、バージョン7以降は
/etc/sysctl.d/
の使用が推奨されています。 - 念のため docker-desktop で
sysctl.conf
のファイル内容を確認すると…以下のコメントが記載されていました。/etc/sysctl.d/
配下のファイルを利用した方が良さそうです。
- Linuxディストリビューションによって異なりますが、少なくとも CentOS等では、バージョン7以降は
# cat /etc/sysctl.conf
# content of this file will override /etc/sysctl.d/*
以上の観点を踏まえた結果、③の永続的な設定方法が最適だと判断しました!
(起動する度に毎回パラメータを書き換えるのは、手間がかかって大変ですからね…)
実際に試した手順は以下になります。
① コマンドプロンプトを開く。
② WSL経由で、docker-desktop の仮想OSにアクセス。
$ wsl -d docker-desktop
③ ルート権限で /etc/sysctl.d/
配下の設定ファイルを編集。vi
エディタを使用。
# vi /etc/sysctl.d/00-alpine.conf
:
# vm.max_map_count for Elasticsearch
vm.max_map_count = 262144
④ sysctl
コマンドで、設定変更をただちに反映。(OSを再起動せずに変更を反映する)
# sysctl -p /etc/sysctl.d/00-alpine.conf
通常 sysctl.d
配下ファイルを読み込む場合は sysctl --system
を使います。
しかし、古いディストリビューションではオプションが未対応で、使えないこともあるようです。
このため、上記のようにパスを指定した上で sysctl -p
を実行する手法を取りました。
※パスを指定しないと、sysctl.conf
ファイルの設定が優先的に読み込まれます。
⑤ 設定値の変更反映を確認。
# sysctl -n vm.max_map_count
262144
※sysctl -a | grep vm.max_map_count
などでも閲覧可能です。
この対処法で、自分の環境ではスムーズに Elasticsearch を起動できるようになりました。
しかし…残念ながらこの方法も確実ではありません。
今回の対処法を実行した後も、何故かvm.max_map_count
の値が初期化されてしまい、
同じ手順を再実行する必要に駆られる場面が、少なからずありました。永続的に設定反映したハズなのに…(深まる謎)
おそらく、パラメータの値が初期化されてしまう、何かしらの契機があるのだと思われます。
そのため、今後も継続調査を行い、エラーを再発させない、より確実な対処法を模索したいと思います。
何か発見がありましたら、この記事でも共有する予定です。それではまた!