IT

Docker コンテナの死活監視と自動起動:Bash スクリプトと Cronについて

やること。

サーバ内で Docker コンテナを利用して複数の WEB アプリを提供する。

5 分間隔でコンテナを死活監視し、死んでいた場合に自動復旧をするようにスクリプトと Cron を設定する。

必要なもの

コンテナが落ちていた時に復旧した内容を通知するために Slack の incoming webhooks を利用

URL の吐き出し方について以下を参照

ポイント

Teams は webhooks がなくなるとアナウンスがあったので、Slack を採用しています。

※WorkFlows 等をさらにかませないとこういった通知系が構築できなくなるようです。

利用するスクリプト

稼働させるコンテナ名を配列に格納し対象とさせます。

  • コンテナ名の取得方法

docker ps -a

  • スクリプト:check_health.sh
#!/bin/bash

CONTAINERS=("container-name1" "container-name2" "container-name3")
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/hogehoge"

# 各コンテナに対してループを実行
for container in "${CONTAINERS[@]}"
do
  # docker inspect コマンドを使用してコンテナの状態を確認 
  # grepコマンドで"true"を検索し、コンテナが稼働中かどうかを判定
   if ! docker inspect --format='{{.State.Running}}' $container | grep -q "true"; then
    # コンテナが停止している場合の処理
       echo "$container のコンテナが死んでいるので起動させます。"
    # docker startコマンドで停止しているコンテナを再起動
       docker start $container
    # curlコマンドを使用してSlackに通知を送信
       if [ ! -z "$SLACK_WEBHOOK_URL" ]; then
         curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"$container を再起動させました。\"}" $SLACK_WEBHOOK_URL
       fi
     else
       echo "$container が稼働中です。"
     fi
done

スクリプトを格納させる階層

/etcmonitorというディレクトリを作成し、スクリプトを配置し実行権限を付与します。

sudo chown root:root /etc/monitor/check_health.sh
sudo chmod 755 /etc/monitor/check_health.sh

Cron の設定

ubuntu では最初から Cron のサービス/自動起動が有効になっています。

  • 確認コマンド

systemctl status cron

  • Cron の設定を書き込むコマンド

sudo crontab -l

nanoでファイルが開かれます。

  • 開いたファイルの最終行に以下を追加

*/5 * * * * /etc/monitor/check_health.sh

  • Control + xでファイルを閉じれば設定完了

おまけ

Cron の死活監視のログを残したい場合には以下のようにします。

- 結果を書き込む用のファイルを用意

touch /var/log/check_health.log

- Cron の設定ファイルを以下のように変更

*/5 * * * * /etc/monitor/check_health.sh >> /var/log/check_health.log 2>&1

以上、どなたかのお役に立てば幸いです。

  • この記事を書いた人

緑川縁

ニートからシステムエンジニアになった人
クラウド案件をメインにやっています。
保持資格:CCNA,AWS SAA&SAP,秘書検定2級
趣味でボカロ曲作り始めました。

-IT
-