如何升級 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

這將在分離模式下建立並執行所有這些容器。

結論

我們成功地為容器建立了一個升級週期。儘管這些方法未在生產環境中使用,因為我們為此任務有專用的軟體。一些高階工具用於更新和升級任務。

更新於:2023年1月5日

374 次瀏覽

啟動您的 職業生涯

完成課程後獲得認證

開始
廣告