需求
最近遇到的問題:線上跑的一個 Node
鏡像是在運行的,狀態為 up
,但是訪問報 502
,重啟鏡像無效,重新拉了個鏡像運行才恢復正常。於是想研究下如何從應用層面去檢查容器的狀態
為什么
docker ps
STATUS
列顯示容器的狀態
[root@ansible ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cfb357dd83f 9962e62376bc "/bin/sh -c 'apk upg…" 3 months ago Exited (0) 3 months ago goofy_engelbart
91697fe789ee 3b6417bca798 "/bin/sh -c 'apk upg…" 3 months ago Exited (99) 3 months ago lucid_swirles
2004c9aa5efc 172.18.11.161/lzwd/jdk1.8:v1 "tini -- /bin/sh" 3 months ago Up 3 months elastic_proskuriakova
命令顯示:
- 在運行的,狀態為
up
- 正常停止的,狀態為
Exited (0)
- 因發生故障停止了,退出代碼為非0,例如
Exited (99)
Exited (1)
即使是狀態為 up
的狀態,也不代表業務就是正常的。如我們遇到的就是,狀態為 up
,訪問卻提示 502
。所以如何從應用層面去檢查容器的狀態呢?引出healcheck
怎么做
對於 HTTP 服務接口的容器,使用 curl
檢查 HTTP 狀態碼
例如每10分鍾檢測一次,超時5秒就報超時:
HEALTHCHECK --interval=10m --timeout=5s \
CMD curl --fail http://localhost:8080/ || exit 1
當指定了 healthcheck
指令啟動容器后,初始狀態會為 starting
,在 healtheck
指令檢查成功后,狀態會變為 healthy
,檢查成功,狀態會變成 unhealthy