Podman 提供了完善的容器映像檔管理機制,允許使用者有效地提取、檢視、檢查和操作映像檔。使用者可以透過 podman pull 命令從遠端倉函式庫下載映像檔,並使用 podman images 命令檢視本地快取的映像檔列表,搭配 --sort 選項可依不同條件排序。podman inspect 命令則能深入檢視映像檔的組態、架構、層級等詳細資訊,並可搭配 --format 選項提取特定欄位。此外,podman image mount 命令允許使用者掛載映像檔的檔案系統,以便直接檢視其內容。在 Rootless 環境下,需使用 podman unshare 命令來提升許可權,才能順利掛載映像檔。除了映像檔管理,Podman 也提供了一系列命令來管理執行中的容器。podman run 命令可以啟動容器,podman ps 命令可以檢視執行中容器的狀態,而 podman stop 命令則可以停止容器。這些命令共同構成了 Podman 豐富的容器管理工具集,方便使用者進行各種容器操作。
管理容器映像檔
在取得所需的映像檔後,可以使用 podman pull 命令下載,如下所示:
# 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 命令也支援許多選項(完整的選項列表可透過執行 man podman-images 命令取得)。其中一個有趣的選項是 --sort,可用於按大小、日期、ID、儲存函式庫或標籤排序映像檔。例如,可以按建立日期排序映像檔,以找出最過時的映像檔,如下所示:
# podman images --sort=created
顯示映像檔 ID
另兩個非常有用的選項是 --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 格式的物件,包含映像檔組態、架構、層、標籤、註解和映像檔建立歷史。
檢視特定組態資訊
由於輸出是一個 JSON 物件,因此可以提取單個欄位以收集特定資料或將其用作其他命令的輸入引數。以下範例列印出根據此映像檔建立容器時執行的命令:
# podman inspect docker.io/library/nginx:latest --format "{{ .Config.Cmd }}"
[nginx -g daemon off;]
檢視映像檔檔案系統內容
有時,需要檢查映像檔的檔案系統內容,而不僅僅是組態檢查。為此,Podman 提供了 podman image mount 命令。以下範例掛載映像檔並列印其掛載路徑:
# podman image mount docker.io/library/nginx
/var/lib/containers/storage/overlay/ba9d21492c3939befbecd5ec32f6f1b9d564ccf8b1b279e0fb5c186e8b7967f2/merged
執行簡單的 ls 命令,可以檢視映像檔檔案系統,如下所示:
# ls -al /var/lib/containers/storage/overlay/ba9d21492c3939befbecd5ec32f6f1b9d564ccf8b1b279e0fb5c186e8b7967f2/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
#### 無 Root 環境下的掛載
在無 Root 環境下掛載映像檔略有不同,因為此執行模式僅支援手動掛載 VFS(虛擬檔案系統)儲存驅動程式。由於預設使用 OverlayFS,因此掛載/解除掛載命令無法正常運作。解決方法是在執行 `podman mount` 命令前先執行 `podman unshare` 命令。這會在新的名稱空間中執行新的 shell 行程,其中目前的使用者 ID(UID)和群組 ID(GID)分別對映到 UID 和 GID。接下來,我們具有提升的許可權來執行 `podman mount` 命令。示例如下:
```bash
$ podman unshare
# podman image mount docker.io/library/nginx:latest /home/<username>/.local/share/containers/storage/overlay/ba9d21492c3939befbecd5ec32f6f1b9d564ccf8b1b279e0fb5c186e8b7967f2/merged
程式碼說明:
以下是一個簡單的指令碼,用於展示如何使用 podman 命令來管理容器影像:
#!/bin/bash
# 提取 nginx 映象
podman pull docker.io/library/nginx:latest
# 檢視本地映象
podman images
# 檢視 nginx 映象的詳細資訊
podman inspect docker.io/library/nginx:latest
# 將 nginx 映象掛載到本地檔案系統
podman image mount docker.io/library/nginx:latest
# 列出掛載點的內容
ls -al /var/lib/containers/storage/overlay/ba9d21492c3939befbecd5ec32f6f1b9d564ccf8b1b279e0fb5c186e8b7967f2/merged
#解除掛載nginx映象
podman image unmount docker.io/library/nginx:latest
#刪除nginx映象
podman rmi docker.io/library/nginx:latest
#### 程式碼說明:
podman pull docker.io/library/nginx:latest:從遠端倉函式庫提取nginx映象到本地。- 作用:下載所需的容器映象。
- 邏輯:該命令會檢查本地是否已存在該映象,若不存在,則從指定的遠端倉函式庫下載。
podman images:列出本地所有的容器映象。- 作用:檢視當前系統中已有的映象列表。
- 邏輯:顯示本地儲存的所有映象,包括其倉函式庫名稱、標籤、映象 ID、建立時間和大小等資訊。
podman inspect docker.io/library/nginx:latest:檢視指定映象的詳細資訊。- 作用:檢查指定映象的組態和屬性。
- 邏輯:傳回一個 JSON 物件,包含該映象的詳細組態資訊,例如架構、層資訊、標籤等。
podman image mount docker.io/library/nginx:latest:將指定的映象掛載到本地檔案系統。- 作用:允許使用者檢視映象內的檔案系統內容。
- 邏輯:傳回一個掛載點路徑,使用者可以透過該路徑存取映象內的檔案。
ls -al /var/lib/containers/storage/overlay/ba9d21492c3939befbecd5ec32f6f1b9d564ccf8b1b279e0fb5c186e8b7967f2/merged:列出掛載點的內容。- 作用:檢視映象內的檔案系統結構。
- 邏輯:使用
ls命令顯示掛載目錄中的檔案和目錄列表。
podman image unmount docker.io/library/nginx:latest:解除對指定映象的掛載。- 作用:釋放掛載的資源,避免不必要的資源佔用。
- 邏輯:解除對指定映象檔案系統的掛載,使其不再可存取。
podman rmi docker.io/library/nginx:latest:刪除指定的映象。- 作用:清理不再需要的映象,釋放磁碟空間。
- 邏輯:刪除指定的本地映象,如果該映象是被標籤為最新的,則會被取消標記或直接刪除。
管理執行中的容器
在前面的章節中,我們學習瞭如何管理容器映像,接下來我們將探討如何處理和檢查執行中的容器。
檢視和處理容器狀態
首先,讓我們執行一個簡單的容器,並將其暴露在8080埠上,以便外部可以存取:
$ podman run -d -p 8080:80 docker.io/library/nginx
這個例子是在無根模式下執行的,但同樣的命令也可以在根使用者下透過新增sudo來執行。在這種情況下,簡單地不需要以這種方式執行容器。
重點提示
無根容器提供了額外的安全優勢。如果惡意程式破壞了容器隔離,可能利用主機上的漏洞,它最多隻能獲得啟動無根容器的使用者的許可權。
現在我們的容器已經啟動並執行,我們可以透過在本地主機上執行curl命令來測試它,這應該會產生一個預設的HTML輸出:
$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p>
<p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
顯然,一個空的nginx伺服器沒有內容可供服務,但我們將在後面的章節中學習如何使用卷或構建自定義映像來提供自定義內容。
我們可以用來檢查容器的第一個命令是podman ps。這簡單地列印預出執行中的容器的有用資訊,並具有自定義和排序輸出的選項。讓我們在主機上執行該命令,看看列印了什麼:
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8bbd5da64d0 docker.io/library/nginx:latest nginx -g daemon o... 13 minutes ago Up 13 minutes ago 0.0.0.0:8080->80/tcp unruffled_saha
輸出提供了一些有關執行中的容器的有趣資訊,如下所述:
- CONTAINER ID:每個新容器都會獲得一個唯一的十六進位制ID。完整的ID長度為64個字元,在
podman ps輸出中列印預出12個字元的縮短部分。 - IMAGE:容器使用的映像。
- COMMAND:在容器內執行的命令。
- CREATED:容器的建立日期。
- STATUS:容器的當前狀態。
- PORTS:在容器中開啟的網路埠。當應用埠對映時,我們可以看到一個或多個主機
ip:port對與容器埠對映,並帶有箭頭符號。例如,0.0.0.0:8080->80/tcp字串表示8080/tcp主機埠在所有偵聽介面上暴露,並對映到80/tcp容器埠。 - NAMES:容器的名稱。這可以由使用者分配,也可以由容器引擎隨機生成。
小技巧
注意輸出最後一列中的隨機生成的名稱。Podman延續了Docker的傳統,使用左側部分的形容詞和右側部分著名的科學家和駭客來生成隨機名稱。事實上,Podman仍然使用相同的github.com/docker/docker/namesgenerator Docker包,包含在專案的vendor目錄中。
要取得執行中和已停止的容器的完整列表,我們可以在命令中新增-a選項。為了演示這一點,我們首先介紹podman stop命令。這會將容器的狀態更改為已停止,並向容器內執行的程式傳送SIGTERM訊號。如果容器變得無回應,它會在給定的10秒超時後傳送SIGKILL訊號。
讓我們嘗試停止前面的容器,並透過執行以下程式碼來檢查其狀態:
$ podman stop d8bbd5da64d0
$ podman ps
這次,podman ps產生了一個空的輸出。這是因為容器的狀態是已停止。要取得執行中和已停止的容器的完整列表,請執行以下命令:
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8bbd5da64d0 docker.io/library/nginx:latest nginx -g daemon o... About a minute ago Exited (0) About a minute ago 0.0.0.0:8080->80/tcp unruffled_saha
內容解密:
此段落介紹瞭如何使用 podman ps 命令來檢視和管理執行中的容器。下面是對每個要點的詳細解說:
podman ps命令:此命令用於列出當前正在執行的容器。它提供了有關容器的詳細資訊,如容器ID、使用的映像、執行的命令、建立時間、狀態、埠對映和容器名稱。輸出欄位說明:
- CONTAINER ID:容器的唯一識別碼。
- IMAGE:建立容器所使用的映像。
- COMMAND:在容器啟動時執行的命令。
- CREATED:容器的建立時間。
- STATUS:容器的當前狀態,如執行中或已離開。
- PORTS:容器的埠對映情況,顯示主機埠如何對映到容器內部的埠。
- NAMES:容器的名稱,可以是使用者自定義的或是系統自動生成的。
-a選項的使用:透過新增-a選項,podman ps命令可以列出所有容器,包括執行中的和已停止的。這對於管理和監控所有容器的狀態非常有用。podman stop命令:用於停止一個或多個正在執行的容器。它向容器內的程式傳送SIGTERM訊號,如果在一定時間內(預設為10秒)容器沒有停止,則會傳送SIGKILL訊號強制停止容器。示例操作流程:
- 首先,使用
podman run命令啟動一個新的容器,並將其埠對映到主機的特定埠。 - 使用
curl命令測試容器服務是否正常運作。 - 使用
podman ps檢視當前執行的容器列表及其詳細資訊。 - 使用
podman stop命令停止特定的容器。 - 使用
podman ps -a檢視包括已停止的容器在內的所有容器的列表。
- 首先,使用
綜上所述,本段落詳細介紹瞭如何使用 podman ps 和 podman stop 等命令來管理和監控容器的狀態,並解釋了相關命令的輸出和選項。這些操作對於有效地管理容器化應用至關重要。