極速體驗docker容器健康
本文目是體驗docker容器的健康檢查功能,以體驗為主不涉及開發,與開發相關的內容會在後面的文章細說。
關於容器健康檢查
考慮這樣的情況:docker環境中,springboot應用的容器還在,但已無法提供服務(例如資料或檔案被破壞,執行緒池等資源被耗盡等各種異常),此時需要一種方式快速得知這種狀態。
此時容器健康檢查(即HEALTHCHECK)就派上用場了,只要容器按照Docker的規則提供自身狀態資訊,就可以將容器健康資訊以多種方式告知外界;
版本要求
docker官方文件說明,HEALTHCHECK功能從1.12版本開始提供,這裡對docker社群版的版本號做個簡介:
- 1.12版本是2016年07月28日釋出的;
- 1.13.1 版本2017年02月08日釋出的,此版本之後,docker的版本命名規則有了變化,改為"YY.MM"格式;
- 17.03.0-ce版本是2017年03月01日釋出的,從此開始了"YY.MM"格式的版本命名;
- 今天實戰的docker環境是19.03.2版本;
實戰環境資訊
- 作業系統:macOS Catalina 10.15
- Docker:19.03.2
開始體驗
- 在控制檯輸入以下命令,即可建立一個帶有健康檢查資訊的容器:
docker run --rm
--name=healthcheck
-p 8080:8080
--health-cmd="curl --silent --fail localhost:8080/getstate || exit 1"
--health-interval=15s
--health-retries=10
--health-timeout=5s
bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT
- 上述命令中帶有四個和健康檢查相關的引數,這裡解釋一下:
引數名 | 作用 |
---|---|
health-cmd | 指定命令在容器內執行,用於檢查容器健康狀態 |
health-interval | 每次健康檢查的間隔時間,預設30秒 |
health-retries | 假設該值為3,表示若連續三次檢測的返回結果都是不健康,就判定該容器不健康,預設值為3 |
health-timeout | 超時時間,預設30秒 |
- 關於health-cmd引數,最常用的是shell命令,例如本例中就是curl --silent --fail localhost:8080/getstate || exit 1,意思是向容器的8080埠發起http請求,如果http響應的code為200,整個shell的返回值就是0,此時被docker判定為容器健康,如果http響應code不是200,shell的返回值就是1,此時被docker判定為容器不健康;
- 再開啟一個控制檯視窗,執行docker ps檢視容器狀態,注意STATUS欄位,可見剛建立容器的時候是health: starting狀態,稍後會變為healthy狀態:
(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d86c11321cef bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT "java -Xms1g -Xmx1g …" 13 seconds ago Up 12 seconds (health: starting) 8080/tcp healthcheck
(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d86c11321cef bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT "java -Xms1g -Xmx1g …" 17 seconds ago Up 16 seconds (healthy) 8080/tcp healthcheck
- 本次實戰的映象提供了http介面localhost:8080/getstate,用於返回容器狀態,每次被呼叫都會在控制檯列印一行資訊,容器日誌如下:
2019-10-20 03:05:02.350 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-10-20 03:05:02.364 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 14 ms
2019-10-20 03:05:02.384 INFO 1 --- [nio-8080-exec-1] c.b.d.DockerhealthcheckApplication : step probe return success
2019-10-20 03:05:17.584 INFO 1 --- [nio-8080-exec-2] c.b.d.DockerhealthcheckApplication : step probe return success
2019-10-20 03:05:32.748 INFO 1 --- [nio-8080-exec-3] c.b.d.DockerhealthcheckApplication : step probe return success
可見容器自啟動後,該介面每隔15秒就會呼叫一次;
模擬不健康狀態
- 在前面的操作中我們知道,只要容器的http介面localhost:8080/getstate的返回碼是200,容器就被判定為健康;
- 想看看不健康狀態的樣子,只要http介面localhost:8080/getstate的返回碼不是200就行了;
- 此映象提供了另一個介面來方便觀察不健康狀態,假設宿主機的IP地址是102.168.0.3,在瀏覽器輸入192.168.0.3:8080/setstate?state=false,該介面呼叫完畢後,localhost:8080/getstate的返回碼就從200變成了403;
- 再去看容器的控制檯資訊,這次內容有變化了,從step probe return success變成了step probe return fail,此時getstate介面的返回碼是403:
2019-10-20 03:38:51.428 INFO 1 --- [nio-8080-exec-3] c.b.d.DockerhealthcheckApplication : step probe return success
2019-10-20 03:39:06.592 INFO 1 --- [nio-8080-exec-9] c.b.d.DockerhealthcheckApplication : step probe return fail
2019-10-20 03:39:21.757 INFO 1 --- [io-8080-exec-10] c.b.d.DockerhealthcheckApplication : step probe return fail
2019-10-20 03:39:36.912 INFO 1 --- [nio-8080-exec-3] c.b.d.DockerhealthcheckApplication : step probe return fail
- 前面在建立容器時的health-retries引數的值是10,意味著localhost:8080/getstate連續10次返回碼非200才會被判定為不健康,因此,在控制檯連續十次輸出step probe return fail之前,執行docker ps命令觀察容器狀態,應該還是healthy,超過十次step probe return fail輸出之後,再去看容器狀態,就變成了healthy:
(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
070e56cc99f2 bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT "java -Xms1g -Xmx1g …" 18 minutes ago Up 18 minutes (unhealthy) 0.0.0.0:8080->8080/tcp healthcheck
- 恢復健康狀態:在瀏覽器輸入192.168.0.3:8080/setstate?state=true,這樣localhost:8080/getstate介面的返回碼又變成了200,觀察控制檯,只要"step probe return success"輸出一次,容器健康狀態就恢復為healthy了;
觀察容器事件
- 在控制檯輸入docker events --filter event=health_status,即可觀察宿主機上所有的容器健康狀態事件;
- 按照上面的操作,在瀏覽器輸入192.168.0.3:8080/setstate?state=true或者192.168.0.3:8080/setstate?state=false,將容器的健康狀態轉變幾次,可以觀察到容器事件變化:
(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker events --filter event=health_status
2019-10-20T12:19:18.349588676+08:00 container health_status: unhealthy 2d538f8752ae1e94ce23f34b7fb71c8f2ea3a075df82943ffdbe62c49ad4d6c8 (image=bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT, name=healthcheck)
2019-10-20T12:20:19.030857534+08:00 container health_status: healthy 2d538f8752ae1e94ce23f34b7fb71c8f2ea3a075df82943ffdbe62c49ad4d6c8 (image=bolingcavalry/dockerhealthcheck:0.0.1-SNAPSHOT, name=healthcheck)
至此,docker容器健康體驗完畢,我們已經對此功能有了基本認識,接下來實戰中,我們會嘗試讓自己的應用容器支援健康檢查功能;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/75/viewspace-2826999/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Docker下,兩分鐘極速體驗NacosDocker
- Docker下,兩分鐘極速體驗Nacos配置中心Docker
- 極速體驗SpringCloud GatewaySpringGCCloudGateway
- Docker下,五分鐘極速體驗機器學習Docker機器學習
- Docker下的OpenResty三部曲之一:極速體驗DockerREST
- Knative 初體驗:CICD 極速入門
- Docker容器化技術初體驗Docker
- Docker下RabbitMQ延時佇列實戰兩部曲之一:極速體驗DockerMQ佇列
- 悅動圈極速版 APP體驗報告APP
- Serverless 極速搭建 Hexo 部落格(體驗有禮)ServerHexo
- Docker下RabbitMQ四部曲之一:極速體驗(單機和叢集)DockerMQ
- Docker 容器的健康狀態檢查Docker
- 極速程式設計體驗:VsCode和webstorm插上ChatGPT程式設計VSCodeWebORMChatGPT
- 極速安裝和體驗k8s(Minikube)K8S
- 極速體驗|使用 Erda 微服務觀測接入 Jaeger Trace微服務
- Windows Server 2016系統的Docker容器初體驗WindowsServerDocker
- 實驗三:JFinal極速開發框架實驗框架
- 開箱即用,Knative 給您極致的容器 Serverless 體驗Server
- Docker(1):初體驗之應用掛載到容器Docker
- Java應用在docker環境配置容器健康檢查JavaDocker
- 分散式呼叫鏈跟蹤工具Jaeger?兩分鐘極速體驗分散式
- 利用Docker極速下載OpenJDK11原始碼DockerJDK原始碼
- 如何配置極狐GitLab Docker 容器映象倉庫GitlabDocker
- 1分鐘 Serverless 極速搭建真網站 領貓超卡之《極速搭建 Zblog 部落格系統》場景體驗Server網站
- TiDB + 京東雲資料庫打造大促極速秒殺體驗TiDB資料庫
- 鐵威馬NAS上架迅雷應用,極速下載體驗get!
- docker下,極速搭建spark叢集(含hdfs叢集)DockerSpark
- 三分鐘:極速體驗JAVA版目標檢測(YOLO4)JavaYOLO
- kubernetes下的Nginx加Tomcat三部曲之一:極速體驗NginxTomcat
- 1分鐘 Serverless 極速搭建真網站 領貓超卡之《極速搭建釘釘群定時天氣播報》場景體驗Server網站
- QEMU在Docker容器中的革命:輕量級虛擬化新體驗Docker
- SOFAServerless 體系助力業務極速研發Server
- Docker筆記之Docker初體驗Docker筆記
- 《極限競速 地平線5》PC版體驗:情熱墨西哥,輕鬆嘉年華
- Docker容器Docker
- SOFA Serverless 體系助力業務極速研發Server
- 南大通用極速記憶體資料庫記憶體資料庫
- Asp.net怎麼極速開發軟體ASP.NET