在容器化時代,有效管理容器映像是確保應用程式穩定佈署和高效執行的關鍵。Podman 作為新一代容器引擎,提供了強大的命令列工具,簡化了與容器映像儲存函式庫的互動。理解如何利用 Podman 的 CLI 操作儲存函式庫,對於任何一位容器技術使用者都至關重要。透過 podman search 命令,我們可以根據關鍵字搜尋儲存函式庫中的映像,並利用過濾器精確定位所需版本。--filter is-official 選項能快速篩選出官方映像,而 --format 選項則允許我們自定義輸出格式,例如只顯示映像名稱和儲存函式庫索引,方便後續指令碼處理。此外,--list-tags 選項可以列出特定儲存函式庫中所有可用的映像標籤,方便我們選擇合適的版本進行佈署。在實際操作中,應盡量避免使用 :latest 標籤,因為它可能指向不穩定的版本,導致佈署風險。建議使用明確的版本號或其他具有語義化意義的標籤,確保應用程式佈署的可預測性和穩定性。

容器映像管理:探索Podman的強大功能

在使用容器技術時,管理容器映像至關重要。本文將探討如何使用Podman與公有和私有容器映像儲存函式庫互動,包括登入管理、映像搜尋以及本地快取處理。

容器映像儲存函式庫的HTTP API V2

大多數公有和私有儲存函式庫都遵循Docker Registry HTTP API V2。由於這是一個根據HTTP的REST API,使用者可以使用簡單的curl命令與儲存函式庫互動,或者設計自己的客戶端。

使用Podman CLI與儲存函式庫互動

Podman提供了一個強大的命令列介面(CLI),用於與容器映像儲存函式庫互動。這包括:

  • 登入管理:管理儲存函式庫身份驗證所需的登入資訊。
  • 映像搜尋:透過字串模式搜尋映像儲存函式庫。
  • 本地快取管理:處理本地快取的映像。

搜尋映像:podman search 命令

podman search命令允許使用者在多個儲存函式庫中搜尋映像。例如,搜尋nginx映像:

# podman search nginx

這個命令會產生一個包含所有白名單儲存函式庫中nginx映像條目的輸出。

搜尋結果欄位說明

podman search命令的輸出包含以下欄位:

  • INDEX:映像的儲存函式庫索引。
  • NAME:映像的完整名稱,包括儲存函式庫名稱和相關名稱空間。
  • DESCRIPTION:映像的簡短描述。
  • STARS:使用者給予的星數(僅在支援此功能的儲存函式庫上可用,例如docker.io)。
  • OFFICIAL:一個布林值,用於指定映像是否為官方映像。
  • AUTOMATED:如果映像是自動構建的,則此欄位設定為OK。

搜尋過濾

可以應用過濾器來細化搜尋結果。例如,只列印官方映像:

# podman search nginx --filter=is-official

這個命令只會列印docker.io/library/nginx:latest,這是一個由nginx社群維護的官方映像。

自定義輸出格式

使用者可以自定義命令的輸出格式。例如,只列印映像儲存函式庫和映像名稱:

# podman search fedora \
--filter is-official \
--format "table {{.Index}} {{.Name}}"

輸出結果如下:

INDEX       NAME
docker.io   docker.io/library/fedora

映像命名模式

映像名稱具有標準命名模式:

<registry>[:<port>]/[<namespace>/]<name>:<tag>

各欄位詳細說明如下:

  • registry:映像儲存的儲存函式庫。例如,docker.io。可以指定自定義埠號,預設為5000。
  • namespace:層級結構,用於區分映像上下文與提供者。
  • name:私有/公有映像儲存函式庫的名稱,通常是應用程式名稱(例如,nginx)。
  • tag:映像的唯一標籤,對映到SHA256摘要。:latest標籤可以省略。

顯示所有可用的標籤

預設情況下,搜尋會隱藏映像標籤。要顯示給定儲存函式庫的所有可用標籤,可以使用--list-tags選項:

# podman search quay.io/prometheus/prometheus --list-tags

輸出範例:

