【docker專欄7】容器自啟動與守護進程停止後容器保活

本文為大家介紹容器自啟動以及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
字母哥博客

Tags: