本文爲大家介紹容器自啓動以及docker 守護進程掛掉或者docker升級的情況下,如何保證容器服務的正常運行。主要包含三個部分
一、守護進程開機自啓
在我們安裝docker的時候,介紹過啓動docker守護進程的命令如下,需要人工手動執行。
systemctl start docker
如果我們希望在linux服務器啓動的時候,就自動啓動Docker守護進程,無需人工干預,就使用下面的命令即可
systemctl enable docker.service;
下面的兩個命令大家根據自己的需要,在合適的場景下使用即可。
# 刪除docker守護進程開機自啓動配置
systemctl disable docker.service;
# 重新配置docker守護進程開機自啓動
systemctl reenable docker.service;
二、容器自啓動
docker守護進程自動啓動之後,假如我們希望某些容器能夠隨之也自啓動提供並服務,在容器創建時使用如下命令即可:
# 注意`--restart unless-stopped`是能夠實現自啓動的關鍵參數
docker run -d --restart unless-stopped nginx
如果我們已經存在一個運行時容器,想讓它增加容器自啓動的能力,使用如下命令即可
docker update --restart unless-stopped nginx
重啓策略說明
unless-stopped是筆者比較常用的重啓策略,除此之外docker還提供了其他的重啓策略,--restart
的值可以是以下任何一種:
重啓策略標誌 | 描述 |
---|---|
no |
不要自動重啓容器。(默認) |
on-failure[:max-retries] |
如果容器因程序運行錯誤退出(非正常退出),則重新啓動容器。可選項配置:max-retries 表示嘗試重新啓動容器的最大次數,超過這個次數還啓動失敗就不重啓了。 |
always |
如果容器處於停止狀態,則始終重新啓動容器。例外情況:如果該容器是運維人員手動停止的,只有在Docker守護進程發生重啓或者容器本身手動重啓之後,纔會繼續always重啓策略。 |
unless-stopped |
在停止Docker守護程序之前已經處於停止狀態的容器,不會執行重啓。其他的和always一樣。 |
爲什麼我常常使用unless-stopped重啓策略?
- 一個服務器上有很多容器,其中一些是我手動停止的(主動行爲)。這些容器即使重啓服務器或重啓docker守護進程之後,我也不希望它們自動運行。所以我不用always。
- 在重啓服務器或重啓docker守護進程之前,處於良好運行狀態的容器,在重啓服務器或重啓docker守護進程之後,通常也不會出現因程序運行錯誤導致的無法重啓的問題,所以我不用on-failure。
三、守護進程停止期間保證容器服務正常
本文以上討論的都是服務器重啓、docker守護進程重啓之後如何保證容器的運行狀態,並且儘量不需要人工參與。本小節主要說明的內容是:假如我們要升級docker的版本,我們要停止docker的守護進程,但是我們不想影響容器向用戶提供服務。即:docker守護進程停了,想要保證docker容器進程仍然運行,這該怎麼做?
默認情況下,當 Docker 守護進程終止時,它會關閉基於它運行的所有容器。但是可以通過配置方式,在守護程序進程不可用時保持容器運行。此功能稱爲live-restore。live-restore有助於減少由於守護進程崩潰、計劃中斷或升級導致的容器停止服務的時間。
{
"live-restore": true
}
配置方式就是在/etc/docker/daemon.json
配置文件中加入上面的一行,這樣守護進程停止之後,容器不會停止服務。
字母哥博客:zimug.com