やること。
サーバ内で 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スクリプトを格納させる階層
/etcにmonitorというディレクトリを作成し、スクリプトを配置し実行権限を付与します。
sudo chown root:root /etc/monitor/check_health.sh
sudo chmod 755 /etc/monitor/check_health.shCron の設定
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
以上、どなたかのお役に立てば幸いです。