NAME                                    TAG
quay.io/prometheus/prometheus           v2.5.0
quay.io/prometheus/prometheus           v2.6.0-rc.0
quay.io/prometheus/prometheus           v2.6.0-rc.1
quay.io/prometheus/prometheus           v2.6.0
quay.io/prometheus/prometheus           v2.6.1
quay.io/prometheus/prometheus           v2.7.0-rc.0
quay.io/prometheus/prometheus           v2.7.0-rc.1
quay.io/prometheus/prometheus           v2.7.0-rc.2
quay.io/prometheus/prometheus           v2.7.0
quay.io/prometheus/prometheus           v2.7.1
[...output omitted...]

這個選項對於在儲存函式庫中尋找特定映像標籤非常有用,這些標籤通常與應用程式/執行時的釋出版本相關聯。

避免使用:latest標籤

使用:latest標籤可能導致映像版本控制問題,因為它不是一個描述性標籤。雖然它通常指向最新的映像版本,但情況並非總是如此。未標記的映像可能會保留latest標籤,而最新推播的映像可能具有不同的標籤。

儲存函式庫維護者有責任正確應用標籤。如果儲存函式庫使用語意版本控制,玄貓(BlackCat)認為最好的選擇是提取最新的版本標籤。

玄貓(BlackCat)在為某金融科技公司設計容器化佈署流程時,深刻體會到映像標籤管理的重要性。我們最終採用了根據Git標籤自動化構建和標記映像的策略,確保每次佈署都使用明確與可追溯的映像版本。

使用 Podman 管理容器映象:探索與實踐

在使用容器技術時,有效地管理映象是至關重要的一環。Podman 提供了多種指令,讓你能輕鬆地提取、檢視、檢查以及刪除映象。本文將探討這些功能,並分享一些實用的技巧與經驗。

提取與檢視映象

以 Root 許可權提取映象

使用 podman pull 指令可以從遠端倉函式庫下載映象。例如,要提取最新的 Nginx 映象,可以執行以下指令:

# podman pull docker.io/library/nginx:latest

以 root 身份執行此指令時,映象的層和中繼資料會儲存在 /var/lib/containers/storage/ 路徑下。

以標準使用者許可權提取映象

若要以標準使用者身份執行相同的操作,只需在標準使用者的 shell 中執行指令:

$ podman pull docker.io/library/nginx:latest

這種情況下,映象會下載到使用者主目錄下的 $HOME/.local/share/containers/storage/,並且可用於以非 root 許可權執行的容器。這種方式在安全性上更佳,因為它減少了潛在的風險。

玄貓建議,在開發環境中,盡可能使用標準使用者許可權來管理映象,避免不必要的許可權提升。

檢視本地映象

使用 podman images 指令可以檢視所有本地快取的映象:

# podman images
REPOSITORY                 TAG      IMAGE ID       CREATED         SIZE
docker.io/library/nginx   latest   ad4c705f24d3   2 weeks ago   138 MB
docker.io/library/fedora  latest   dce66322d647   2 months ago  184 MB
[...省略輸出...]

輸出結果會顯示映象的倉函式庫名稱、標籤、ID、建立日期和大小。定期檢查本地映象,有助於瞭解哪些映象已過時,並及時清理。

podman images 指令還支援多種選項。其中,--sort 選項可用於按大小、日期、ID、倉函式庫或標籤對映象進行排序。例如,以下指令會按建立日期排序映象,找出最舊的映象:

# podman images --sort=created

玄貓發現,在清理舊映象時,按建立日期排序非常有用,可以快速找到不再需要的映象。

另外,--all(或 -a)和 --quiet(或 -q)選項結合使用,可以僅列出所有本地儲存映象(包括中間層)的 ID:

# podman images -qa
ad4c705f24d3
a56f85702a94
b5c5125e3fee
4d7fc5917f3e
625707533167
f881f1aa4d65
96ab2a326180

檢查映象的組態與內容

檢查組態

podman image inspect(或簡寫為 podman inspect)指令用於檢查已提取映象的組態:

# podman inspect docker.io/library/nginx:latest

輸出結果是一個 JSON 格式的物件,包含映象的組態、架構、層、標籤、註解和建置歷史。

