Docker容器自啟動
阿新 • • 發佈:2019-01-10
原文:https://docs.docker.com/engine/admin/start-containers-automatically/#use-a-process-manager
Docker的 Restart policy與dockerd命令的--live-restore啟動標誌還有區別:--live-restore標誌可以在Docker升級的時候保證容器繼續執行,但是網路以及使用者終端輸入會被中斷。
那到底什麼是restart policy呢?我們來看看實際的情況吧。
restart policy在使用docker run啟動容器時通過--restart標誌指定,這個標誌有多個value可選,不同的value有不同的行為,如下表所列:
舉個例子:下面的命令啟動一個Redis容器,當Redis容器停止後或者Docker被重啟時,Redis容器都會重啟。
(1) 容器只有在成功啟動後restart policy才能生效。這裡的"成功啟動"是指容器處於up至少10秒且已經處於docker監管。這是避免沒有成功啟動的容器陷入restart的死迴圈。
(2)如果手動(manually)的stop(與前面的explicitly stopped有何區別)一個容器,容器設定的restart policy將會被忽略,除非Docker daemon重啟或者容器手動重啟。這是避免了另外一種死迴圈。
(3)restart policies只能用於容器,對於swarm services其restart policies有不通過的配置。
參考:
flags related to service restart
這種方案中,程序監控服務執行在容器中。它可以監控一個程序是否執行,並可以在此程序沒有執行的時候去啟動該程序。而這發生的一切Docker都毫無知覺。
Docker不推薦此種方法來進行程序監控,理由很簡單,這種方法和系統平臺甚至linux發行版相關。
容器自啟動
Docker提供了restart policy機制,可以在容器退出或者Docker重啟時控制容器能夠自啟動。這種Restart policy可以保證相關容器按照正確順序啟動。雖然也可以通過程序監控的方式(如systemd)來完成這種動作,但Docker還是建議儘量避免使用程序監控的方式來 "自啟動" 容器。Docker的 Restart policy與dockerd命令的--live-restore啟動標誌還有區別:--live-restore標誌可以在Docker升級的時候保證容器繼續執行,但是網路以及使用者終端輸入會被中斷。
那到底什麼是restart policy呢?我們來看看實際的情況吧。
使用restart policy
Flag | Description |
no | 不自動重啟容器. (預設value) |
on-failure | 容器發生error而退出(容器退出狀態不為0)重啟容器 |
unless-stopped | 在容器已經stop掉或Docker stoped/restarted的時候才重啟容器 |
always | 在容器已經stop掉或Docker stoped/restarted的時候才重啟容器 |
$ docker run -dit --restart unless-stopped redis
Restart policy細節
使用restart policies時需要注意如下細節:(1) 容器只有在成功啟動後restart policy才能生效。這裡的"成功啟動"是指容器處於up至少10秒且已經處於docker監管。這是避免沒有成功啟動的容器陷入restart的死迴圈。
(2)如果手動(manually)的stop(與前面的explicitly stopped有何區別)一個容器,容器設定的restart policy將會被忽略,除非Docker daemon重啟或者容器手動重啟。這是避免了另外一種死迴圈。
(3)restart policies只能用於容器,對於swarm services其restart policies有不通過的配置。
參考:
程序監控
如果上面講的restart policies無法滿足需求,也可以採用程序監控的管理方案,如upstart,systemd或者supervisor等等。這種方案中,程序監控服務執行在容器中。它可以監控一個程序是否執行,並可以在此程序沒有執行的時候去啟動該程序。而這發生的一切Docker都毫無知覺。
Docker不推薦此種方法來進行程序監控,理由很簡單,這種方法和系統平臺甚至linux發行版相關。