DOCKER特性 - LIVE RESTORE

夢哲發表於2021-12-19

我們都知道Docker是C/S模式架構,通過客戶端(CLI)訪問Docker Daemon來建立和管理容器的。在預設情況下,當daemon終止的時候,會停止所有執行的容器。
因此我們需要對Docker Daemon進行升級或者某些需要重啟的維護操作時,都需要導致執行著的容器跟著重新啟動。

Live Restore

其實,Docker提供了一個特性,可以使得在Daemon不可用的時候,保持容器繼續執行,這樣就減少了在Daemon進行升級或者出現問題的時候容器的停機時間。那這個特性就叫做Live Restore 。

通過為Docker Daemon增加以下配置來開啟Live Restore特性。在Linux上,預設的配置檔案 /etc/docker/daemon.json 裡新增

{
  "live-restore": true
}

然後重啟docker服務。如果使用systemd管理服務,可以通過reload來避免重啟docker服務

sudo systemctl reload docker.service

其他情況下,可以傳送 SIGHUP 訊號給dockerd程式。

對於Windows和MacOS上的Docker Desktop,可以通過Desktop節目的Daemon高階配置來開啟Live Restore。

配置完成後,可以嘗試重啟Docker Daemon來檢視容器是否會保持繼續執行。重啟之前檢視容器的啟動時間

 WSL -   mengz  docker container inspect portainer_edge_agent -f '{{ .State.StartedAt }}'
2021-12-18T09:50:59.761725785Z

然後執行 sudo systemctl restart docker.service,在查詢一次容器的啟動時間,將發現啟動時間未發生變化,這說明了容器並沒有重啟。

Live Restore的限制

當前的Live Restore特性可以在進行Daemon維護,或者在Daemon發生問題導致不可用的情況,減少容器的停機時間,不過其也有一定的限制。

  1. Docker版本升級限制

    Live Restore僅支援Docker補丁版本升級時可用,也就是 YY.MM.x 最後一位發生變化的升級,而不支援大版本的升級。在進行大版本升級後,可能會導致Daemon無法重新連線到執行中容器的問題,這時候需要手動停止執行的容器。

  2. Daemon選項變更

    也就是說Live Restore僅僅在某些Daemon級別的配置選項不發生改變的情況工作,例如Bridge的IP地址,儲存驅動型別等。如果在重啟Daemon時候,這些選項發生了改變,則可能會到Daemon無法重新連線執行中的容器,這時也需要手動停止這些容器。

  3. 影響容器的日誌輸出

    如果Daemon長時間停止,會影響執行容器的日誌輸出。因為預設情況下,日誌管道的緩衝區大小為64k,當緩衝寫滿之後,必須啟動Daemon來重新整理緩衝區。

  4. 不支援Docker Swarm

    Live Restore只是獨立Docker引擎的特性,而Swarm的服務是由Swarm管理器管理的。當Swarm管理器不可用時,Swarm服務是可以在工作節點上繼續執行的,只是不同通過Swarm管理器進行管理,直到Swarm管理恢復工作。

總結

通過Docker Daemon的 live-restore 特性,我們可以執行無守護程式(daemonless)的容器,這可以減小容器應用在對Docker Daemon進行維護時候的停機時間,不過在使用時也有一定的限制,例如對於升級引擎版本的限制。如果關注無守護程式的容器,可以進一步瞭解 Podman

以上內容大部分來自Docker的官方文件,更詳細的資訊請參考 https://docs.docker.com/confi...

該文章同步釋出在Mengz's Blog

相關文章