映象歷史記錄顯示了每個層的建立歷史,這對於理解映象是如何建置的非常有用,尤其是在 Dockerfile 或 Containerfile 不可用的情況下。

由於輸出是 JSON 物件,你可以提取單個欄位,以收集特定資料或將其用作其他指令的輸入引數。以下範例印出在根據此映象建立容器時執行的指令:

# podman inspect docker.io/library/nginx:latest \
--format "{{ .Config.Cmd }}"
[nginx -g daemon off;]

此處,格式化的輸出是使用 Go 範本進行管理的。

檢查檔案系統內容

有時,僅檢查組態是不夠的,你可能需要檢查映象的檔案系統內容。Podman 提供了 podman image mount 指令來實作這一點。以下範例掛載映象並印出其掛載路徑:

# podman image mount docker.io/library/nginx
/var/lib/containers/storage/overlay/
ba9d21492c3939befbecd5ec32f6f1b9d564ccf8b1b279e0fb5c186e8b7
967f2/merged

在提供的路徑中執行 ls 指令,你將看到由其各個合併層組成的映象檔案系統:

# ls -al /var/lib/containers/storage/overlay/
ba9d21492c3939befbecd5ec32f6f1b9d564ccf8b1b279e0fb5c186e8b7
967f2/merged
total 92
dr-xr-xr-x. 1 root root 4096 Sep 25 22:30 .
drwx------. 5 root root 4096 Sep 25 22:53 ..
drwxr-xr-x. 2 root root 4096 Sep 2 02:00 bin
drwxr-xr-x. 2 root root 4096 Jun 13 12:30 boot
drwxr-xr-x. 2 root root 4096 Sep 2 02:00 dev
drwxr-xr-x. 1 root root 4096 Sep 9 20:26 docker-entrypoint.d
-rwxrwxr-x. 1 root root 1202 Sep 9 20:25 docker-entrypoint.sh
drwxr-xr-x. 1 root root 4096 Sep 9 20:26 etc
drwxr-xr-x. 2 root root 4096 Jun 13 12:30 home
drwxr-xr-x. 1 root root 4096 Sep 9 20:26 lib
drwxr-xr-x. 2 root root 4096 Sep 2 02:00 lib64
drwxr-xr-x. 2 root root 4096 Sep 2 02:00 media
drwxr-xr-x. 2 root root 4096 Sep 2 02:00 mnt
drwxr-xr-x. 2 root root 4096 Sep 2 02:00 opt
drwxr-xr-x. 2 root root 4096 Jun 13 12:30 proc
drwx------. 2 root root 4096 Sep 2 02:00 root
drwxr-xr-x. 3 root root 4096 Sep 2 02:00 run
drwxr-xr-x. 2 root root 4096 Sep 2 02:00 sbin
drwxr-xr-x. 2 root root 4096 Sep 2 02:00 srv
drwxr-xr-x. 2 root root 4096 Jun 13 12:30 sys
drwxrwxrwt. 1 root root 4096 Sep 9 20:26 tmp
drwxr-xr-x. 1 root root 4096 Sep 2 02:00 usr
drwxr-xr-x. 1 root root 4096 Sep 2 02:00 var

要解除安裝映象,只需執行 podman image unmount 指令:

# podman image unmount docker.io/library/nginx

在無 Root 模式下掛載映象

在無 root 模式下掛載映象略有不同,因為此執行模式僅支援手動掛載虛擬檔案系統(VFS)儲存驅動程式。由於預設使用 OverlayFS 儲存驅動程式,因此掛載/解除安裝指令無法直接使用。

一個解決方法是先執行 podman unshare 指令。它會在一個新的名稱空間內執行一個新的 shell 程式,其中當前使用者 ID(UID)/全域性唯一 ID(GID)分別對映到 UID 0 和 GID 0。這樣,你就擁有了提升的許可權來執行 podman mount 指令。以下是一個範例:

$ podman unshare
# podman image mount docker.io/library/nginx:latest \
/home/<username>/.local/share/containers/storage/overlay/
ba9d21492c3939befbecd5ec32f6f1b9d564ccf8b1b279e0fb5c186e8b7967
f2/merged

請注意,掛載點現在位於 <username> 的主目錄中。

