使用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