当前位置: 首页 > news >正文

docker容器监控自动恢复

关于实现对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
http://www.xdnf.cn/news/113455.html

相关文章:

  • TKDE 2025年第3期研究热点与最新趋势
  • 中心极限定理(CLT)习题集 · 题目篇
  • 零基础上手Python数据分析 (22)案例实战]之利用 Matplotlib Seaborn 进行电商销售数据可视化分析
  • 罗伯·派克:Go语言创始者的极客人生
  • 人工智能与机器学习:二元分类决策树构建指南
  • Linux内核netlink机制 - 连接器(Netlink Connector)
  • ETL 数据集成都包含哪些?
  • 77. 组合
  • 【OpenGL with C++】1.使用CMake+GLFW+GLAD在Window搭建项目
  • Linux系统之----进程优先级、调度与切换
  • 基于 EFISH-SBC-RK3588 的无人机多光谱/红外热成像边缘计算方案
  • MyBatis操作数据库---从入门到理解
  • Python爬虫第19节-动态渲染页面抓取之Splash使用下篇
  • centos7使用certbot完成nginx ssl证书续期
  • 最高支持高速L3商用,华为发布ADS 4智驾系统
  • 【OSG学习笔记】Day 8: 纹理贴图——赋予模型细节
  • MCU通信接口技术解析:UART、SPI与I2C
  • 【云计算】云计算中IaaS、PaaS、SaaS介绍
  • 基于 springboot+vue+elementui 的办公自动化系统设计(
  • 系统与网络安全------弹性交换网络(3)
  • Unity MR开发:探索混合现实的无限可能 (VisionPro和HoloLens 2 对比)
  • 【KWDB 创作者计划】_上位机知识篇---Github
  • 虚拟机详解
  • 第十天 Shader编程:编写简单表面着色器 Addressable资源管理系统 DOTS(面向数据技术栈)入门
  • 计算机网络学习笔记
  • Rust实现高性能目录扫描工具ll的技术解析
  • java面向对象编程【基础篇】之基础语法
  • 【产品经理从0到1】Axure介绍
  • Windows申请苹果开发者测试证书Uniapp使用
  • 基于 Spring Boot 的银行柜台管理系统设计与实现(源码+文档+部署讲解)