關于實現對docker容器監控以及自動恢復,這里介紹兩種實現方案。
方案1:
實現思路:
找到(根據正則表達式)所有待監控的docker容器,此處篩選邏輯根據docker運行狀態找到已停止(Exit)類型的容器
代碼清單1:
#!/bin/bash# 獲取時間信息,格式為:"年-月-日T時:分:秒"
ctime1=`date +%Y-%m-%dT%k:%M:%S`echo "--------------------------------------------------- Script start at : $ctime1 "# 正則表達式匹配所有已biz-aaa/biz-bbb/biz-ccc開頭,且以":v9"結尾的鏡像名,結果中排除容器"container_to_be_excluded",獲取位于索引為18位置上的docker名稱
#set1=($(sudo docker ps -a | grep -E "biz-(aaa|bbb|ccc).*:v9" | grep -v ' container_to_be_excluded' | awk '{print $18}'))# 正則表達式匹配所有已biz-aaa/biz-bbb/biz-ccc開頭,且以":v9"結尾的鏡像名,且進一步過濾出已停止的容器(status = "Exit"),此時其docker名位于索引為16的位置處
set1=($(sudo docker ps -a | grep -E "biz-(aaa|bbb|ccc).*:v9" | grep "Exit" | awk '{print $16}'))# 獲取數組長度
set1_size=${#set1[@]}# A).判斷數組長度是否為0,注意數字的判斷請使用:
## -eq : 相等
## -ne : 不同
# B).如果判斷字符串,則為:
## = : 相等
## != : 不同
if [[ $set1_size -eq 0 ]]; thenecho ">>>> All business docker processes are health!"
else echo ">>>> Some business docker processes are not health, will be restarted!"sleep 60;# 迭代數組,可以使用${set1[@]},或${set1[?]}# for循環如果一行搞定,可以這樣使用: for i in ${set1[@]};do ${CODE_LOGICAL}; donefor i in ${set1[@]};do echo ">>>>>>>> Docker instance - $i will be restarted right now"echo ">>>>>>>> Will execute command : docker restart $i"docker restart $i# Wait some time for resource to be releasedsleep 30# Re-check if docker process is upset2=($(sudo docker ps -a | grep $i | grep "Exit" | awk '{print $16}'))set2_size=${#set2[@]}if (( set2_size != 0 )); then docker restart $ifidonefictime2=`date +%Y-%m-%dT%k:%M:%S`
echo "--------------------------------------------------- Script end at : $ctime2 "
方案2:
實現思路:
找到(根據正則表達式)所有待監控的docker容器,"docker ps -a"匹配出所有需要監控的容器列表,"docker ps"匹配出當前存活的容器列表,差集即為有問題需要重啟的容器
代碼清單2:
#!/bin/bashset1=($(sudo docker ps -a | grep -E "biz-(aaa|bbb|ccc).*:v9" | grep -v ' container_to_be_excluded' | awk '{print $18}'))
set2=($(sudo docker ps | grep -E "biz-(aaa|bbb|ccc).*:v9" | grep -v ' container_to_be_excluded' | awk '{print $18}'))set1_size=${#set1[@]}
set2_size=${#set2[@]}# Sort sets
printf "%s\n" "${set1[@]}" | sort > set1_sorted.txt
printf "%s\n" "${set2[@]}" | sort > set2_sorted.txtdifference=($(comm -23 set1_sorted.txt set2_sorted.txt))if [[ $set1_size -eq $set2_size ]]; thenecho ">>>> All business docker processes are health!"
else echo ">>>> Some business docker processes are not health, will be restarted!"for i in ${difference[@]};do echo ">>>>>>>> Docker instance - $i will be restarted right now"docker restart $i#echo "-------------------------" $idonefirm -f set1_sorted.txt set2_sorted.txt
配置crontab調度,實現簡單定時調度
crontab -e : 編輯crontab
查看已配置的crontab:crontab -l
*/10 * * * * /aaa/bbb/my_docker_ha.sh >> /aaa/bbb/logs/my_docker_ha.log 2>&1