背景:在linux環境下,很多服務我們都使用docker來跑,很是方便,容器服務獨立,配置獨立,數據獨立等等,但是有個問題,就是如果某個服務異常了,暫停了,停止了,一直重啟中,我們要怎麼及時的知道是哪個服務,併進行處理,保證業務正常運行。 本文主要介紹使用docker服務自帶的一些命令來實現一個基本 ...
背景:在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 掛載到這個容器的數據捲名稱
看,只顯示了名稱了是不是,這裡說一下哈,欄位名的大小寫問題
結論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服務運行監控,我貼出我的思路,歡迎指正哈!
#!/bin/bash
#名稱:docker容器服務運行的進程監控
#原理:如果所有容器服務數量 > 正在運行中的服務數量,則表示有服務異常,可能是暫停了,停止了,退出了,重啟中,發消息到釘釘群
#運行:使用crond任務自定義時間自動運行
#日期:2023-08-15
#所有容器服務數量 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
#!/bin/bash #名稱:docker容器服務運行的進程監控 #原理:如果檢測到有自動重覆重啟中的服務,則表示有服務異常,發消息到釘釘群 #運行:使用crond任務自定義時間自動運行 #日期:2023-08-15 #檢測重啟中的服務 docker_restarting=$(docker ps -f status=restarting --format {{.Names}}) #檢測到有重啟中的服務 if [ ! -z "$docker_restarting" ]; then #通知時間 notice_time=`date +"%Y-%m-%d %H:%M:%S"` #把時間和異常的服務合併起來 docker_abnormal=$notice_time"\r\n====重啟中服務====\r\n"$docker_restarting #echo $docker_abnormal #發送推送消息 token="xxx" curl 'https://oapi.dingtalk.com/robot/send?access_token='"${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