こんにちは。Яeiです。
今回は、現役エンジニアの私がDockerfileのHEALTHCHECKの書き方について記事にしようと思います。
Dockerのみを学習していると利用用途に疑問が生じるHEALTHCHECKですが、docker compose や ECS などを利用して実際にアプリケーション稼働を意識してくるととても重要になる命令となります。
是非、当記事で学んでみて下さい。
当記事は以下の公式リファレンスを元に記載しております。
Dockerfile reference >>
https://docs.docker.com/engine/reference/builder/#healthcheck
目次
結論:HEALTHCHECKの書き方
ヘルスチェックの基本的な使い方は以下になります。
HEALTHCHECK [OPTIONS] CMD command
これはコンテナの中でコマンドが実行されてコンテナの健全性をチェックしてくれます。
地味にあまり知られていませんが、以下のようにベースイメージのヘルスチェックをオフにする設定もあります。
HEALTHCHECK NONE (disable any healthcheck inherited from the base image)
詳細:HEALTHCHECKの使い方
HEALTHCHECK の使い方
HEALTHCHECK [OPTIONS] CMD command
OPTIONSは以下になります。
--interval=DURATION(デフォルト: 30s)
--timeout=DURATION(デフォルト: 30s)
--start-period=DURATION(デフォルト: 0s)
--start-interval=DURATION(デフォルト: 5s)
--retries=N(デフォルト: 3)
これを設定しておくと例えば docker ps などでコンテナステータスを見ると、以下のように出力されるようになります。
> docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61f6b554bac1 test:latest "bash" 32 minutes ago Up 32 minutes (unhealthy) elegant_volhard
> docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
928a08b38a84 test:latest "bash" 6 seconds ago Up 5 seconds (healthy) friendly_feynman
これにより、コンテナ起動して docker ps コマンドにて、すぐさまコンテナの正常性を確認することができるのです。
オプションを指定することで、コンテナ起動した後にヘルスチェック開始するまでの時間や、ヘルスチェックの間隔、タイムアウト値などを指定することができます。
例えば、以下のようなDockerfile を作成したとします。
FROM mynginx:latest
HEALTHCHECK --interval=5s --timeout=3s --start-period=5s \
CMD curl -f http://localhost/ || exit 1
これは、nginx が正しく起動したかをチェックするための記載になります。
nginx が起動していなければこのヘルスチェックは失敗します。nginx の起動に少し時間がかかることを考慮して start-period を 5秒で設定しております。
HEALTHCHECK 設定して何が嬉しいのか
コンテナのヘルスチェック状態が unhealthy になっても実はコンテナは起動し続けます。
そのため、ヘルスチェックの有用性がいまいち分からないことも多いです。
実はコンテナのヘルスチェックは他のオーケストレーションツールと組み合わせると絶大な効果を発揮してくれます。
オーケストレーションツール?と疑問に思われるかもしれませんが、オーケストレーションツールつは、複数のコンテナを一気に扱うためのツールとなります。
docker compose や AWS の ECS、kubernetes などなど、様々なオーケストレーションツールが開発されています。
これらのツールの中には、コンテナヘルスチェックが合格しなかった場合は自動的に再度コンテナ起動からやり直してくれたりします。
また、コンテナと別のコンテナの起動順を制御しており、ここでもヘルスチェックの合格を契機として次のコンテナを起動する、といったように使われているのです。
当記事は以上となります。
今回は HEALTHCHECK 命令について説明いたしました。Dockerだけ学習していても有用性を感じづらいかもしれませんが、とても重要な設定となりますので是非覚えておいてください。
長々とお疲れさまでした。