容器狀态是 UP 的,應用就是健康的嗎?
還真不一定!
Docker 隻能從容器啟動程序的傳回代碼判斷其狀态,而對于容器内部應用的運作情況基本沒有了解。
執行 <code>docker run</code> 指令時,通常會根據 Dockerfile 中的 CMD 或 ENTRYPOINT 啟動一個程序,這個程序的狀态就是 <code>docker ps</code> <code>STATUS</code> 列顯示容器的狀态。
指令顯示:
有的容器正在運作,狀态為 <code>UP</code>。
有的容器已經正常停止了,狀态是 <code>Exited (0)</code>。
有的則因發生故障停止了,退出代碼為非 0,例如 <code>Exited (137)</code>、<code>Exited (1)</code> 等。
即使容器狀态是 <code>UP</code>,也不能保證應用沒有問題。web server 雖然沒有崩潰,但如果總是傳回 <code>HTTP 500 - Internal Server Error</code> ,對應用來說這就是很嚴重的故障。
如何從應用的業務層面檢查容器的狀态呢? 答案是:Health Check。
Docker 支援的 Health Check 可以是任何一個單獨的指令,Docker 會在容器中執行該指令,如果傳回 0,容器被認為是 <code>healthy</code>,如果傳回 1,則為 <code>unhealthy</code>。
對于提供 HTTP 服務接口的應用,常用的 Health Check 是通過 <code>curl</code> 檢查 HTTP 狀态碼,比如:
如果 <code>curl</code> 指令檢測到任何一個錯誤的 HTTP 狀态碼,則傳回 1,Health Check 失敗。
下面我們通過例子來示範 Health Check 在 swarm 中的應用。
<code>--health-cmd</code> Health Check 的指令,還有幾個相關的參數:
<code>--timeout</code> 指令逾時的時間,預設 30s。
<code>--interval</code> 指令執行的間隔時間,預設 30s。
<code>--retries</code> 指令失敗重試的次數,預設為 3,如果 3 次都失敗了則會将容器标記為 <code>unhealthy</code>。swarm 會銷毀并重建 <code>unhealthy</code> 的副本。
通過 <code>docker ps</code> 可以檢視到容器的狀态為 <code>healthy</code>:
下面模拟一個 <code>unhealthy</code> 的場景,<code>curl</code> 指向一個不存在的 url。
副本被 shutdown 了,可以到 <code>swarm-worker1</code> 用 <code>docker inspect</code> 檢視具體原因。
容器被标記為 <code>unhealthy</code>,其原因是 curl 連續三次傳回 404 錯誤。
Docker 預設隻能通過容器程序的傳回碼判斷容器的狀态,Health Check 則能夠從業務角度判斷應用是否發生故障,是否需要重新開機。
Health Check 就讨論到這裡,下一節我們學習如何在容器中使用密碼,私鑰這類敏感資料。
書籍:
1.《每天5分鐘玩轉Docker容器技術》
<a href="https://item.jd.com/16936307278.html" target="_blank">https://item.jd.com/16936307278.html</a>
2.《每天5分鐘玩轉OpenStack》
<a href="https://item.jd.com/12086376.html" target="_blank">https://item.jd.com/12086376.html</a>