我們都知道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發生問題導致不可用的情況,減少容器的停機時間,不過其也有一定的限制。
- Docker版本升級限制
Live Restore僅支持Docker補丁版本升級時可用,也就是 YY.MM.x 最後一位發生變化的升級,而不支持大版本的升級。在進行大版本升級後,可能會導致Daemon無法重新連接到運行中容器的問題,這時候需要手動停止運行的容器。
- Daemon選項變更
也就是說Live Restore僅僅在某些Daemon級別的配置選項不發生改變的情況工作,例如Bridge的IP地址,存儲驅動類型等。如果在重啓Daemon時候,這些選項發生了改變,則可能會到Daemon無法重新連接運行中的容器,這時也需要手動停止這些容器。
- 影響容器的日誌輸出
如果Daemon長時間停止,會影響運行容器的日誌輸出。因爲默認情況下,日誌管道的緩衝區大小爲64k,當緩衝寫滿之後,必須啓動Daemon來刷新緩衝區。
- 不支持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