經過昨天的一番努力,我們已經可以在服務無法存取的時候收到通知,那麼今天就來看看另一個議題:服務的重啟。畢竟,收到通知之後還是得人工解決問題,但若是解決方法只是單純的重新啟動的話,何不讓服務自己來呢?
因為 NOJ 是使用 docker compose 部署的,所以今天要研究的主題,就訂為 docker 的 restart policy 吧。要學習任何的事物,我認為最簡單的起頭方式,就是去看官方文件(若是有些文件真的寫太爛的,翻翻 source code 也是不錯的選擇)。
目前,docker 總共有四種 restart policy,以下取自官方文件:
no
: Do not automatically restart the container. (the default)on-failure
: Restart the container if it exits due to an error, which manifests as a non-zero exit code.always
: Always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in restart policy details)unless-stopped
: Similar to always
, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts.可以看到,除了 no
以外都是會在滿足條件的時候重開我們的 container,所以接下來要選擇的就是,哪一個條件比較符合我的需求。在那之前需要先注意一點,這邊討論的 container 重啟的行為,皆只有在 docker daemon 重開的時候才會觸發,並不是隨時都會檢查的。
基本上 always
一定可以處理這些問題,可是它有個問題不管如何都一定會重開,個人認為這在我們需要服務停下的時候會造成額外的麻煩,所以我會比較偏好 unless-stopped
,它跟 always
的差別是,當我們使用 docker compose stop
或是 docker stop
把 container 關掉之後,下次 daemon 重開,那些 container 還是會保持關閉的狀態。
今天在查相關資料的時候發現 docker compose 的 restart
這個選項,on-failure
後面可以多接上一個數字,變成像是 on-failure:5
這樣的字串,那個數字代表說 docker 會最大的嘗試次數,但嘗試超過這個次數還開不起來之後,便不會再試了。
有趣的是這個設定在 docker compose 的文件裡面是找不到的,要到 docker run
的文件,說明 --restart
參數的部分,才可以看到說明,真的是藏的非常的深呀。
(source: docker doc)
今天稍微了解了 docker 的 restart policy,正確的設定可以讓我們的服務更快的恢復運作,不過通常在本機上開發的時候,我們是不會有需要設定服務自動重啟的需求,若是要避免在不同的環境還要手動修改 docker compose 的設定檔,建議可以把這些 production only 的設定寫在另外一個檔案,然後透過 docker-compose -f
去指定需要使用的檔案,詳細的說明可以參考官方文件。