podman 使用初
引言:
在本文中,我們將了解?Podman(Pod Manager的縮寫)、它的功能和用法。
一、Podman
Podman 是一個開源的容器管理工具,用于開發、管理和運行OCI容器。讓我們來看看與其他容器管理工具相比, Podman 的一些優勢,
-
Podman 創建的鏡像與其他容器管理工具兼容。Podman 創建的鏡像遵循 OCI 標準,因此可以推送到其他容器注冊中心,如 Docker Hub
-
它可以作為普通用戶運行,無需 root 權限。?當以非 root 用戶身份運行時,Podman 創建一個用戶命名空間,在其中獲取 root 權限。這允許它掛載文件系統并設置所需的容器
-
它提供了管理 pod 的能力。?與其他容器運行時工具不同,Podman 允許用戶管理 pod(一個或多個為一組一起運行的容器)。用戶可以對 Pod 執行創建、列出、檢查等操作
但是,Podman 有一定的局限性:
-
它僅在基于 Linux 的系統上運行。?目前,Podman 僅在基于 Linux 的操作系統上運行,并且沒有針對 Windows 和 macOS 的包裝器。
-
沒有 Docker Compose 的替代品。?Podman 不支持在本地管理多個容器,類似于 Docker Compose 所做的。作為 podman-compose 項目的一部分,正在開發使用 Podman 后端的 Docker Compose 實現,但這仍在進行中。
二、與docker的比較
現在我們已經了解了 Podman 是什么,以及它的優點和局限性,讓我們將它與使用最廣泛的容器管理工具之一的 Docker 進行比較。
2.1 命令行界面 (CLI)
Podman 提供了 Docker 客戶端公開的相同命令集。換句話說,這兩個實用程序的命令之間存在一對一的映射。
但是,像podman ps和podman images這樣的命令不會顯示使用 Docker 創建的容器或鏡像。這是因為 Podman 的本地存儲庫是/var/lib/containers,而不是 Docker 維護的/var/lib/docker。
2.2. 容器模型
Docker 對容器使用客戶端-服務器架構,而 Podman 使用?Linux 進程中常見的傳統?fork-exec?模型。使用 Podman 創建的容器是父 Podman 進程的子進程。這就是為什么當同時為 Docker 和 Podman 運行 version 命令時,Docker 列出了客戶端和服務器的版本,而 Podman 只列出了它的版本。
docker version?的示例輸出:
[root@docker ~]# docker version Client: Docker Engine - CommunityVersion: 20.10.17API version: 1.41Go version: go1.17.11Git commit: 100c701Built: Mon Jun 6 23:05:12 2022OS/Arch: linux/amd64Context: defaultExperimental: trueServer: Docker Engine - CommunityEngine:Version: 20.10.17API version: 1.41 (minimum version 1.12)Go version: go1.17.11Git commit: a89b842Built: Mon Jun 6 23:03:33 2022OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.6.8GitCommit: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6runc:Version: 1.1.4GitCommit: v1.1.4-0-g5fd4c4ddocker-init:Version: 0.19.0GitCommit: de40ad0podman version?的示例輸出:
[root@podman ~]# podman version Version: 1.6.4 RemoteAPI Version: 1 Go Version: go1.12.12 OS/Arch: linux/amd64由于 Podman 本身作為進程運行,因此它不需要任何后臺守護進程。與 Podman 不同,Docker 需要一個守護進程 Docker daemon 來協調客戶端和服務器之間的 API 請求。
2.3. 無需 Root
如前所述,Podman 不需要 root 訪問權限來運行其命令。另一方面,Docker 依賴于守護進程,需要?root?權限或要求用戶成為docker組?的一部分才能在沒有?root?權限的情況下運行 Docker 命令。
$?sudo?usermod?-aG?docker?$USER?三、安裝與使用
讓我們從安裝 Podman開始。
安裝:
[root@podman ~]# yum install -y podmanpodman info命令顯示 Podman 系統信息并幫助檢查安裝狀態。
[root@podman ~]# podman version Version: 1.6.4 RemoteAPI Version: 1 Go Version: go1.12.12 OS/Arch: linux/amd64 [root@podman ~]# podman info host:BuildahVersion: 1.11.7CgroupVersion: v1Conmon:package: conmon-2.0.8-1.el7.x86_64path: /usr/bin/conmonversion: 'conmon version 2.0.8, commit: f85c8b1ce77b73bcd48b2d802396321217008762'Distribution:distribution: '"centos"'version: "7"MemFree: 2882011136MemTotal: 3954184192OCIRuntime:name: runcpackage: runc-1.0.0-69.rc10.el7_9.x86_64path: /usr/bin/runcversion: 'runc version spec: 1.0.1-dev'SwapFree: 0SwapTotal: 0arch: amd64cpus: 4eventlogger: journaldhostname: podmankernel: 3.10.0-957.el7.x86_64os: linuxrootless: falseuptime: 35h 12m 54.44s (Approximately 1.46 days) registries:blocked: nullinsecure: nullsearch:- registry.access.redhat.com- registry.redhat.io- docker.io store:ConfigFile: /etc/containers/storage.confContainerStore:number: 0GraphDriverName: overlayGraphOptions: {}GraphRoot: /var/lib/containers/storageGraphStatus:Backing Filesystem: xfsNative Overlay Diff: "true"Supports d_type: "true"Using metacopy: "false"ImageStore:number: 0RunRoot: /var/run/containers/storageVolumePath: /var/lib/containers/storage/volumes讓我們看一下一些基本的 Podman 命令。
3.1.?創建鏡像
首先,我們將看看使用 Podman 創建鏡像。讓我們首先創建一個包含以下內容的?Dockerfile
FROM centos:latest RUN yum -y install httpd CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] EXPOSE 80現在讓我們使用?build?命令創建鏡像:
$?podman?build?.在這里,我們首先拉取?CentOS?的基本鏡像,在其上安裝?Apache,然后將其作為前臺進程運行,并暴露端口 80。我們可以通過運行這個鏡像并將暴露的端口映射到主機端口來訪問 Apache 服務器。
build?命令遞歸地傳遞上下文目錄中可用的所有文件夾。當沒有指定目錄時,當前工作目錄默認成為構建上下文。因此,建議不要在上下文目錄中包含創建鏡像不需要的文件和文件夾。
3.2. 列出可用鏡像
podman images命令列出所有可用的鏡像。它還支持過濾鏡像的各種選項
$?podman?images此命令列出本地存儲庫中可用的所有鏡像。它包含有關從哪個存儲庫中提取鏡像、標簽、其鏡像 ID、創建時間和大小的信息。
REPOSITORY?????????????????TAG??????IMAGE?ID?????????CREATED?????????SIZE docker.io/library/centos???latest??0f3e07c0138f????2?months?ago??????227MB <none>?????????????????????<none???49030e844ce7???27?seconds?ago?????277MB3.3. 運行鏡像
podman run?命令創建指定鏡像的容器,然后運行它。讓我們運行上面創建的 CentOS 鏡像
$?podman?run??-p?80:80?-dit?centos此命令首先檢查是否有可用于 CentOS 的本地鏡像。如果鏡像不在本地,它會嘗試從配置的注冊表中拉取鏡像。如果鏡像不存在于注冊表中,則會顯示有關無法找到鏡像的錯誤。
上面的 run 命令指定將容器暴露的 80 端口映射到主機的 80 端口,-dit?標志指定以分離和交互模式運行容器。創建的容器的 id 將作為輸出。
3.4. 刪除鏡像
podman rmi?命令刪除本地存儲庫中存在的鏡像??梢酝ㄟ^在輸入中提供以空格分隔的 ID 來刪除多個鏡像。指定?-a?標志會刪除所有鏡像
$?podman?rmi?785188cd988c3.5. 列出容器
可以使用?podman ps -a?命令列出所有可用容器,包括未運行的容器。與?podman images?命令類似,它也可以與各種選項一起使用。
$?podman?ps?-a上述命令的輸出列出了所有容器的信息,例如創建它的鏡像、啟動命令、狀態、正在運行的端口以及名稱。
CONTAINER?ID???IMAGE????COMMAND?????CREATED?AT??????????????????????STATUS??????????????PORTS????????????????????????????????????NAMES eed30719cd37???centos???/bin/bash???2019-12-09?02:57:37?+0000?UTC???Up?14?minutes?ago???0.0.0.0:80->80/udp,?0.0.0.0:80->80/tcp???reverent_liskov3.6. 刪除容器
podman rm?命令刪除容器。此命令不會刪除處于運行或暫停狀態的容器。需要先停止,然后再移除。
$?podman?stop?eed30719cd37$?podman?rm?eed30719cd373.7. 創建 Pod
podman pod create?命令創建一個?pod。create?命令支持不同的選項。
$?podman?pod?createpod create?命令默認創建一個帶有?infra?容器的 pod,除非明確將 infra 標志設置為 false。
$?podman?pod?create?--infra?=?falseInfra container?允許 Podman 連接 pod 中的各種容器。
3.8. 列出 Pod
podman pod list?命令顯示所有可用的 pod
$?podman?pod?list此命令的輸出會顯示 pod id、名稱、關聯容器的數量、infra 容器的 id 等信息:
POD?ID?????????NAME?????????????STATUS??????CREATED???????#?OF?CONTAINERS???INFRA?ID 7e0a68528aed???gallant_raman????Running????5?seconds?ago????????1???????????c6d06673c667所有?Podman?命令及其用法可以在官方文檔中找到。
四、?總結
在本文中,我們了解了 Podman 的基礎知識及其功能、與 Docker 的比較以及一些可用的命令。
總結
以上是生活随笔為你收集整理的podman 使用初的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: make[1]: *** 没有规则可制作
- 下一篇: 数据库访问被拒绝