背景:在linux环境下,很多服务我们都使用docker来跑,很是方便,容器服务独立,配置独立,数据独立等等,但是有个问题,就是如果某个服务异常了,暂停了,停止了,一直重启中,我们要怎么及时的知道是哪个服务,并进行处理,保证业务正常运行。
本文主要介绍使用docker服务自带的一些命令来实现一个基本的监控,并通过钉钉群机器人发送消息。
命令1
docker ps //列出所有正在运行中的服务,注意,暂停,停止等状态的服务是不会被列出的
命令2
docker ps -a //会列出当前服务器中所有的容器,无论状态是什么
命令3
docker ps -f //使用过滤器来过滤输出,此处我们以STATUS字段为例,它可能有的值如下:
-created(已创建)
-restarting(重启中)
-running(运行中)
-removing(迁移中)
-paused(暂停)
-exited(停止)
-dead(死亡)
步骤:
1、列出所有运行中的服务
2、停止redis1服务
3、暂停redis2服务
4、查看停止状态的服务
5、查看暂停状态的服务
但是这样显示出来的信息有点多,不够简洁,如果我只想显示我启动服务的时候的自定义名称呢,可以不
命令4
docker ps -f status=exited --format {{.Names}} //先过滤一遍状态,然后再格式化Names字段,还有其他字段也支持格式化的:
.ID 容器的ID
.Image 镜像的ID
.Command 容器启动的命令
.CreatedAt 创建容器的时间点
.RunngingFor 从容器创建到现在过去的时间
.Ports 暴露的端口
.Status 容器的状态
.Size 容器硬盘的大小
.Names 容器的名称
.Label 指定label的值
.Mounts 挂载到这个容器的数据卷名称
.Image 镜像的ID
.Command 容器启动的命令
.CreatedAt 创建容器的时间点
.RunngingFor 从容器创建到现在过去的时间
.Ports 暴露的端口
.Status 容器的状态
.Size 容器硬盘的大小
.Names 容器的名称
.Label 指定label的值
.Mounts 挂载到这个容器的数据卷名称
看,只显示了名称了是不是,这里说一下哈,字段名的大小写问题
结论1:-f 后面的参数,大小写都可以
结论2:--format大括号里面的参数,必须按规定来
命令5
docker info //查看整个docker服务运行的情况,配置等信息,篇幅问题,只截图了一大部分哈
重点说一下划线的地方,这里把容器总数量,运行中的,暂停中的,停止中的都统计出来了
我们对比一下,运行中的3个,暂停中的1个,停止的1个,完美匹配。
命令6
docker info --format '{{.Containers}}' //从info内容中提取Containers的值
1、统计全部
2、统计运行中的
3、停止redis1
4、暂停redi2
5、统计运行中的
6、统计暂停的
7、统计停止的
通过以上的一些命令的组合应用,就可以做一个基本的docker服务运行监控,我贴出我的思路,欢迎指正哈!
#原理:如果所有容器服务数量 > 正在运行中的服务数量,则表示有服务异常,可能是暂停了,停止了,退出了,重启中,发消息到钉钉群
#运行:使用crond任务自定义时间自动运行
#所有容器服务数量 docker_ps_a=$(docker info --format '{{.Containers}}') #echo $docker_ps_a #运行中的容器服务数量 docker_runing=$(docker info --format '{{.ContainersRunning}}') #echo $docker_runing if [ $docker_ps_a -gt $docker_runing ]; then #已停止的 docker_stop=$(docker ps -f status=exited --format {{.Names}}) #已暂停的 docker_paused=$(docker ps -f status=paused --format {{.Names}}) #重启中的 docker_restarting=$(docker ps -f status=restarting --format {{.Names}}) #通知时间 notice_time=`date +"%Y-%m-%d %H:%M:%S"` #把所有异常的服务合并起来 docker_abnormal=$notice_time"\r\n====已停止服务====\r\n"$docker_stop"\r\n====已暂停服务====\r\n"$docker_paused"\r\n====重启中服务====\r\n"$docker_restarting
#发送钉钉群机器人推送消息
curl 'https://oapi.dingtalk.com/robot/send?access_token=ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"at": {"isAtAll":true},"msgtype": "text","text": {"content":"【docmonitor通知】\r\n\r\n'"${docker_abnormal}"'"}}'
else
echo 'docker容器所有服务,一切正常'
fi
通知效果如下:
钉钉群机器人的配置,我这里就不做说明了,直接按钉钉文档走就可以了,自定义机器人接入:https://open.dingtalk.com/document/robots/custom-robot-access