Docker上の Elasticsearch が起動できないときの対処法

Docker上の Elasticsearch が起動できないときの対処法

初めまして。株式会社 Interfamilia の見習い社員、Wakaと申します。

実は私、数年前まではホテル等の宿泊施設で、接客業に従事しておりました。
2020年11月に未経験者枠で入社。以来、日々プログラミングの勉強に取り組みつつ、様々な開発業務に携わっております。

今回の記事では、そんな見習い社員の自分が、勉強する中で得た知識をご紹介したいと思います!


目次

Docker上のElasticsearchが起動しない!

環境

※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 の設定値が少ないことが原因らしいです。

ネット検索してみると、同じ事象についての対処法がいくつか確認できました。結構よく起こるエラーなんですね。


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 コマンドを実行すると、パラメータ設定の変更が可能です。
sysctl -w vm.max_map_count=262144
  • ただし、この方法は一時的な設定変更になります。OSシャットダウンで値が消去され、再起動時には反映されません。

② /proc/sys/ 配下に設定を記述する (一時的な変更)

  • /proc/sys 配下ファイルに、パラメータ設定を直接書き込みます
    • カーネルの挙動を決定するファイルなので、確実に設定反映が可能。
echo "262144" > /proc/sys/vm/max_map_count
  • 結構デリケートなファイルなので、vi などで編集するのは好ましくない様子。

なお、/procディレクトリのファイルは仮想ファイルであるため、このディレクトリのファイルをviなどのエディタで編集することは厳禁です。

引用:/etc/sysctl.conf | Linux技術者認定 LinuC | LPI-Japan

  • この方法も一時的な設定変更となります。OSシャットダウンで値が消去され、再起動時には反映されません。

③ 設定ファイルに値を保存する (永続的な変更)

  • /etc/sysctl.conf などの設定ファイルに値を保存すると、パラメータ設定が変更されます。
  • こちらは永続的な設定変更になります。OSシャットダウン ⇒ 再起動しても、値が消えません!
    • ファイルに書かれた設定値を、OS起動時にオーバーライドする仕組みのようです。

「/etc/sysctl.conf」は、OS起動時に/proc/sys/ディレクトリのファイルに設定する値を記述しておくファイルです。
このファイル自体は/procディレクトリにあるファイルではありませんので、viエディタなどで編集することができます。

引用:/etc/sysctl.conf | Linux技術者認定 LinuC | LPI-Japan

  • カーネルパラメータの設定用ファイルとしては、以下が挙げられます。

    • /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/ 配下のファイルを利用した方が良さそうです。
# 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 の値が初期化されてしまい、
同じ手順を再実行する必要に駆られる場面が、少なからずありました。永続的に設定反映したハズなのに…(深まる謎)

おそらく、パラメータの値が初期化されてしまう、何かしらの契機があるのだと思われます。
そのため、今後も継続調査を行い、エラーを再発させない、より確実な対処法を模索したいと思います。

何か発見がありましたら、この記事でも共有する予定です。それではまた!


参考リンク