要解除安裝,只需執行 podman unmount 指令:

# podman image unmount docker.io/library/nginx:latest
ad4c705f24d392b982b2f0747704b1c5162e45674294d5640cca7076eba2
865d
# exit

exit 指令是必要的,用於離開臨時的 unshared 名稱空間。

刪除映象

要刪除本地儲存的映象,可以使用 podman rmi 指令。以下範例刪除之前提取的 Nginx 映象:

# podman rmi docker.io/library/nginx:latest
Untagged: docker.io/library/nginx:latest

身為玄貓(BlackCat),我將根據提供的技術文章,以台灣頂尖技術專家的角度,融合實戰經驗與獨到見解,進行全面重構與深度創作。所有標題與內容都將全新創作,確保技術精準、風格地道,並符合所有格式規範。

釋放儲存空間:玄貓的 Podman 映象管理技巧

容器映象是現代軟體開發的根本,但隨著專案演進,未使用的映象可能會佔用大量儲存空間。身為玄貓,我將分享一些管理 Podman 映象的實用技巧,確保系統保持高效執行。

移除特定映象:精準釋放空間

要移除特定的 Podman 映象,可以使用 podman rmi 指令,並指定映象 ID。例如,移除 ID 為 ad4c705f24d392b982b2f0747704b1c5162e45674294d5640cca7076eba2865d 的映象:

# podman rmi ad4c705f24d392b982b2f0747704b1c5162e45674294d5640cca7076eba2865d

這個指令在 rootless 模式下也能運作,只需以一般使用者身分執行,即可清理使用者本機儲存中的映象。

一次移除所有映象:小心使用!

若要移除所有快取的映象,可以使用以下指令:

# podman rmi $(podman images -qa)

這個指令會列出所有映象 ID,並將其傳遞給 podman rmi 指令。請務必謹慎使用,因為這會移除所有本地映象。

清理未使用映象:安全釋放空間

Podman 提供了更安全的清理方式:podman image prune 指令。這個指令只會移除未被任何容器使用的映象。

$ sudo podman image prune -af

-a 引數表示移除所有未使用的映象,-f 引數表示不需確認直接執行。這個指令在 rootless 模式下也能運作,只會清理使用者本機儲存中的映象。

容器運作狀態管理:玄貓的實戰經驗

容器啟動後,監控和管理其運作狀態至關重要。身為玄貓,我將分享一些實用的 Podman 指令,幫助你深入瞭解容器的行為。

啟動 Nginx 容器:例項演示

首先,讓我們啟動一個 Nginx 容器,並將其暴露在 8080 埠,使其可以從外部存取:

$ podman run -d -p 8080:80 docker.io/library/nginx

-d 引數表示在背景執行容器,-p 引數表示將主機的 8080 埠對應到容器的 80 埠。這個指令在 rootless 模式下也能運作。

測試容器:確認運作

容器啟動後,可以使用 curl 指令測試其是否正常運作:

$ curl localhost:8080

如果看到 Nginx 的歡迎頁面,表示容器已成功啟動並運作。

檢視容器狀態:podman ps 指令

podman ps 指令可以列出所有正在運作的容器的資訊:

$ podman ps

這個指令會顯示容器 ID、使用的映象、執行的指令、建立時間、狀態、埠口對應和容器名稱等資訊。

停止容器:podman stop 指令

podman stop 指令可以停止正在運作的容器:

$ podman stop d8bbd5da64d0

這個指令會傳送 SIGTERM 訊號給容器內的程式,要求其正常結束。如果容器沒有回應,Podman 會在 10 秒後傳送 SIGKILL 訊號強制停止容器。

檢視所有容器:podman ps -a 指令

若要檢視所有容器(包含已停止的容器),可以使用 podman ps -a 指令:

$ podman ps -a

這個指令會列出所有容器的資訊,包含其狀態(例如 Exited (0))。

透過這些指令,我們可以有效地管理 Podman 映象和容器,確保系統的穩定性和效率。

容器技術日新月異,掌握這些基本指令是成為優秀開發者的第一步。身為玄貓,我鼓勵大家多多嘗試,深入探索容器技術的奧秘。