本文目是體驗docker容器的健康檢查功能,以體驗爲主不涉及開發,與開發相關的內容會在後面的文章細說。java
考慮這樣的狀況:docker環境中,springboot應用的容器還在,但已沒法提供服務(例如數據或文件被破壞,線程池等資源被耗盡等各類異常),此時須要一種方式快速得知這種狀態。此時容器健康檢查(即HEALTHCHECK)就派上用場了,只要容器按照Docker的規則提供自身狀態信息,就能夠將容器健康信息以多種方式告知外界;程序員
docker官方文檔說明,HEALTHCHECK功能從1.12版本開始提供,這裏對docker社區版的版本號作個簡介:web
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秒 |
(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複製代碼
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秒就會調用一次;spring
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複製代碼
(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複製代碼
(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容器健康體驗完畢,咱們已經對此功能有了基本認識,接下來實戰中,咱們會嘗試讓本身的應用容器支持健康檢查功能;docker