Podman 教程 – Podman 入门

本教程介绍了如何在 Linux 操作系统中开始使用 Podman。 在本 Podman 教程结束时,您将学习 Podman 基础知识,例如如何搜索和下载图像、从图像创建新容器、运行容器、删除容器以及从容器构建自己的图像等等。

在我们开始使用 Podman 之前,请确保您已经在 Linux 机器上安装了 Podman。

  • Podman 是什么以及如何在 Linux 中安装 Podman

开始使用 Podman

Podman 提供了一个命令行界面 (CLI),类似于 码头工人 容器引擎。 事实上,Podman 旨在成为 Docker 提供的 docker 客户端的直接替代品。

Podman 和 Docker 命令几乎相同。 您可以简单地替换 dockerpodman 在大多数 docker 命令中。 为了 example, 这 docker run 命令变成 podman rundocker build 变成 podman build 等等。

你甚至可以创建一个 docker 别名 podman 如下所示:

$ alias docker=podman

从现在开始,您可以同时使用 dockerpodman 同时命令。 为了 example如果你跑 docker ps,会自动执行 podman ps 命令。 从 Docker 过渡到 Podman 变得更加容易!

1. 获得 Podman 帮助

安装任何应用程序后,您可能想做的第一件事就是查看他们的帮助部分。

要查看 Podman 帮助手册以及可用子命令和常规选项的列表,请运行:

$ podman --help
显示 Podman 帮助部分

要了解任何子命令的用法,对于 example attach,只需执行以下操作:

$ podman attach --help

2. 搜索图片

幸运的是,Docker 和 Podman 创建的镜像都兼容 OCI 标准。 因此 Podman 可以从容器注册表中推送和拉取镜像,例如 码头工人中心码头.

让我们使用命令搜索 Alpine Linux 映像:

$ podman search alpine
使用 Podman 搜索图像

如您所见,Podman 列出了来自 Docker hub 和 Quay 的 Alpine 镜像。

下载图像时,您可以选择从哪里获取它们。

同样,您可以搜索基于 Arch Linux 的图像,如下所示:

$ podman search archlinux

Docker hub 和 Quay 有很多不同类型的镜像。 无论是应用程序还是操作系统,您都会从这些注册表中找到预构建的容器映像。

3.下载图片

出于本指南的目的,我将下载 Redhat 8 通用基础映像 (UBI)。

要使用 Podman 下载 Redhat 映像,请运行:

$ podman pull redhat/ubi8

系统将要求您选择要从中下载的容器注册表。 我选择了 Docker 集线器。 您将在所选注册表前面看到一个小箭头。

? Please select an image: 
    registry.fedoraproject.org/redhat/ubi8:latest
    registry.access.redhat.com/redhat/ubi8:latest
  ▸ docker.io/redhat/ubi8:latest
    quay.io/redhat/ubi8:latest

容器镜像将从所选的注册表中下载。

✔ docker.io/redhat/ubi8:latest

Trying to pull docker.io/redhat/ubi8:latest...
Getting image source signatures
Copying blob a50df8fd88fe done  
Copying blob 1cadda38f72d done  
Copying config 0ced1c7c9b done  
Writing manifest to image destination
Storing signatures
0ced1c7c9b23d0e107c7b15d5a0017abbbcf7e64e49a4c9f9efa1b9589ca8b68
使用 Podman 下载图像使用 Podman 下载图像

无论您使用哪种分发类型,您都可以下载和运行不同类型的图像。 为了 example,您可以下载并使用 Alpine 图像 Fedora 主机,反之亦然。

$ podman 拉高山

您甚至可以下载特定版本的图像。 以下命令下载 Ubuntu 版本 20.04 映像:

$ podman pull ubuntu:20.04

由于我们使用 Podman 作为非 root 用户,所以所有的容器镜像都存放在用户的主目录下,即 $HOME/.local/share/containers/storage, 代替 /var/lib/containers.

$ ls ~/.local/share/containers/storage/
cache  libpod  mounts  overlay  overlay-containers  overlay-images  overlay-layers  storage.lock  tmp  userns.lock

4.查看图片

要查看本地下载的图像列表,请运行:

$ podman 图片

样本输出:

REPOSITORY                TAG         IMAGE ID      CREATED      SIZE
docker.io/library/ubuntu  20.04       1318b700e415  7 days ago   75.2 MB
docker.io/redhat/ubi8     latest      0ced1c7c9b23  13 days ago  234 MB
docker.io/library/alpine  latest      d4ff818577bc  6 weeks ago  5.87 MB
使用 Podman 查看容器镜像使用 Podman 查看容器镜像

如您所见,上面的输出列出了我们下载图像的存储库名称、图像标签、图像 ID、创建图像的时间和图像大小。

