Podman 作為新一代容器管理工具,提供更輕量與安全的容器化體驗。精確掌握容器的啟動、停止和移除操作是使用 Podman 的基礎。本文除了介紹 podman startpodman stoppodman rm 等基本命令外,還將探討如何結合 Shell 擴充套件實作批次操作,如何使用過濾器精確篩選容器,以及如何自定義輸出格式以滿足不同需求。此外,文章還涵蓋了 podman create 命令用於預先建立容器、podman container mount 命令用於掛載容器檔案系統以便檢查和組態,以及 podman container prune 命令用於快速清理已停止的容器等進階技巧。最後,文章也介紹瞭如何檢視容器行程 ID 和名稱空間資訊,方便開發者進行進階的故障排除和系統診斷。這些技巧的結合,能大幅提升容器管理效率,讓開發者更專注於應用程式本身的開發和佈署。

Podman容器管理:啟動、停止與移除的藝術

在使用 Podman 管理容器時,啟動、停止和移除容器是基本操作。這些操作不僅影響容器的生命週期,還關係到資源的有效利用和系統的穩定性。本文將探討這些操作,並分享一些實用的技巧和經驗。

啟動已停止的容器:podman start 命令

當容器停止後,可以使用 podman start 命令重新啟動它。這與啟動一個全新的容器不同,因為 Podman 保留了容器的組態、儲存和中繼資料。

$ podman start d8bbd5da64d0

這個指令會重新啟動之前停止的容器。若要確認容器是否已成功啟動,可以使用 podman ps 命令檢視容器狀態。

$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORT NAMES
d8bbd5da64d0 docker.io/library/nginx:latest nginx -g daemon
o... 8 分鐘前 Up 1 秒前 0.0.0.0:8080->80/tcp
unruffled_saha

內容解密

  • podman start d8bbd5da64d0: 此命令啟動 ID 為 d8bbd5da64d0 的容器。
  • podman ps: 此命令列出正在執行的容器,確認容器是否已成功啟動。

重新啟動執行中的容器:podman restart 命令

如果容器正在執行,但需要重新啟動,可以使用 podman restart 命令。這個命令會立即重新啟動容器內的行程,並分配一個新的行程 ID(PID)。

$ podman restart <Container_ID_or_Name>

玄貓小提示: podman restart 命令在需要快速重啟服務時非常有用,例如在組態變更後。

建立但不啟動容器:podman create 命令

有時候,我們可能需要先建立容器,但不立即啟動它。這可以使用 podman create 命令實作。這種方式常用於預先準備環境或掛載容器檔案系統。

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

建立後,可以使用 podman start 命令啟動它。

$ podman start <Container_ID_or_Name>

內容解密

  • podman create -p 8080:80 docker.io/library/nginx: 建立一個 Nginx 容器,但不啟動,並將主機的 8080 連線埠對映到容器的 80 連線埠。
  • podman start <Container_ID_or_Name>: 啟動指定 ID 或名稱的容器。

掛載容器檔案系統:podman container mount 命令

podman container mount 命令允許將容器的檔案系統掛載到主機上。這對於檢查容器內部檔案或進行手動組態非常有用。

$ podman unshare
$ podman container mount <Container_ID_or_Name>
/home/<username>/.local/share/containers/storage/overlay/
bf9d8df299436d80dece200a23e1b8b957f987a254a656ef94cdc5666982
3b5c/merged

內容解密

  • podman unshare: 在非特權環境中執行掛載操作。
  • podman container mount <Container_ID_or_Name>: 掛載指定容器的檔案系統。

移除容器:podman rm 命令

當容器不再需要時,可以使用 podman rm 命令將其移除。預設情況下,podman rm 只能移除已停止的容器。若要強制移除正在執行的容器,可以使用 -f 選項。

$ podman stop d8bbd5da64d0
$ podman rm d8bbd5da64d0

玄貓小提示: 移除容器會丟棄所有容器的儲存、組態和中繼資料,請謹慎操作。

批次操作:結合 Shell 擴充套件

Podman 結合 Shell 擴充套件可以實作批次操作。例如,可以使用迴圈啟動多個相同的容器。

$ for i in {1..5}; do podman run -d docker.io/library/nginx; done

然後,可以使用 podman ps -qa 命令列出所有容器的 ID,並結合 podman stoppodman rm 命令批次停止和移除這些容器。

$ podman stop $(podman ps -qa)
$ podman rm $(podman ps -qa)

內容解密

  • podman ps -qa: 列出所有容器的 ID,包括正在執行的和已停止的。
  • podman stop $(podman ps -qa): 停止所有列出的容器。
  • podman rm $(podman ps -qa): 移除所有列出的容器。

使用過濾器:podman ps --filter 命令

podman ps 命令支援使用過濾器來篩選容器。例如,可以使用 status 過濾器只列出特定狀態的容器。

$ podman ps --filter status=exited

然後,可以使用 Shell 擴充套件結合 podman rm 命令移除所有已停止的容器。

$ podman rm $(podman ps -qa --filter status=exited)

清理已停止的容器:podman container prune 命令

podman container prune 命令可以快速移除所有已停止的容器。

$ podman container prune

排序輸出:podman ps --sort 命令

podman ps 命令支援按不同欄位排序輸出結果。例如,可以按容器 ID 排序。

$ podman ps -q --sort id

自定義輸出格式:podman ps --format 命令

podman ps 命令允許使用 Go 範本自定義輸出格式。例如,可以只輸出容器 ID 和容器內執行的命令。

$ podman ps -a --format "{{.ID}} {{.Command}}" --no-trunc

檢視容器行程 ID:podman ps --format "{{ .Pid }}" 命令

若要提取容器內執行的行程的宿主機 PID,可以使用以下命令:

$ podman ps --format "{{ .Pid }}"

檢視名稱空間資訊:podman ps --namespace 命令

podman ps 命令還可以顯示容器的名稱空間資訊,這對於進階故障排除和檢查非常有用。

$ podman ps --namespace
CONTAINER ID NAMES PID CGROUPNS IPC
MNT NET PIDNS USERNS UTS
f2666ed4a46a unruffled_hofstadter 437764 4026533088
4026533086 4026533083 4026532948 4026533087 4026532973
4026533085