Podman 從入門到精通

1. 前言

在本文中,我們將瞭解 PodmanPod Manager的縮寫)、它的功能和用法。

2. Podman

Podman 是一個開源的容器管理工具,用於開發、管理和運行 OCI 容器。讓我們來看看與其他容器管理工具相比, Podman 的一些優勢,

但是,Podman 有一定的侷限性:

3. 與 Docker 的比較

現在我們已經瞭解了 Podman 是什麼,以及它的優點和侷限性,讓我們將它與使用最廣泛的容器管理工具之一的 Docker 進行比較。

3.1 命令行界面 (CLI)

Podman 提供了 Docker 客戶端公開的相同命令集。換句話說,這兩個實用程序的命令之間存在一對一的映射。

但是,像podman pspodman 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 命令創建一個 podcreate 命令支持不同的選項。

$ 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