网站搜索

如何在 RHEL 8 中使用 Podman 和 Skopeo 管理容器


开发人员过去面临的挑战之一是让应用程序在多个计算环境中可靠运行。通常,应用程序不会按预期运行或遇到错误并完全失败。这就是容器概念的诞生。

什么是容器镜像?

容器映像是静态文件,附带在隔离环境中运行的可执行代码。容器映像包含应用程序在不同环境中运行所需的系统库、依赖项和其他平台设置。

Red Hat Linux 提供了一组有用的容器工具,您可以利用这些工具使用需要的 docker 命令直接使用 Linux 容器。这些包括:

  • Podman – 这是一个无守护程序的容器引擎,用于在根或无根模式下运行和管理 OCI 容器。 PodmanDocker 类似,具有相同的命令选项,只不过 Docker 是一个守护进程。您可以使用 podman 拉取、运行和管理容器映像,其方式与使用 Docker 的方式大致相同。 Podman 具有许多高级功能,与系统完全集成,并提供用户命名空间支持,其中包括无需 root 用户即可运行容器。
  • Skopeo:这是一种命令行工具,用于将容器映像从一个注册表复制到另一个注册表。您可以使用Skopeo将映像复制到特定主机或从特定主机复制映像,以及将映像复制到另一个容器注册表或环境。除了复制图像之外,您还可以使用它来检查来自各个注册表的图像并使用签名来创建和验证图像。
  • Buildah:这是一组命令行工具,用于使用 Docker 文件创建和管理容器 OCI 映像。

在本文中,我们将重点介绍使用 podmanSkopeo 管理容器。

从远程注册表搜索容器镜像

podman search 命令允许您在选定的远程注册表中搜索容器映像。默认的注册表列表是在 /etc/containers/ 目录中的 registries.conf 文件中定义的。

注册表由 3 个部分定义。

  • [registries.search] – 此部分指定 podman 可以搜索容器映像的默认注册表。它在 registry.access.redhat.comregistry.redhat.iodocker.io 注册表中搜索请求的映像。

  • [registries.insecure] – 此部分指定未实施 TLS 加密的注册表,即不安全的注册表。默认情况下,不指定任何条目。

  • [registries.block] – 这会阻止或拒绝从本地系统访问指定的注册表。默认情况下,不指定任何条目。

作为运行 podman 命令的常规(非 root)用户,您可以在主目录 ($HOME/.config) 上定义自己的 registries.conf 文件/containers/registries.conf)来覆盖系统范围的设置。

指定注册表时的规则

在指定注册表时,请记住以下几点:

  • 每个注册表都应该用单引号引起来。
  • 可以使用主机名或 IP 地址指定注册表。
  • 如果指定了多个注册表,则应使用逗号分隔它们。
  • 如果注册表使用非标准端口(端口 TCP 端口 443 表示安全,端口 80 表示不安全),则应在注册表名称旁边指定端口号,例如registry.example.com:5566

要使用以下语法在注册表中搜索容器映像:

podman search registry/container_image

例如,要在 registry.redhat.io 注册表中搜索 Redis 映像,请调用以下命令:

podman search registry.redhat.io/redis

要搜索 MariaDB 容器映像,请运行。

podman search registry.redhat.io/mariadb

要获取容器映像的详细描述,请在获得的结果中的容器映像名称之前使用 --no-trunc 选项。例如,我们将尝试获取 MariaDB 容器镜像的详细描述,如下所示:

podman search --no-trunc registry.redhat.io/rhel8/mariadb-103

拉取容器镜像

从远程注册表拉取或检索容器映像要求您首先进行身份验证,然后再进行其他操作。例如,要检索 MariaDB 容器映像,请首先登录 Redhat 注册表:

podman login

提供您的用户名和密码,然后按键盘上的“ENTER”。如果一切顺利,您应该会收到一条确认消息,表明登录注册表已成功。

Login Succeeded!

现在,您可以使用所示语法拉取图像:

podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

<registry> 指的是在 TCP <port> 上提供容器映像存储库的远程主机或注册表。 <namespace><name> 共同指定基于注册表中的 <namespace> 的容器映像。最后,<tag>选项指定容器镜像的版本。如果未指定,则使用默认标签 - 最新 -。

始终建议添加受信任的注册表,即提供加密且不允许匿名用户生成具有随机名称的帐户的注册表。

要拉取 MariaDB 映像,请运行以下命令:

podman pull registry.redhat.io/rhel8/mariadb-103
  • <registry> –registry.redhat.io
  • <namespace> – rhel8
  • <name> – MariaDB
  • <tag> – 103

对于后续的容器镜像拉取,无需进一步登录,因为您已经通过身份验证。要提取 Redis 容器映像,只需运行:

podman pull registry.redhat.io/rhscl/redis-5-rhel7

列出容器镜像

完成拉取镜像后,您可以通过运行 podman images 命令查看主机上当前存在的镜像。

podman images

检查容器镜像

在运行容器之前,最好先探测一下镜像并了解它的作用。 podmanspect 命令打印出有关容器的大量元数据,例如操作系统和架构。

要检查映像,请运行 podmanspect 命令,后跟映像 ID 或存储库。

podman inspect IMAGE ID
OR
podman inspect REPOSITORY

在下面的示例中,我们正在检查 MariaDB 容器。

podman inspect registry.redhat.io/rhel8/mariadb-103

要提取容器的特定元数据,请传递 --format 选项,后跟元数据和容器标识(图像 ID 或名称)。

在下面的示例中,我们检索有关 RHEL 8 基础容器的架构和描述的信息,该容器属于“标签”部分。