对于那些想知道的人来说, 标签 指的是 Ubuntu 映像的特定快照(例如 20.04 和最新版本)。 TAG 只是本地图像的附加名称。 这 图像 ID (例如 1318b700e415 )是 Ubuntu 映像的唯一标识符。

5. 运行容器

可以使用图像标签或图像 ID 启动容器。

让我们使用它的标签启动一个带有 Redhat UBI 映像的新容器:

$ podman run -it ubi8:latest

此命令使用以下命令创建 Redhat 8 容器 ubi8:latest 图像并将容器连接到终端,以便您可以与之交互。

这里,

  • -i :允许我们通过抓取容器的(STDIN)中的标准来建立交互式连接。
  • -t :在 Redhat 8 容器内分配一个新的伪终端。
  • ubi8:latest :带有“最新”标签的 Redhat 8 容器。

启动容器后,您将自动进入容器的外壳(命令提示符):

使用 Podman 运行容器使用 Podman 运行容器

你注意到数字了吗 607a288c810d 在上面的输出中? 它是容器 ID。

小心: 请注意 容器 ID 和 Docker 镜像 ID 不同.

你现在可以开始玩你的容器了。

要返回主机的终端而不退出容器,请按 CTRL+p 其次是 CTRL+q.

现在您将从容器中分离并返回到主机的控制台。 容器仍将在后台运行。

要退出容器,只需键入 exit 从容器的控制台并按 ENTER 键:

# exit

此命令将关闭正在运行的容器。

如果要使用 IMAGE ID 运行容器,只需将前面命令中的映像 TAG (ubi8:latest) 替换为映像 ID (0ced1c7c9b23):

$ podman run -it 0ced1c7c9b23

这将启动 Redhat 8 容器。

6.在后台运行容器

您还可以在后台分离运行容器。

要以分离模式运行容器,我们使用 -d 旗帜:

$ podman run -it -d ubi8:latest

当我们以分离模式运行 Container 时,Podman 会在标准输出中显示 Container ID。

a4846b2454b1eb63e6d532b0f7ef4a05ca19f965caf9cd0d4a2ce17131a05e29

让我们使用命令验证正在运行的容器:

$ podman ps
使用 Podman 在后台运行容器使用 Podman 在后台运行容器

现在容器在后台运行。

您可以按照以下部分中的说明附加到它。

7. 连接和分离容器

如上一节所述,您可以通过按 CTRL+p 其次是 CTRL+q. 这将使您回到主机的终端。

要再次附加到 Container,首先使用 找到正在运行的 Container ID 或其名称 podman ps 命令:

$ podman ps

样本输出:

CONTAINER ID  IMAGE                         COMMAND     CREATED      STATUS          PORTS       NAMES
607a288c810d  docker.io/redhat/ubi8:latest  /bin/bash   2 hours ago  Up 2 hours ago              cool_cannon

这里, 607a288c810d 是容器 ID。

然后只需键入 podman attach 命令后跟容器 ID,如下所示:

$ podman attach 607a288c810d
使用 Podman 附加到容器使用 Podman 附加到容器

您还可以使用容器名称附加到它,如下所示:

$ podman attach cool_cannon

要从容器中分离,只需按 CTRL+pCTRL+q.

8.查看正在运行的容器

要查找或列出正在运行的容器,请键入:

$ podman ps

样本输出:

CONTAINER ID  IMAGE                            COMMAND     CREATED         STATUS             PORTS       NAMES
e783c0202b7d  docker.io/library/alpine:latest  /bin/sh     37 seconds ago  Up 38 seconds ago              optimistic_murdock

这只会列出正在运行的容器。 如果要列出正在运行和已停止的容器,请使用 -a 旗帜。

$ podman ps -a

样本输出:

CONTAINER ID  IMAGE                            COMMAND     CREATED         STATUS                         PORTS       NAMES
56c20497cbcd  docker.io/redhat/ubi8:latest     /bin/bash   3 hours ago     Exited (0) 3 hours ago                     wizardly_albattani
d23672b15cff  docker.io/redhat/ubi8:latest     /bin/bash   3 hours ago     Exited (0) 3 hours ago                     nifty_merkle
89b2c038e1ba  docker.io/redhat/ubi8:latest     /bin/bash   3 hours ago     Exited (0) 2 hours ago                     xenodochial_euler
607a288c810d  docker.io/redhat/ubi8:latest     /bin/bash   2 hours ago     Exited (0) About a minute ago              cool_cannon
e783c0202b7d  docker.io/library/alpine:latest  /bin/sh     43 seconds ago  Up 43 seconds ago                          optimistic_murdock
使用 Podman 查看正在运行和停止的容器使用 Podman 查看正在运行和停止的容器

9. 关闭容器后自动删除容器

