如何升級 Docker 容器並保留之前的網路和卷?
介紹
本文重點介紹容器映象的升級機制。有多種方法可以將容器升級到最新的映象。這裡我們使用了一些簡單易用的方法。首先,我們討論了用於快速測試的手動方法。然後我們嘗試了一些自動方法。這些方法將監控映象,如果存在任何新更新,它們將使用更新的映象建立一個新容器。
方法
手動方式,使用 CLI
自動方式,使用 CLI
自動方式,使用 Docker Compose
手動方式,使用 CLI
我們將按照以下步驟來實現映象升級的目標。
使用舊映象建立一個容器
下載本地系統上的更新後的映象
使用更新後的映象建立一個新容器,但使用舊的卷和網路
刪除舊容器
步驟 1:建立舊映象的 Docker 容器
使用以下命令建立 busybox 容器。
示例
$ docker run -itd --name old_cont --volume myvolume:/volumes --network mynetwork busybox:unstable
輸出
eb08fe5971190abc85aa7ca8ed44d1d85e6ea0fafeda26bb59785897bbd056ae
進入此映象並在卷目錄內建立一個檔案。
$ docker exec -it old_cont sh / # cd volumes/ /volumes # touch myfile.txt /volumes # ls myfile.txt /volumes # exit
步驟 2:使用新映象建立容器
此容器具有 busybox 的最新映象。
示例
$ docker run -itd --name new_cont --volume myvolume:/volumes --network mynetwork busybox:latest
輸出
ab15dea992f46c27dfdb4a290e2dec3fbb10b3821694dbc12f18935d9e651c20
進入新容器並檢查資料是否存在。
$ docker exec -it new_cont sh / # cd volumes/ /volumes # ls myfile.txt /volumes # exit
因此,卷和網路保持不變。只有容器的映象更改為最新版本。
步驟 3:刪除舊容器
示例
$ docker rm -f old_cont
輸出
old_cont
在下一種方法中,我們將藉助“watchtower”映象來自動化上述過程。
自動方式,使用 CLI
這裡我們將藉助一個名為“watchtower”的額外映象。“watchtower”將檢查儲存庫中是否有任何更新的映象。只要任何更新被推送到儲存庫,watchtower 就會自動下載更新後的映象,並建立一個新的更新容器,其中包含連結到舊容器的所有舊資料。
步驟 1:建立容器
首先,我們需要使用舊映象建立一個容器。
docker run -itd --name old_cont busybox:unstable unstable: Pulling from library/busybox 2461e8255644: Pull complete Digest: sha256:f4ed5f2163110c26d42741fdc92bd1710e118aed4edb19212548e8ca4e5fca22 Status: Downloaded newer image for busybox:unstable 81470b0f373557b3cb057e86113f6e11ce0baec23844e1370f519e043ff3db53
容器已建立並正在執行。
步驟 2:現在建立 watchtower 容器
在這裡建立“watchtower”容器,並新增上述要升級的容器的名稱。
示例
$ docker run -itd --name watch_container -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower old_cont
輸出
Unable to find image 'containrrr/watchtower:latest' locally latest: Pulling from containrrr/watchtower 560f024ada32: Pull complete 03aa1c411c91: Pull complete 4e2295fcaa5d: Pull complete Digest: sha256:897304ffb41533954deda3ca9dd140fa1ca41e5d7e0bc6d6352606931145779c Status: Downloaded newer image for containrrr/watchtower:latest db82aafdb60ed17b3faf8d6df138aead91f9483257febc02af96ba4ed53d225d
現在,這將處理所有事情,每當 busybox:unstable 在 docker hub 上更新時,watchtower 將自動將此容器升級到更新後的映象。
自動方式,使用 Docker Compose
我們將建立一個 Docker Compose 檔案。此 compose 檔案將包含需要監控的多個容器。“watchtower”的一個容器將監控所有這些容器。每當任何容器的映象更新時,它都會為該映象建立一個新容器。
步驟 1:建立 Docker Compose 檔案
Docker compose 包含總共三個服務或容器。兩個容器“old_cont”和“test_cont”由第三個容器“watch_cont”監控。
version: "3" services: old_cont: image: busybox:latest container_name: busybox_container command: sleep infinity test_cont: image: busybox:unstable container_name: testing_container command: sleep infinity watch_cont: image: containrrr/watchtower container_name: watchtower_container volumes: - /var/run/docker.sock:/var/run/docker.sock command: --interval 60 busybox_container testing_container
watchtower 將等待 60 秒,檢查 docker hub 儲存庫中是否存在任何更新的映象。如果我們不提供 --interval 選項,它將等待 24 小時。
步驟 2:啟動容器
要啟動所有這些容器,請使用以下命令。
$docker compose up -d
這將在分離模式下建立並執行所有這些容器。
結論
我們成功地為容器建立了一個升級週期。儘管這些方法未在生產環境中使用,因為我們為此任務有專用的軟體。一些高階工具用於更新和升級任務。