podman inspect --format=’{{.Labels.architecture}}’ image ID
podman inspect --format=’{{.Labels.description}}’ image ID

要检查来自另一个注册表的远程映像,请使用 skopeo inform 命令。在下面的示例中,我们正在检查 Docker 上托管的 RHEL 8 init 映像。

skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init

标记容器镜像

正如您可能已经注意到的,图像名称本质上通常是通用的。例如,redis镜像被标记为:

registry.redhat.io/rhscl/redis-5-rhel7

标记图像可以为它们提供更直观的名称,以便更好地理解它们包含的内容。使用podman tag命令,您可以创建一个镜像标签,它本质上是由不同部分组成的镜像名称的别名。

这些都是:

registry/username/NAME:tag

例如,要更改 ID 为 646f2730318c 的 Redis 镜像的通用名称,我们将执行以下命令:

podman tag 646f2730318c myredis

要在末尾添加标签,请在后面添加一个完整的冒号,后跟标签编号:

podman tag 646f2730318c myredis:5.0

不添加标签号,只会为其分配最新属性。

运行容器镜像

要运行容器,请使用 podman run 命令。例如:

podman run image_id

要在后台以守护程序服务的方式静默运行容器,请使用 -d 选项,如图所示。

podman run -d image_id

例如,要运行 ID 为 646f2730318credis 镜像,我们将调用以下命令:

podman run -d 646f2730318c

如果您正在运行基于 RHEL 8 基础映像等操作系统的容器,则可以使用 -it 指令访问 shell。 -i 选项创建交互式会话,而 -t 则生成终端会话。 --name 选项将容器名称设置为 mybash,而 是基础镜像的 ecbc6f53bba0 镜像 ID。

podman run -it --name=mybash ecbc6f53bba0

此后,您可以运行任何 shell 命令。在下面的示例中,我们正在验证容器映像的操作系统版本。

cat /etc/os-release

要退出容器,只需调用 exit 命令即可。

exit

一旦容器退出,它就会自动停止。要再次启动容器,请使用带有 -ai 标志的 podman start 命令,如下所示。

podman start -ai mybash

您将再次获得对 shell 的访问权限。

列出正在运行的容器镜像

要列出当前正在运行的容器,请使用 podman ps 命令,如下所示。

podman ps

要查看所有容器,包括运行后退出的容器,请使用以下命令:

podman ps -a

配置容器镜像在Systemd服务下自动启动

在本节中,我们重点讨论如何将容器配置为直接在 RHEL 系统上作为 systemd 服务运行。

首先,获取您喜欢的图像。在本例中,我们从 docker hub 中提取了 Redis 镜像:

podman pull docker.io/redis

如果您的系统上正在运行 SELinux,则需要激活 container_manage_cgroup 布尔值才能使用 systemd 运行容器。

setsebool -p container_manage_cgroup on

此后,在后台运行容器映像并将其分配给您首选的映像名称。在此示例中,我们将映像命名为 redis_server 并将端口 6379 从容器映射到我们的 RHEL 8 主机

podman run -d --name redis_server -p 6379:6379 redis

接下来,我们将在 /etc/systemd/system/ 目录中为 redis 创建一个 systemd 单元配置文件。

vim /etc/systemd/system/redis-container.service

将以下内容粘贴到文件中。

[Unit]
Description=Redis container

[Service]
Restart=always
ExecStart=/usr/bin/podman start -a redis_server
ExecStop=/usr/bin/podman stop -t 2 redis_server

[Install]
WantedBy=local.target

保存并退出文件。

接下来,将容器配置为在启动时自动启动。

systemctl enable redis-container.service

接下来,启动容器并验证其运行状态。

systemctl start redis-container.service
systemctl status redis-container.service

为容器镜像配置持久存储

运行容器时,谨慎的做法是在主机上配置持久外部存储。这可以在容器崩溃或意外删除时提供备份。

为了保留数据,我们将把主机中的目录映射到容器内的目录。

podman run --privileged -it -v /var/lib/containers/backup_storage:/mnt registry.redhat.io/ubi8/ubi /bin/bash

SELinux 设置为强制时,会传递 --privileged 选项。 -v 选项指定位于主机上的外部卷。这里的容器卷是/mnt目录。

访问 shell 后,我们将在 /mnt 目录中创建一个示例文件 testing.txt,如图所示。

echo "This tests persistent external storage" > /mnt/testing.txt

然后,我们将退出容器并检查该文件是否存在于主机上的外部存储中

exit
cat /var/lib/containers/backup_storage/testing.txt

输出这测试持久性外部存储

停止和移除容器

容器运行完毕后,您可以使用 podman stop 命令停止它,后跟 container-id,您可以从 podman ps< 命令。

podman stop container-id

要删除不再需要的容器,首先请确保停止它,然后调用 podman rm 命令,后跟容器 ID 或名称作为选项。

podman rm container-id

要在一个命令中一次性删除多个容器,请指定容器 ids,并用空格分隔。

podman rm container-id-1 container-id-2 container-id-3

要清除所有容器,请运行以下命令:

podman rm -a

删除图像

要删除映像,首先,请确保从映像生成的所有容器都已停止并删除,如上一个子主题中所述。

接下来,继续运行 podman -rmi 命令,后跟镜像 ID,如下所示:

podman -rmi image-id

结论

关于在 RHEL 8 中管理和使用容器的本章就到此结束。我们希望本指南能让您更好地了解容器以及如何使用 podmanSkopeoRHEL 系统上交互和管理它们。