【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
字母哥博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章