您可能想测试一个容器,并在使用完容器后立即将其删除。 如果是这样,您可以在关闭容器后使用自动删除它 --rm 旗帜:

$ podman run -it --rm ubi8:latest

退出 Container 后,会自动删除。

10.启动和停止容器

如前所述,我们可以使用同一个镜像创建多个容器。 与物理机或虚拟机相比,这是容器的最大优势之一。

要创建多个新容器,我们可以使用 podman run 命令如中所述 “5. 运行容器” 部分。

要启动(启动)现有容器,我们只需执行以下操作:

$ podman start <container_name>

同样,我们可以使用以下命令停止(关闭)正在运行的命令:

$ podman stop <container_name>

让我给你看一个 example,所以你会更好地理解。

首先,找到所有 Container 的列表:

$ podman ps -a
CONTAINER ID  IMAGE                            COMMAND     CREATED         STATUS                     PORTS       NAMES
56c20497cbcd  docker.io/redhat/ubi8:latest     /bin/bash   2 days ago      Exited (0) 2 days ago                  wizardly_albattani
d23672b15cff  docker.io/redhat/ubi8:latest     /bin/bash   2 days ago      Exited (0) 2 days ago                  nifty_merkle
89b2c038e1ba  docker.io/redhat/ubi8:latest     /bin/bash   2 days ago      Exited (0) 2 days ago                  xenodochial_euler
607a288c810d  docker.io/redhat/ubi8:latest     /bin/bash   2 days ago      Exited (0) 2 days ago                  cool_cannon
e783c0202b7d  docker.io/library/alpine:latest  /bin/sh     2 days ago      Exited (0) 2 days ago                  optimistic_murdock

容器的名称显示在 名称 上述输出的部分(最后一列)。

我要启动名为 Container wizardly_albattani 使用命令:

$ podman start wizardly_albattani

让我们检查它是否启动:

$ podman ps
CONTAINER ID  IMAGE                         COMMAND     CREATED     STATUS            PORTS       NAMES
56c20497cbcd  docker.io/redhat/ubi8:latest  /bin/bash   2 days ago  Up 7 seconds ago              wizardly_albattani

是的,它是在 7 秒前启动的。

要停止容器,只需执行以下操作:

$ podman stop wizardly_albattani

11. 为容器分配名称

如果您仔细查看先前命令的输出,Podman 会在您每次启动容器时分配随机名称。 如果您不命名容器,Podman 会自动为您命名。

看看下面的截图。 我已经用相同的图像启动了同一个容器两次。 在我退出容器并第二次重新启动它后,即使我使用相同的图像,它也会获得新名称。

容器名称容器名称

每次我们之后,容器都会获得新名称 close 并每次启动它们。

但是,您可以为容器分配静态名称 --name 标志如下:

$ podman run -it -d --name ostechnix_redhat ubi8:latest

上面的命令将创建一个以分离模式运行的新容器并将其命名为 ostechnix_redhat.

要查看正在运行的容器列表,我们执行以下操作:

$播客ps

样本输出:

CONTAINER ID  IMAGE                         COMMAND     CREATED        STATUS            PORTS       NAMES
6fa78116dcb7  docker.io/redhat/ubi8:latest  /bin/bash   4 seconds ago  Up 5 seconds ago              ostechnix_redhat
使用 Podman 为容器分配名称使用 Podman 为容器分配名称

你注意到容器的名字了吗? 我们给了一个自定义名称(即 ostechnix_redhat) 到容器。

12.构建自定义图像

Podman 不仅仅用于从预配置的镜像下载和运行容器。 您还可以从现有图像构建您的自定义图像。

首先,启动一个现有的 Container 或运行一个新的。

我将创建一个新的 Ubuntu 容器:

$ podman run -it 1318b700e415

现在你在容器里面。

[email protected]:/#

只需安装、升级或删除容器中的任何应用程序。

出于本指南的目的,我将安装 Apache 网络服务器:

[email protected]:/# apt update
[email protected]:/# apt install apache2 -y
[email protected]:/# service apache2 start

完成后,从容器中分离并通过按返回主机的终端 CTRL+pCTRL+q.

请注意,容器仍在后台运行!

现在,使用命令从现有容器构建镜像:

$ podman commit b871b0fd5810 ostechnix/ubuntu_apache

这里,

  • b871b0fd5810 – Ubuntu 容器 ID。
  • ostechnix – 创建容器的用户的名称。
  • ubuntu_apache – 用户 ostechnix 创建的映像的名称。

现在通过列出可用图像来检查是否创建了新图像:

$ podman images

样本输出:

REPOSITORY                         TAG         IMAGE ID      CREATED         SIZE
localhost/ostechnix/ubuntu_apache  latest      6c9b2fb66400  25 seconds ago  222 MB
docker.io/library/ubuntu           20.04       1318b700e415  10 days ago     75.2 MB
docker.io/redhat/ubi8              latest      0ced1c7c9b23  2 weeks ago     234 MB
docker.io/library/alpine           latest      d4ff818577bc  7 weeks ago     5.87 MB
使用 Podman 构建自定义镜像使用 Podman 构建自定义镜像

正如您在上面的输出中看到的,一个名为 ubuntu_apache 被建造。

让我们用这个图像启动一个新的容器:

$ podman run -it --rm --name apache_webserver -p 8080:80 localhost/ostechnix/ubuntu_apache

在这里,我在前面的步骤中使用新创建的 Image 运行 Container。 我也在映射本地端口 8080 在本地系统上移植 80 容器内。

容器启动后,确保 Apache 使用以下命令启动 Web 服务器:

[email protected]:/# service apache2 start

现在,在主机系统中打开浏览器并导航到 https://localhost:8080 验证是否 Apache Web 服务器正在容器中运行。

Apache  在 Container 内运行的 Web 服务器测试页面Apache 在 Container 内运行的 Web 服务器测试页面

13.查看容器日志

要查看您在 Container 中所做的一切,您可以使用以下命令简单地检查 Container 的日志:

$ podman logs apache_webserver
使用 Podman 查看容器日志使用 Podman 查看容器日志

14. 移除容器

确保容器已停止:

$ podman stop ostechnix_redhat

停止容器后,使用命令将其删除:

$ podman rm ostechnix_redhat

同理,如上图一一删除所有Container。

如果您有大量容器,则一个一个删除多个容器可能是一项繁琐的任务。 您可以一次删除所有内容,而不是一个接一个地删除。 小心点! 无法恢复已删除的容器!

要一次性删除所有停止的容器,只需运行:

$ podman container prune

类型 "Y" 确认并点击 ENTER 删除容器的键。

WARNING! This will remove all non running containers.
Are you sure you want to continue? [y/N] y
2124a1fbc85a6be7d516e747723129bd7bb9c39d3a54951c9a81407d30ded1ab
54884f3375947026d4e87b99cb3a09e114c89120b101f5c8c1e614aca963975c
56c20497cbcdd9599c2fa729277ecf679ac29f79a0b06af3ae1a135726465ba7
607a288c810d2e605d9ba7590f8f7558ef5f96e87897a1cdde471ae9a74b36ad
69bbd87b44cb6c9a582749f4ad010b6b273e65f9fe424058fdc0bc55b188d7e4
89b2c038e1baf6ac59f0da8e43a7efedc7ba73a18ed8d704c879ffdbc7eb7f28
a4846b2454b1eb63e6d532b0f7ef4a05ca19f965caf9cd0d4a2ce17131a05e29
aa14879baf0919323730539dd949231d5bb89ca4207dd36c02a741316e6d0f18
b871b0fd5810f55e75bdd480d5fb34b09b0e293604f88896002a9368a607bf7e
d23672b15cffc0a774227dc6b457a8bff5347073a112f6729d63ddf400f19dc7
e783c0202b7d7a6664e731feeff4bdb57a79df79080046ed2b728df4bce789d2
ebfd6210a6beedce43af0c41296e329d416128752ab603abd44c73117bf5dfd0

15.删除图像

您可以删除不再需要的图像!

使用命令列出所有下载的图像:

$ podman images

样本输出:

REPOSITORY                         TAG         IMAGE ID      CREATED         SIZE
localhost/ostechnix/ubuntu_apache  latest      6c9b2fb66400  37 minutes ago  222 MB
docker.io/library/ubuntu           20.04       1318b700e415  10 days ago     75.2 MB
docker.io/redhat/ubi8              latest      0ced1c7c9b23  2 weeks ago     234 MB
docker.io/library/alpine           latest      d4ff818577bc  7 weeks ago     5.87 MB

现在,使用图像 ID 或名称删除图像,如下所示:

$ podman rmi 6c9b2fb66400

样本输出:

Untagged: localhost/ostechnix/ubuntu_apache:latest
Deleted: 6c9b2fb66400138738ad12643d8461fbbb859f33d3be3c35181bb9ee9b11748d

同样,删除所有其他未使用的图像,

小心: 您无法删除正在运行或已停止的容器当前正在使用的映像。

结论

在这个全面的 Podman 教程中,我们提供了 15 个关于如何在 Linux 中开始使用 Podman 的实际示例。 如果您是开发人员,学习 Podman 对您的职业发展非常重要。 彻底学会使用 Podman。 值得你花时间!

资源:

相关阅读:

  • 开始使用 Toolbox Fedora 银蓝
  • Vagrant 教程 – 在 Linux 中开始使用 Vagrant