Podman 從入門到精通
1. 前言
在本文中,我們將瞭解 Podman
(Pod Manager
的縮寫)、它的功能和用法。
2. 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 實現,但這仍在進行中。
3. 與 Docker 的比較
現在我們已經瞭解了 Podman 是什麼,以及它的優點和侷限性,讓我們將它與使用最廣泛的容器管理工具之一的 Docker 進行比較。
3.1 命令行界面 (CLI)
Podman 提供了 Docker 客戶端公開的相同命令集。換句話說,這兩個實用程序的命令之間存在一對一的映射。
但是,像podman ps
和podman images
這樣的命令不會顯示使用 Docker 創建的容器或鏡像。這是因爲 Podman 的本地存儲庫是/var/lib/containers
,而不是 Docker 維護的/var/lib/docker
。
3.2. 容器模型
Docker 對容器使用客戶端 - 服務器架構,而 Podman 使用 Linux 進程中常見的傳統 fork-exec
模型。使用 Podman 創建的容器是父 Podman 進程的子進程。這就是爲什麼當同時爲 Docker 和 Podman 運行 version 命令時,Docker 列出了客戶端和服務器的版本,而 Podman 只列出了它的版本。
docker version
的示例輸出:
Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:11:19 2017
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:09:53 2017
OS/Arch: linux/amd64
Experimental: false
podman version
的示例輸出:
Version: 0.3.2-dev
Go Version: go1.9.4
Git Commit: "4f4a78abb40fa0e8407e8a55d5a67a2650d8fd96"
Built: Mon Mar 5 11:10:35 2018
OS/Arch: linux/amd64
由於 Podman 本身作爲進程運行,因此它不需要任何後臺守護進程。與 Podman 不同,Docker 需要一個守護進程 Docker daemon 來協調客戶端和服務器之間的 API 請求。
3.3. 無需 Root
如前所述,Podman 不需要 root 訪問權限來運行其命令。另一方面,Docker 依賴於守護進程,需要 root
權限或要求用戶成爲docker
組 的一部分才能在沒有 root
權限的情況下運行 Docker 命令。
$ sudo usermod -aG docker $USER
4. 安裝使用
讓我們從安裝 Podman 開始。podman info
命令顯示 Podman 系統信息並幫助檢查安裝狀態。
$ podman info
此命令顯示與主機相關的信息,例如內核版本、已使用和可用的交換空間,以及與 Podman 相關的信息,例如它有權將鏡像拉取和推送到的註冊表、它使用的存儲驅動程序、存儲位置等:
host:
MemFree: 546578432
MemTotal: 1040318464
SwapFree: 4216320000
SwapTotal: 4216320000
arch: amd64
cpus: 2
hostname: base-xenial
kernel: 4.4.0-116-generic
os: linux
uptime: 1m 2.64s
insecure registries:
registries: []
registries:
registries:
- docker.io
- registry.fedoraproject.org
- registry.access.redhat.com
store:
ContainerStore:
number: 0
GraphDriverName: overlay
GraphOptions: null
GraphRoot: /var/lib/containers/storage
GraphStatus:
Backing Filesystem: extfs
Native Overlay Diff: "true"
Supports d_type: "true"
ImageStore:
number: 0
RunRoot: /var/run/containers/storage
讓我們看一下一些基本的 Podman 命令。
4.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
命令遞歸地傳遞上下文目錄中可用的所有文件夾。當沒有指定目錄時,當前工作目錄默認成爲構建上下文。因此,建議不要在上下文目錄中包含創建鏡像不需要的文件和文件夾。
4.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 277MB
4.3. 運行鏡像
podman run
命令創建指定鏡像的容器,然後運行它。讓我們運行上面創建的 CentOS 鏡像
$ podman run -p 80:80 -dit centos
此命令首先檢查是否有可用於 CentOS 的本地鏡像。如果鏡像不在本地,它會嘗試從配置的註冊表中拉取鏡像。如果鏡像不存在於註冊表中,則會顯示有關無法找到鏡像的錯誤。
上面的 run 命令指定將容器暴露的 80 端口映射到主機的 80 端口,-dit
標誌指定以分離和交互模式運行容器。創建的容器的 id 將作爲輸出。
4.4. 刪除鏡像
podman rmi
命令刪除本地存儲庫中存在的鏡像。可以通過在輸入中提供以空格分隔的 ID 來刪除多個鏡像。指定 -a
標誌會刪除所有鏡像
$ podman rmi 785188cd988c
4.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_liskov
4.6. 刪除容器
podman rm
命令刪除容器。此命令不會刪除處於運行或暫停狀態的容器。需要先停止,然後再移除。
$ podman stop eed30719cd37
$ podman rm eed30719cd37
4.7. 創建 Pod
podman pod create
命令創建一個 pod
。create
命令支持不同的選項。
$ podman pod create
pod create
命令默認創建一個帶有 infra
容器的 pod,除非明確將 infra 標誌設置爲 false。
$ podman pod create --infra = false
Infra container
允許 Podman 連接 pod 中的各種容器。
4.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
命令及其用法可以在官方文檔中找到。
5. 總結
在本文中,我們瞭解了 Podman 的基礎知識及其功能、與 Docker 的比較以及一些可用的命令。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/_s_qMWmKf9S0bGpFVIxl2g