DOCKER特性 - LIVE RESTORE

我們都知道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無法重新連接到運行中容器的問題,這時候需要手動停止運行的容器。

  1. Daemon選項變更

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

  1. 影響容器的日誌輸出

如果Daemon長時間停止,會影響運行容器的日誌輸出。因爲默認情況下,日誌管道的緩衝區大小爲64k,當緩衝寫滿之後,必須啓動Daemon來刷新緩衝區。

  1. 不支持Docker Swarm

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

總結

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

以上內容大部分來自Docker的官方文檔,更詳細的信息請參考 https://docs.docker.com/config/containers/live-restore/

該文章同步發佈在Mengz's Blog

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