如何啟用 Podman 容器的自動更新
Podman 是一個符合 OCI 的容器化平台,通常用於代替 Docker。它的無守護程序模型和廣泛的功能集使其成為開發和生產中使用的良好候選者。
在本文中,我們將向您展示如何使用Podman 的自動更新系統在新鏡像發佈時重新啟動您的容器。Podman 可以配置為定期檢查更新、拉取最新映像並使用當前設置重新生成受影響的容器。
為什麼要自動更新容器?
容器通常壽命很短,但仍需要定期維護。映像中的嚴重漏洞可能使攻擊者能夠訪問您的應用程序,該漏洞將在被發現後的數小時內被利用。
大多數流行的容器技術都要求您手動更新容器。這使運營團隊有責任註冊發佈公告並構建實施新更改的工具。
Podman 的內置容器更新系統解決了這個問題,並使工作負載保持最新。在新的鏡像版本被推送後,容器可以快速更新,確保您的部署是最新的,包含最新的補丁和錯誤修復。
啟用自動更新
io.containers.autoupdate
通過在創建容器時設置標籤來為容器啟用自動更新。
$ podman run -d -p 8080:80 \
–name nginx 容器\
–label io.containers.autoupdate=註冊表\
docker.io/library/nginx:latest
標籤可以有兩個可能的值:
registry
– 在檢查更新時,Podman 將檢查鏡像註冊表以查看您的容器使用的標籤的新版本是否可用。在這種情況下,圖像將被提取並且您的容器將重新啟動。僅當您使用註冊表的完整路徑時,註冊表更新才有效 –docker.io/library/nginx:latest
上面顯示的鏈接是故意的,因為nginx:latest
它太模糊了。local
– 此更新方法可防止 Podman 查看已存在於主機文件系統上的容器鏡像。如果鏡像標籤的本地版本與容器運行的版本不同,容器將被重啟。這在開發過程中重建圖像時很有用。
標籤的存在使這個示例 NGINX 容器符合自動更新的條件。但是,在實際應用更新之前還需要做更多的工作。
創建系統服務
Podman 的更新機制要求您的容器在systemd 服務中運行。因為 Podman 是無守護進程的,所以它缺少可以啟動和停止容器的中央控制器。將它們包裝在 systemd 服務中提供了生命週期管理功能以及響應某些事件而重新啟動的能力。
Podman CLI 包含一個從容器創建 systemd 模塊定義的命令:
$ podman generate systemd --name nginx-container > /etc/systemd/system/nginx-container.service
上面的命令在正確的位置創建了一個帶有 systemd 服務的新 NGINX 容器。
然後重新加載systemd註冊服務定義,然後啟用並啟動服務:
$ systemctl daemon-reload
$ systemctl 啟用 nginx-container.service
$ systemctl start nginx-container.service
你的 NGINX 容器現在是一個 systemd 服務,它會在你的主機啟動時自動啟動。您可以使用systemctl
命令來啟動和停止容器,而不是使用 Podman CLI:
$ systemctl start nginx-container.service
$ systemctl stop nginx-container.service
以後要移除容器,您必須停止、禁用和刪除服務模塊文件。之後,重新啟動 systemd 以完全應用更改。
$ systemctl stop nginx-container.service
$ systemctl 禁用 nginx-container.service
$ rm /etc/systemd/system/nginx-container.service
$ systemctl daemon-reload
執行更新
現在一切都已設置好,可以成功自動更新 NGINX 容器。您可以使用 Podman 命令運行按需更新檢查auto-update
:
$ podman auto-update
試圖拉 docker.io/library/nginx:latest…
獲取圖像源簽名
…
單元容器圖像政策已更新
nginx-container.service 2de4ba96b09 docker.io/library/nginx:latest registry true
這會更新 systemd 服務中的容器,這些容器可供運行該命令的用戶使用。你可能需要sudo
按照上面的例子使用;如果是這樣,auto-update
也以 root 身份運行命令:
$ sudo podman auto-update
在registry
此示例中,使用了更新策略,因此 Podman 連接到鏡像註冊表,檢查更改,然後拉取新鏡像(如果適用)。命令輸出顯示每個服務容器是否已升級。
因為容器是由 systemd 管理的,所以 Podman 可以判斷一個新的容器是否已經成功啟動。如果檢測到升級失敗,Podman 會自動回滾到之前版本的鏡像。為了使其可靠地工作,容器內的應用程序必須通知 systemd它已成功啟動。這可以通過運行來完成systemd-notify --ready
。
查詢更新
有時您可能想檢查您的集裝箱船隊是否有可用的更新,而不是立即應用它們。使用flag 命令獲取發布更新映像的服務列表auto-update
:--dry-run
$ podman auto-update --dry-run
…
單元容器圖像政策已更新
nginx-container.service 2de4ba96b09 docker.io/library/nginx:latest registry pending
顯示的服務pending
有可用的更新。
按計劃應用更新
我們現在已經成功配置了按需容器更新。您無需手動拉取新圖像或重新啟動容器。最後一步是設置一個時間表,以便 Podman 定期應用更新而無需運行auto-update
命令。
大多數 Podman 發行版都包含一個用於此目的的系統計時器。您可以使用以下方法激活計時器systemctl
:
$ systemctl enable podman-auto-update.timer
計時器設置為每天檢查更新。systemctl edit
您可以通過使用並更改OnCalendar
字段值打開計時器文件來自定義時間表:
$ systemctl edit podman-auto-update.timer
[定時器]
OnCalendar=Fri *-*-* 18:00
上面顯示的時間表達式將在每週五 18:00 運行更新檢查。systemd 手冊中描述了語法。
現在計時器已啟用,您可以開始部署帶io.containers.autoupdate
標籤的容器。它們將定期更新和重新啟動,使維護程序自動化。
您不需要使用 Podman 的系統計時器來安排更新。您可以podman auto-update
在現有工具包或其他任務調度程序(例如cron
.
概括
自動 Podman 更新允許您將容器移動到新的映像版本,而無需手動重新啟動它們或使用外部工具。這可以幫助您在映像發布錯誤修復和安全修復時維護您的容器隊列。
雖然自動更新是一種有用的工具,但不應在沒有適當注意的情況下使用它們。如果意外釋放損壞的映像,允許自動更新可能會導致其自身的問題。自行重啟的容器也可能導致停機或中斷相關服務。
因此,您應該在實施此解決方案之前評估您自己的應用程序的適用性。一種中間方法是auto-update --dry-run
定期運行並將結果發送到監視服務。這會通知您可用的更新,而不會使它們面臨未經批准而被應用的風險。
發佈留言