使用docker搭配Linux WatchDog

在Linux上,Module有支援WatchDog模組,可以透過設定/etc/modules來達到(詳情請見參考文獻),這部分模組設定好後,可以搭配apt-get install watchdog來安裝watchdog的相關服務,來搭配使用...

搭配Docker建置可以重啟OS的Docker

在watchdog模組設定好後,會在/dev中出現/dev/watchdog這個裝置,該裝置在watchdog模組載入後,可以透過:

echo 1 > /dev/watchdog

來通知系統重新開機... 這個可以搭配watchdog服務做到裝置無回應時候可以重新開機的動作...下面是在Raspberry Pi上的相關設定:

安裝WatchDog

軟體的watchdog在debian可以透過apt-get安裝,如下:

apt-get install watchdog -y

WatchDog設定檔(/data/watchdog.conf):

test-binary        = /data/test-docker.sh
watchdog-device    = /dev/watchdog
interval        = 1
realtime        = yes
priority        = 1

啟動時執行腳本(start.sh):

#!/bin/bash

echo "Got PS_NAME=$PS_NAME"
if [[ -n $PS_NAME ]] ; then
  watchdog -c /data/watchdog.conf -F
else
  echo "NO PS_NAME PARAMETER FIND..."
fi

WatchDog的test-binary腳本(/data/test-docker.sh)

#!/bin/bash
if [[ ! -n $TOTAL_CNT ]] ; then
  TOTAL_CNT=1
fi

if [[ ! -n $PS_NAME  ]] ; then
  PS_NAME=mynginx
fi

if [ `docker ps | grep -E "$PS_NAME" | wc -l` -eq $TOTAL_CNT ] ; then
  echo "SUCCESS..."
  exit 0;
else
  echo "ERR..."
  exit 1;
fi

Dockerfile:

FROM resin/rpi-raspbian

RUN apt-get update -y && apt-get install watchdog vim -y
add . /data
workdir /data

#entrypoint ["sh", "start.sh"]
CMD ["/data/start.sh"]

準備好上面檔案後,可以透過docker build將該image建置起來:

docker build -t watchdog .

測試執行

Step1: 啟動名稱為myservice的程序

docker run --name=myservice -d resin/rpi-raspbian \
  sh -c "while [ true ] ; do echo "hello..." ; sleep 3; done"

上面會啟動一個無窮迴圈,目的只是讓裝置覺得myservice存在

Step2: 執行watchdog的程式,須注意,因為有存取/dev資料匣的需求,需要開啟privileged全縣,並且掛載/dev/watchdog檔案,讓instance內部可以看到該watchdog裝置...

docker run -d -v /dev/watchdog:/dev/watchdog \
  -v /run/docker.sock:/run/docker.sock \
  -v /usr/bin/docker:/bin/docker \
  --privileged \
  -e "PS_NAME=myservice" \
  watchdog

測試服務中斷:

docker stop myservice

順利的話,就會看到Raspberry Pi被重開...

結語

相似的概念,可以用在一些重要服務異常停止後必須重新開機的狀況,給大家參考 :D

Reference

results matching ""

    No results matching ""