docker容器监控&自动恢复

关于实现对docker容器监控以及自动恢复,这里介绍两种实现方案。

方案1:

实现思路

找到(根据正则表达式)所有待监控的docker容器,此处筛选逻辑根据docker运行状态找到已停止(Exit)类型的容器

代码清单1:

bash 复制代码
#!/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 ]]; then
    echo ">>>> 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}; done
    for 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 released
        sleep 30
        
        # Re-check if docker process is up
        set2=($(sudo docker ps -a | grep $i | grep "Exit" | awk '{print $16}'))
        set2_size=${#set2[@]}
        if (( set2_size != 0 )); then 
            docker restart $i
        fi
    done
    
fi


ctime2=`date +%Y-%m-%dT%k:%M:%S`
echo "--------------------------------------------------- Script end   at : $ctime2 "

方案2:

实现思路

找到(根据正则表达式)所有待监控的docker容器,"docker ps -a"匹配出所有需要监控的容器列表,"docker ps"匹配出当前存活的容器列表,差集即为有问题需要重启的容器

代码清单2:

bash 复制代码
#!/bin/bash


set1=($(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.txt

difference=($(comm -23 set1_sorted.txt set2_sorted.txt))

if [[ $set1_size -eq $set2_size ]]; then
    echo ">>>> 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 "-------------------------" $i
    done
    
fi

rm -f set1_sorted.txt set2_sorted.txt

配置crontab调度,实现简单定时调度

crontab -e : 编辑crontab

查看已配置的crontab:crontab -l

bash 复制代码
*/10 * * * * /aaa/bbb/my_docker_ha.sh >> /aaa/bbb/logs/my_docker_ha.log 2>&1
相关推荐
极客先躯40 分钟前
高级java每日一道面试题-2026年02月02日-实战篇[Docker]-如何实现容器的持久化存储?
docker·容器·面试宝典·持久化·存储·韵味·java高级面试题
My is 李豆2 小时前
CentOS 7 安装 Docker 完整教程(含 docker-compose 插件)
docker·eureka·centos
极客先躯2 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
kong@react3 小时前
Rocky Linux 10.2 全面解析:企业级 CentOS 替代方案及保姆级docker安装
java·linux·运维·docker
某林2124 小时前
Isaac Sim 5.1.0 无头服务器部署与 RTX 显存段错误排障全记录
运维·服务器·docker·容器·isaac
m0_738120724 小时前
Docker 环境下 Vulfocus 靶场搭建全流程(附镜像源问题解决方案)
运维·服务器·网络·安全·docker·容器
simeple4 小时前
记一次 Docker Compose 项目迁移:从 Windows Docker Desktop 迁移到 CentOS 服务器
docker
哆啦A梦——5 小时前
Ubuntu 虚拟机 Docker 与 MySQL 8.0.42 部署指南
mysql·ubuntu·docker
Plastic garden5 小时前
K8s知识(3) Pod亲和性,调度
云原生·容器·kubernetes