构建、运行和管理容器
在 Red Hat Enterprise Linux 上使用 Podman、Buildah 和 Skopeo
摘要
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 在顶部导航栏中点 Create
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 容器简介 复制链接链接已复制到粘贴板!
Linux 容器已逐渐成为一种关键的开源应用程序打包和交付技术,将轻量级应用程序隔离与基于镜像的部署方法的灵活性相结合。Red Hat Enterprise Linux 使用核心技术实现 Linux 容器,例如:
- 控制组(cgroups)用于资源管理
- 命名空间(namespace)用于进程隔离
- SELinux 用于安全性
- 安全多租户
这些技术降低了安全漏洞的可能性,并为您提供了生成和运行企业级容器的环境。
Red Hat OpenShift 提供了强大的命令行和 Web UI 工具,用于以称为 pod 的单元形式构建、管理和运行容器。红帽允许您在 OpenShift 之外构建和管理单个容器和容器镜像。本指南描述了提供的直接在 Red Hat Enterprise Linux 系统上运行这些任务的工具。
与其他容器工具实现不同,这里描述的工具不以单一的 Docker 容器引擎和 docker 命令为中心。相反,红帽提供了一组命令行工具,无需容器引擎即可操作。它们是:
-
podman - 用于直接管理 pod 和容器镜像(
run、stop、start、ps、attach和exec,等等) - buildah - 用于构建、推送和签名容器镜像
- skopeo - 用于复制、检查、删除和签名镜像
- runc - 为 podman 和 buildah 提供容器运行和构建功能
- crun - 可选运行时,可以配置,并为 rootless 容器提供更大的灵活性、控制和安全性
除了这些工具外,您还可以使用 Podman Desktop,即基于 GUI 的应用程序进行容器管理。Podman Desktop 基于 Podman 构建,可以轻松地以可视方式创建、管理和运行容器化应用程序。
由于这些工具与开放容器项目(OCI)兼容,因此它们可用于管理由 Docker 和其他兼容 OCI 的容器引擎生成和管理的相同的 Linux 容器。然而,它们特别适用于直接在 Red Hat Enterprise Linux 中运行在单节点用例。
如需多节点容器平台,请参阅 OpenShift 和 使用 CRI-O 容器引擎 以了解详细信息。
1.1. Podman、Podman Desktop、Buildah 和 Skopeo 的特性 复制链接链接已复制到粘贴板!
Podman、Podman Desktop、Skopeo 和 Buildah 工具被开发来取代 Docker 命令功能。这种场景中的每个工具都是非常轻量级的,并专注于功能的子集。
Podman、Podman Desktop、Skopeo 和 Buildah 工具的主要优点包括:
- 以无根模式运行 - rootless 容器更安全,因为它们在运行时不需要添加任何特权
- 不需要守护进程 - 这些工具在空闲时对资源的要求要低得多,因为如果您没有运行容器,Podman 就不会运行。相反,Docker 有一个守护进程一直在运行
-
原生
systemd集成 - Podman 允许您创建systemd单元文件,并作为系统服务运行容器
Podman、Podman Desktop、Skopeo 和 Buildah 的特性包括:
-
Podman、Buildah 和 CRI-O 容器引擎都使用相同的后端存储目录,
/var/lib/containers,而不是默认使用 Docker 存储位置/var/lib/docker。 - 虽然 Podman、Buildah 和 CRI-O 共享相同的存储目录,但它们不能相互交互。这些工具可以共享镜像。
- 要以编程方式与 Podman 进行交互,您可以使用 Podman v2.0 RESTful API,它可以在有根和无根的环境中工作。如需更多信息,请参阅 使用 container-tools API 章节。
- Podman Desktop 提供了一个简单直观的界面,用于在 Podman 引擎上运行应用程序工作负载。
1.2. 不使用 Docker 运行容器 复制链接链接已复制到粘贴板!
红帽删除了 RHEL 8 中的 Docker 容器引擎和 docker 命令。
如果您仍然希望在 RHEL 中使用 Docker,您可以从不同的上游项目中获取 Docker,但其在 RHEL 10 中不支持。
-
您可以安装
podman-docker软件包,每次运行docker命令时,它实际上是运行podman命令。 -
Podman 还支持 Docker Socket API,因此
podman-docker软件包还在/var/run/docker.sock和/var/run/podman/podman.sock之间建立了一个链接。因此,您可以继续使用docker-py和docker-compose工具运行 Docker API 命令,而无需 Docker 守护进程。Podman 将为请求提供服务。 -
podman命令和docker命令一样,可以Containerfile或Dockerfile构建容器镜像。可以在Containerfile和Dockerfile中使用的命令一样。 -
podman不支持的docker命令选项包括 network、node、plugin(podman不支持插件)、rename(podman使用 rm 和 create 来重命名容器)、secret、service、stack 和 swarm(podman不支持 Docker Swarm)。容器和镜像选项用于运行直接在podman中使用的子命令。
1.3. RHEL 中支持的用于容器部署的架构 复制链接链接已复制到粘贴板!
红帽为以下计算机架构提供容器镜像和容器相关的软件:
- AMD64 和 Intel 64(基础镜像和分层镜像;不支持 32 位构架)
- PowerPC 8 和 9 64 位(基本镜像和大部分层次镜像)
- 64 位 IBM Z(基本镜像和大多数层次镜像)
- ARM 64-bit(仅用于基础镜像)
虽然还没有在所有构架中都首先支持所有红帽镜像,但几乎所有镜像现在都包含在所有列出的构架中。
1.4. 安装容器工具 复制链接链接已复制到粘贴板!
此流程演示了如何安装 container-tools meta-package,其中包含 Podman、Buildah、Skopeo、CRIU、Udica 以及所有必需的库。
RHEL 9 不提供 stable 流。要获得对 Podman 的稳定访问、Buildah、Skopeo 等,请使用 RHEL EUS 订阅。
流程
- 安装 RHEL。
注册 RHEL:输入您的用户名和密码。用户名和密码与您红帽客户门户网站的登录凭证相同:
subscription-manager register Registering to: subscription.rhsm.redhat.com:443/subscription Username: <username> Password: <password>
# subscription-manager register Registering to: subscription.rhsm.redhat.com:443/subscription Username: <username> Password: <password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 订阅 RHEL。
要自动订阅 RHEL:
subscription-manager attach --auto
# subscription-manager attach --autoCopy to Clipboard Copied! Toggle word wrap Toggle overflow
安装
container-toolsmeta-package:dnf install container-tools
# dnf install container-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您愿意,您也可以单独安装
podman、buildah和skopeo。可选:安装
podman-docker软件包:dnf install podman-docker
# dnf install podman-dockerCopy to Clipboard Copied! Toggle word wrap Toggle overflow podman-docker软件包使用匹配的 Podman 命令替换 Docker 命令行界面和docker-api。
1.5. 安装 Podman 桌面 复制链接链接已复制到粘贴板!
Podman Desktop 可帮助开发人员执行日常开发任务,并视觉化其开发环境,如运行的 pod 或容器的数量。您可以在三个不同的操作系统中运行此工具:macOS、Windows 和 Linux。Podman Desktop 在 Podman 引擎上运行工作负载,因此为您提供了与容器化应用程序交互的 Podman 原生功能。作为开发者,您可以:
- 创建和管理容器或 pod
- 管理容器镜像
- 使用 Kind、Lima、Minikube 或 OpenShift 将容器或 pod 部署到 Kubernetes
- 管理 Docker 兼容性,以在 Podman 引擎上运行 Docker 工作负载
- 使用扩展集成您的工具
要安装,请使用 RHEL 10 机器上的订阅管理器软件包。
先决条件
- 您有一个 RHEL 10 机器。
-
已使用帐户详细信息或 激活密钥,通过
subscription-manager注册。https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/assembly_registering-the-system-and-managing-subscriptions_configuring-basic-system-settings#registering-a-system-by-using-the-command-line_assembly_registering-the-system-and-managing-subscriptions
流程
打开终端,并启用 RHEL extensions 存储库:
subscription-manager repos --enable rhel-10-for-$(arch)-extensions-rpms
# subscription-manager repos --enable rhel-10-for-$(arch)-extensions-rpmsCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 提示时输入您的密码。
安装 Podman 桌面:
dnf install podman-desktop
# dnf install podman-desktopCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
输入
y以确认安装的大小。 -
输入
y导入 GPG 密钥并完成安装。
验证
- 在主页屏幕顶部的搜索框中输入 Podman Desktop,然后单击 Podman Desktop 应用程序来打开它。
- 按照提示完成应用程序快速加入过程。
Podman 包含在 RHEL 订阅中,应用程序会自动检测并运行它。
后续步骤
执行基本任务,例如:
1.6. 对 rootless 容器的特别考虑 复制链接链接已复制到粘贴板!
以非 root 用户身份运行容器时,需要考虑以下事项:
-
对于 root 用户(
/var/lib/containers/storage)和非 root 用户($HOME/.local/share/containers/storage),主机容器存储的路径是不同的。 - 运行无根容器的用户被授予在主机系统上作为用户和组群 ID 运行的特殊权限。但是,它们对主机上的操作系统没有 root 特权。
-
如果您手动更改
/etc/subuid或/etc/subgid,则必须运行podman system migrate命令,以允许应用新的更改。 -
如果您需要配置 rootless 容器环境,请在主目录(
$HOME/.config/containers)中创建配置文件。配置文件包括storage.conf(用于配置存储)和containers.conf(用于各种容器设置)。您还可以创建registry.conf文件,以标识使用 Podman 进行拉取、搜索或运行镜像时可用的容器注册表。 有些系统功能在没有 root 特权的情况下无法更改。例如,您无法通过在容器内设置
SYS_TIME功能并运行网络时间服务(ntpd)来更改系统时钟。您必须以 root 用户身份运行该容器,绕过 rootless 容器环境,并使用 root 用户的环境。例如:podman run -d --cap-add SYS_TIME ntpd
# podman run -d --cap-add SYS_TIME ntpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个示例允许
ntpd为整个系统调整时间,而不只是在容器内调整。rootless 容器无法访问端口号小于 1024 的端口。在 rootless 容器命名空间中,它可以启动一个服务,该服务从容器中公开 httpd 服务的端口 80 ,但它不能在命名空间外访问:
podman run -d httpd
$ podman run -d httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 但是,容器需要 root 权限,使用 root 用户的容器环境向主机系统公开该端口:
podman run -d -p 80:80 httpd
# podman run -d -p 80:80 httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 工作站的管理员可以允许用户在编号低于 1024 的端口上公开服务,但他们应了解安全隐患。例如,普通用户可以在官方端口 80 上运行 Web 服务器,并让外部用户认为它是由管理员配置的。在工作站上进行测试是可以接受的,但在网络可访问的开发服务器上可能不是一个好主意,绝对不应该在生产服务器上这样做。要允许用户将端口绑定到 80 以下的端口,请运行以下命令:
echo 80 > /proc/sys/net/ipv4/ip_unprivileged_port_start
# echo 80 > /proc/sys/net/ipv4/ip_unprivileged_port_startCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.7. 使用模块进行高级 Podman 配置 复制链接链接已复制到粘贴板!
您可以使用 Podman 模块加载预定的一组配置。Podman 模块是 Tom 的 Obvious Minimal Language (TOML)格式的 containers.conf 文件。
这些模块位于以下目录或其子目录中:
-
对于无根用户:
$HOME/.config/containers/containers.conf.modules -
对于 root 用户:
/etc/containers/containers.conf.modules或/usr/share/containers/containers.conf.modules
您可以使用 podman --module <your_module_name> 命令按需加载模块,以覆盖系统和用户配置文件。使用模块涉及以下事实:
-
您可以使用
--module选项多次指定模块。 -
如果
<your_module_name>是绝对路径,则配置文件将被直接加载。 - 相对路径是相对于前面提到的三个模块目录而解析的。
-
$HOME中的模块覆盖/etc/和/usr/share/目录中的模块。
如需更多信息,请参阅系统中的 containers.conf (5) 手册页。
第 2 章 容器镜像的类型 复制链接链接已复制到粘贴板!
容器镜像是一个二进制文件,其中包含运行单个容器的所有需求,以及描述其需求和功能的元数据。
容器镜像有两种类型:
- Red Hat Enterprise Linux 基础镜像(RHEL 基础镜像)
- 红帽通用基础镜像(UBI 镜像)
这两种类型的容器镜像都是从 Red Hat Enterprise Linux 的部分内容构建的。通过使用这些容器,用户可以从出色的可靠性、安全性、性能和生命周期中受益。
两种容器镜像的主要区别在于 UBI 镜像允许您与其他人共享容器镜像。您可以使用 UBI 构建容器化的应用程序,将其推送到您选择的注册服务器,与他人轻松共享,甚至将其部署在非红帽平台上。UBI 镜像被设计成在容器中开发的云原生和 Web 应用程序用例的基础。
2.1. RHEL 容器镜像的一般特征 复制链接链接已复制到粘贴板!
以下特征适用于 RHEL 基础镜像和 UBI 镜像。
通常,RHEL 容器镜像是:
2.2. UBI 镜像的特点 复制链接链接已复制到粘贴板!
UBI 镜像允许您与他人共享容器镜像。提供四个 UBI 镜像:micro、min、standard 和 init。预构建语言运行时镜像和 DNF 存储库可用于构建应用程序。
以下特点适用于 UBI 镜像:
- 基于 RHEL 内容的子集构建: 红帽通用基础镜像由普通 Red Hat Enterprise Linux 内容的子集构建。
- 可重新分发 :UBI 镜像允许对红帽客户、合作伙伴、ISV 和其他人进行标准化。使用 UBI 镜像,您可以在可自由共享和部署的官方红帽软件的基础上构建容器镜像。
- 提供一组四个基础镜像 :micro、minima、standard 和 init。
- 提供一组预构建的语言运行时容器镜像 :基于 Application Streams 的运行时镜像为应用程序提供了一个基础,可从标准的、支持的运行时,如 python、perl、php、php、nodejs 和 ruby 中受益。
提供一组关联的 DNF 存储库 :DNF 存储库包括允许您添加应用程序依赖项并重建 UBI 容器镜像的 RPM 软件包和更新。
-
ubi-10-baseos存储库保存了您可以在容器中包含的可重新分发的 RHEL 软件包的子集。 -
ubi-10-appstream存储库保存了您可以将其添加到 UBI 镜像中的应用程序流软件包,以帮助您使用需要特定运行时的应用程序来标准化环境。 -
添加 UBI RPM:您可以从预先配置的 UBI 软件仓库将 RPM 软件包添加到 UBI 镜像中。如果您恰好处于断开连接的环境中,您必须将 UBI Content Delivery Network (
https://cdn-ubi.redhat.com)放入 allowlist 来使用该功能。详情请查看 Connect to https://cdn-ubi.redhat.com。
-
- 许可证:可以使用并重新分发 UBI 镜像,,遵循 Red Hat Universal Base Image End User Licensing Agreement。
所有层次的镜像都基于 UBI 镜像。要检查您的镜像是基于哪个 UBI 镜像,请在 红帽容器目录 中显示 Containerfile,并确保 UBI 镜像包含所有需要的内容。
2.3. 了解 UBI 标准镜像 复制链接链接已复制到粘贴板!
标准镜像(名为 ubi)专为在 RHEL 上运行的任何应用程序而设计。UBI 标准镜像的主要功能包括:
-
init system :您管理
systemd服务所需的systemd初始化系统的所有功能都在标准基础镜像中提供。这些 init 系统可让您安装预配置的 RPM 软件包来自动启动服务,如 Web 服务器(httpd)或 FTP 服务器(vsftpd)。 -
dnf :您可以访问免费 DNF 存储库来添加和更新软件。您可以使用
dnf命令的标准集合(dnf、dnf-config-manager、dnfdownloader等等)。 -
工具 :工具包括
tar、dmidecode、gzip、getfacl和其他 ACL 命令、dmsetup和其他未来的设备映射器命令,以及此处未提及的其他工具。
2.4. 了解 UBI init 镜像 复制链接链接已复制到粘贴板!
UBI init 镜像(名为 ubi-init )包含 systemd 初始化系统,这有助于构建您要在其中运行 systemd 服务的镜像,如 Web 服务器或文件服务器。init 镜像包含的内容比最小镜像多,但比标准镜像少。
由于 ubi10-init 镜像构建在 ubi10 镜像之上,因此它们的内容基本相同。但是,有几个关键的区别:
ubi10-init:-
CMD 设置为
/sbin/init,以默认启动systemdInit 服务 -
包括
ps和进程相关的命令(procps-ng软件包) -
将
SIGRTMIN+3设为StopSignal,因为ubi10-init中的systemd会忽略正常信号退出(SIGTERM和SIGKILL),但如果它收到SIGRTMIN+3,则会终止
-
CMD 设置为
ubi10:-
CMD 设为
/bin/bash -
不包含
ps和进程相关的命令(procps-ng软件包) -
不要忽略正常信号退出(
SIGTERM和SIGKILL)
-
CMD 设为
2.5. 了解 UBI 最小镜像 复制链接链接已复制到粘贴板!
UBI 最小镜像(名为 ubi-minimal )提供最小的预安装的内容集和软件包管理器(microdnf)。因此,您可以在最小化镜像中包含的依赖项时使用 Containerfile。
UBI 最小镜像的主要功能包括:
- 小尺寸 :最小映像在磁盘上约 92M,压缩时为 32M。这比标准镜像小了多一半。
-
软件安装(
microdnf) :最小镜像包括microdnf工具,而不是包括用于软件存储库和 RPM 软件包的完全开发的dnf工具。microdnf是dnf的缩小版,允许您启用和禁用存储库,删除和更新软件包,并在安装软件包后清除缓存。 -
基于 RHEL 打包 :最小映像包含常规的 RHEL 软件 RPM 软件包,但删除了一些功能。最小镜像不包括初始化和服务管理系统,如
systemd或 System V init、Python 运行时环境和一些 shell 工具。您可以依赖 RHEL 存储库来构建镜像,同时承担尽可能少的开销。 支持
microdnf的模块:microdnf命令所使用的模块可让您安装同一软件的多个版本(如果提供的话)。您可以使用microdnf module enable、microdnf module disable和microdnf module reset来分别启用、禁用和重置模块流。例如,要在 UBI 最小容器中启用
nodejs:14模块流,请输入:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
红帽只支持 UBI 的最新版本,不支持在点版本上的 parking。如果您需要在特定的点版上进行 park ,请参阅 延长更新支持。
2.6. 了解 UBI 微镜像 复制链接链接已复制到粘贴板!
ubi-micro 可能是最小的 UBI 镜像,通过去掉软件包管理器及通常包含在容器镜像中的所有依赖项而得到。这可最小化基于 ubi-micro 镜像的容器镜像的攻击面,并适用于最小的应用程序,即使您对其他应用程序使用 UBI Standard、Minimal 或 Init。没有 Linux 发行包的容器镜像称为 Distroless 容器镜像。
第 3 章 使用容器注册中心 复制链接链接已复制到粘贴板!
容器镜像注册中心是用于存储容器镜像和基于容器的应用程序工件的存储库或存储库集合。/etc/containers/registries.conf 文件是一个系统范围的配置文件,其中包含可供各种容器工具(如 Podman、Buildah 和 Skopeo)使用的容器镜像注册中心。
如果提供给容器工具的容器镜像不是完全限定的,则容器工具会引用 registry.conf 文件。在 registry.conf 文件中,您可以为短名称指定别名,在未完全限定时,授予管理员完全控制从哪里拉取镜像。例如,podman pull example.com/example_image 命令将容器镜像从 example.com 注册中心拉取一个容器镜像到本地系统,如 registry.conf 文件中指定的那样。
3.1. 容器注册中心 复制链接链接已复制到粘贴板!
容器注册表是用来存储容器镜像和基于容器的应用工件的存储库或存储库的集合。红帽提供的注册表是:
- registry.redhat.io (需要身份验证)
- registry.access.redhat.com(不需要身份验证)
- registry.connect.redhat.com(保存 Red Hat Partner Connect 程序镜像)
要从远程注册表(如红帽自己的容器注册表)获取容器镜像,并将其添加到本地系统中,请使用 podman pull 命令:
podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
# podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
其中 <registry>[:<port>]/[<namespace>/]<name>:<tag> 是容器镜像的名称。
例如,registry.redhat.io/ubi10/ubi 容器镜像由以下标识:
-
注册中心服务器(
registry.redhat.io) -
命名空间(
ubi10) -
镜像名称(
ubi)
如果同一镜像有多个版本,则请添加一个标签来明确指定镜像名称。默认情况下,Podman 使用 :latest 标签,如 ubi10/ubi:latest。
有些注册表也使用 <namespace> 来区分不同用户或机构所拥有的具有相同 <name> 的镜像。例如:
| 命名空间 | 示例(<namespace>/<name>) |
|---|---|
| 机构 |
|
| login(用户名) |
|
| role |
|
使用包括注册中心、命名空间、镜像名称和标签的完全限定镜像名称。在使用短名称时,通常会存在欺骗风险。添加受信任的注册表,也就是不允许未知或匿名用户创建任意名称帐户的注册表。例如,用户希望从 example.registry.com registry 中拉取示例容器镜像。如果 example.registry.com 不是搜索列表中的第一个,则攻击者可以将不同的示例镜像放在搜索列表较前的注册中心中。用户会意外拉取并运行攻击者的镜像,而不是预期的内容。
有关转换到 registry.redhat.io 的详情,请参阅 Red Hat Container Registry Authentication 。在从 registry.redhat.io 拉取容器前,您需要使用 RHEL 订阅凭证进行身份验证。
3.2. 配置容器注册表 复制链接链接已复制到粘贴板!
您可以使用 podman info --format 命令显示容器注册中心:
podman info 命令在 Podman 4.0.0 或更高版本中提供。
您可以编辑 registries.conf 配置文件中容器注册中心的列表。以 root 用户身份,编辑 /etc/containers/registries.conf 文件,来更改默认的系统范围的搜索设置。
以用户身份,创建 $HOME/.config/containers/registries.conf 文件来覆盖系统范围的设置。
unqualified-search-registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"] short-name-mode = "enforcing"
unqualified-search-registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"]
short-name-mode = "enforcing"
默认情况下,podman pull 和 podman search 命令以指定顺序在 unqualified-search-registries 列表中列出的注册表中搜索容器镜像。
- 配置本地容器注册中心
您可以配置没有 TLS 验证的本地容器注册中心。关于如何禁用 TLS 验证,您有两个选项。首先,您可以在 Podman 中使用
--tls-verify=false选项。其次,您可以在registry.conf文件中设置insecure=true:[[registry]] location="localhost:5000" insecure=true
[[registry]] location="localhost:5000" insecure=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 阻止注册中心、命名空间或镜像
您可以定义不允许本地系统访问的注册表。您可以通过设置
blocked=true来阻止特定的注册中心。[[registry]] location = "registry.example.org" blocked = true
[[registry]] location = "registry.example.org" blocked = trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您也可以通过设置前缀
prefix="registry.example.org/namespace"来阻止命名空间。例如,使用podman pull registry. example.org/example/image:latest命令拉取镜像将被阻止,因为指定的前缀不匹配。[[registry]] location = "registry.example.org" prefix="registry.example.org/namespace" blocked = true
[[registry]] location = "registry.example.org" prefix="registry.example.org/namespace" blocked = trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意前缀是可选的,默认值与location值相同。您可以通过设置
prefix="registry.example.org/namespace/image"来阻止特定的镜像。[[registry]] location = "registry.example.org" prefix="registry.example.org/namespace/image" blocked = true
[[registry]] location = "registry.example.org" prefix="registry.example.org/namespace/image" blocked = trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 镜像注册表
您可以设置一个注册表镜像,以便在无法访问原始注册中心时访问。例如,您无法连接到互联网,因为您在高度敏感的环境中工作。您可以指定按照指定顺序联系的多个镜像。例如,当运行
podman pull registry.example.com/myimage:latest命令时,首先会尝试mirror-1.com,然后是mirror-2.com。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-pull (1)和podman-info (1)手册页。
3.3. 搜索容器镜像 复制链接链接已复制到粘贴板!
使用 podman search 命令,您可以在所选的容器注册表中搜索镜像。您还可以在 Red Hat Container Catalog 中搜索镜像。Red Hat Container Registry 包含镜像描述、内容、健康索引和其他信息。
podman search 命令不是确定镜像是否存在的可靠方法。v1 和 v2 Docker 分发 API 的 podman search 行为是特定于每个注册中心的实现的。某些注册表可能根本就不支持搜索。在没有搜索词的情况下的搜索仅适用于实现 v2 API 的 注册表。docker search 命令也是如此。
要在 quay.io 注册中心中搜索 postgresql-10 镜像,请按照以下步骤操作:
先决条件
-
container-tools元数据包已安装。 - 注册中心已配置。
流程
向注册中心进行身份验证:
podman login quay.io
# podman login quay.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 搜索镜像:
要搜索特定注册中心中的特定镜像,请输入:
podman search quay.io/postgresql-10 INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED redhat.io registry.redhat.io/rhel10/postgresql-10 This container image ... 0 redhat.io registry.redhat.io/rhscl/postgresql-10-rhel7 PostgreSQL is an ... 0
# podman search quay.io/postgresql-10 INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED redhat.io registry.redhat.io/rhel10/postgresql-10 This container image ... 0 redhat.io registry.redhat.io/rhscl/postgresql-10-rhel7 PostgreSQL is an ... 0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,要显示特定注册中心提供的所有镜像,请输入:
podman search quay.io/
# podman search quay.io/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要在所有注册表中搜索镜像名称,请输入:
podman search postgresql-10
# podman search postgresql-10Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要显示完整的描述,请将
--no-trunc选项传给命令。如需更多信息,请参阅系统中的
podman-search (1)手册页。
3.4. 配置短名称别名 复制链接链接已复制到粘贴板!
始终通过其完全限定名称拉取镜像。但是,通常按短名称拉取镜像。例如,您可以使用 ubi10 而不是 registry.access.redhat.com/ubi10:latest。
registries.conf 文件允许为短名称指定别名,使管理员能够完全控制从何处拉取镜像。别名在表中以格式 "name" = "value" 指定。您可以在 /etc/containers/registries.conf.d 目录中看到别名列表。红帽在此目录中提供了一组别名。例如,podman pull ubi10 直接解析到正确的镜像,即 registry.access.redhat.com/ubi10:latest。
例如:
unqualified-search-registries=["registry.fedoraproject.org", "quay.io"] [aliases] "fedora"="registry.fedoraproject.org/fedora"
unqualified-search-registries=["registry.fedoraproject.org", "quay.io"]
[aliases]
"fedora"="registry.fedoraproject.org/fedora"
简短名称模式为:
-
enforcing :如果在镜像拉取过程中未找到匹配的别名,Podman 会提示用户选择一个非限定搜索注册表。如果所选镜像拉取成功,Podman 将自动在
$HOME/.cache/containers/short-name-aliases.conf文件(非 root 用户)或在/var/cache/containers/short-name-aliases.conf(root 用户)中记录一个新的短名称别名。如果无法提示用户(例如,stdin 或 stdout 而不是 TTY),则 Podman 会失败。请注意,如果都指定了同一别名,short-name-aliases.conf文件优先于registries.conf文件。 - permissive :与 enforcing 模式类似,但如果用户无法得到提示,Podman 不会失败。相反,Podman 会按照指定顺序搜索所有非限定 registry。请注意,没有记录别名。
- disabled :以给定顺序尝试所有非限定搜索注册表,不会记录任何别名。
第 4 章 使用容器镜像 复制链接链接已复制到粘贴板!
Podman 工具被设计来处理容器镜像。您可以使用此工具来拉取镜像、检查、打标签、保存、加载、重新分发和定义镜像签名。
4.1. 从 registry 中拉取镜像 复制链接链接已复制到粘贴板!
使用 podman pull 命令来将镜像提取到您的本地系统。
先决条件
-
container-tools元数据包已安装。
流程
登录到 registry.redhat.io 注册中心:
podman login registry.redhat.io Username: <username> Password: <password> Login Succeeded!
$ podman login registry.redhat.io Username: <username> Password: <password> Login Succeeded!Copy to Clipboard Copied! Toggle word wrap Toggle overflow 拉取 registry.redhat.io/ubi10/ubi 容器镜像:
podman pull registry.redhat.io/ubi10/ubi
$ podman pull registry.redhat.io/ubi10/ubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
列出拉取到本地系统的所有镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MB
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-pull (1)手册页。
4.2. 使用短名称别名拉取容器镜像 复制链接链接已复制到粘贴板!
您可以使用安全的短名称将镜像提取到本地系统。以下流程描述了如何拉取一个 fedora 或 nginx 容器镜像。
先决条件
-
container-tools元数据包已安装。
流程
拉取容器镜像:
拉取
fedora镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 找到别名,并且安全地拉取
registry.fedoraproject.org/fedora镜像。非限定搜索注册表列表不用于解析fedora镜像名称。拉取
nginx镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果没有找到匹配的别名,系统会提示您选择一个
非限定搜索注册表。如果成功拉取所选镜像,则会在本地记录新的短名称别名,否则会发生错误。
验证
列出拉取到本地系统的所有镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.fedoraproject.org/fedora latest 28317703decd 12 days ago 184 MB docker.io/library/nginx latest 08b152afcfae 13 days ago 137 MB
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.fedoraproject.org/fedora latest 28317703decd 12 days ago 184 MB docker.io/library/nginx latest 08b152afcfae 13 days ago 137 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3. 列出镜像 复制链接链接已复制到粘贴板!
使用 podman images 命令列出本地存储中的镜像。
先决条件
-
container-tools元数据包已安装。 - 本地系统上提供了拉取的镜像。
流程
列出本地存储中的所有镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi10/ubi latest 3269c37eae33 6 weeks ago 208 MB
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi10/ubi latest 3269c37eae33 6 weeks ago 208 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow
如需更多信息,请参阅系统中的 podman-images (1) 手册页。
4.4. 检查本地镜像 复制链接链接已复制到粘贴板!
将镜像拉取到本地系统并运行后,您可以使用 podman inspect 命令来调查镜像。例如,使用它来了解镜像是做什么的,并检查镜像内有什么软件。podman inspect 命令显示有关按名称或 ID 标识的容器和镜像的信息。
先决条件
-
container-tools元数据包已安装。 - 本地系统上提供了拉取的镜像。
流程
检查
registry.redhat.io/ubi10/ubi镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow "Cmd"键指定要在容器内运行的默认命令。您可以通过指定一个命令作为podman run命令的参数来覆盖此命令。在使用podman run启动它时,如果没有其他参数,此 ubi10/ubi 容器将执行 bash shell。如果设置了"Entrypoint"键,则使用其值而不是"Cmd"的值,"Cmd"的值被用作 Entrypoint 命令的参数。
4.5. 检查远程镜像 复制链接链接已复制到粘贴板!
在将镜像拉取到系统之前,请使用 skopeo inspect 命令显示远程容器注册中心中的镜像信息。
先决条件
-
container-tools元数据包已安装。
流程
检查
registry.redhat.io/ubi10/ubi-init镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
skopeo-inspect (1)手册页。
4.6. 复制容器镜像 复制链接链接已复制到粘贴板!
您可以使用 skopeo copy 命令将容器镜像从一个注册中心复制到另一个注册中心。例如,您可以使用外部注册表的镜像填充内部存储库,或者在两个不同的地方同步镜像注册表。
先决条件
-
container-tools元数据包已安装。
流程
将
skopeo容器镜像从docker://quay.io复制到docker://registry.example.com:skopeo copy docker://quay.io/skopeo/stable:latest docker://registry.example.com/skopeo:latest
$ skopeo copy docker://quay.io/skopeo/stable:latest docker://registry.example.com/skopeo:latestCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
skopeo-copy (1)手册页。
4.7. 将镜像层复制到本地目录中 复制链接链接已复制到粘贴板!
您可以使用 skopeo copy 命令将容器镜像的层复制到本地目录中。
先决条件
-
container-tools元数据包已安装。
流程
创建
/var/lib/images/nginx目录:mkdir -p /var/lib/images/nginx
$ mkdir -p /var/lib/images/nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
docker://docker.io/nginx:latest 镜像的 层复制到新创建的目录中:skopeo copy docker://docker.io/nginx:latest dir:/var/lib/images/nginx
$ skopeo copy docker://docker.io/nginx:latest dir:/var/lib/images/nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示
/var/lib/images/nginx目录的内容:ls /var/lib/images/nginx 08b11a3d692c1a2e15ae840f2c15c18308dcb079aa5320e15d46b62015c0f6f3 ... 4fcb23e29ba19bf305d0d4b35412625fea51e82292ec7312f9be724cb6e31ffd manifest.json version
$ ls /var/lib/images/nginx 08b11a3d692c1a2e15ae840f2c15c18308dcb079aa5320e15d46b62015c0f6f3 ... 4fcb23e29ba19bf305d0d4b35412625fea51e82292ec7312f9be724cb6e31ffd manifest.json versionCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
skopeo-copy (1)手册页。
4.8. 标记镜像 复制链接链接已复制到粘贴板!
使用 podman tag 命令给本地镜像添加额外的名称。此额外名称可由几个部分组成:<registryhost>/<username>/<name>:<tag>。
先决条件
-
container-tools元数据包已安装。 - 本地系统上提供了拉取的镜像。
流程
列出所有镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MB
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下选项之一将
myubi名称分配给registry.redhat.io/ubi10/ubi镜像:镜像名称:
podman tag registry.redhat.io/ubi10/ubi myubi
$ podman tag registry.redhat.io/ubi10/ubi myubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 镜像 ID:
podman tag 3269c37eae33 myubi
$ podman tag 3269c37eae33 myubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 两个命令会给出同样的结果。
列出所有镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 2 months ago 208 MB localhost/myubi latest 3269c37eae33 2 months ago 208 MB
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 2 months ago 208 MB localhost/myubi latest 3269c37eae33 2 months ago 208 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,两个镜像的默认标签都是
latest。您可以看到所有镜像名称都被分配给单个镜像 ID 3269c37eae33。使用以下方法将
10标签添加到registry.redhat.io/ubi10/ubi镜像:镜像名称:
podman tag registry.redhat.io/ubi10/ubi myubi:10
$ podman tag registry.redhat.io/ubi10/ubi myubi:10Copy to Clipboard Copied! Toggle word wrap Toggle overflow 镜像 ID:
podman tag 3269c37eae33 myubi:10
$ podman tag 3269c37eae33 myubi:10Copy to Clipboard Copied! Toggle word wrap Toggle overflow 两个命令会给出同样的结果。
验证
列出所有镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 2 months ago 208 MB localhost/myubi latest 3269c37eae33 2 months ago 208 MB localhost/myubi 10 3269c37eae33 2 months ago 208 MB
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 2 months ago 208 MB localhost/myubi latest 3269c37eae33 2 months ago 208 MB localhost/myubi 10 3269c37eae33 2 months ago 208 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,两个镜像的默认标签都是
latest。您可以看到所有镜像名称都被分配给单个镜像 ID 3269c37eae33。
在标记完 registry.redhat.io/ubi10/ubi 镜像后,您有三个选项来运行容器:
-
按 ID (
3269c37eae33) -
按名称(
localhost/myubi:latest) 按名称(
localhost/myubi:10)如需更多信息,请参阅系统中的
podman-tag (1)手册页。
4.9. 构建多架构镜像 复制链接链接已复制到粘贴板!
先决条件
-
container-tools元数据软件包已安装。
流程
-
为您要支持的每个架构创建
Containerfiles。 为每个架构构建镜像。例如:
podman build --platform linux/arm64,linux/amd64 --manifest <registry>/<image> .
$ podman build --platform linux/arm64,linux/amd64 --manifest <registry>/<image> .Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
--platform linux/arm64,linux/amd64选项指定构建容器镜像的目标平台。 -
--manifest <registry>/<image>选项创建一个具有指定名称的清单列表,即<registry>/<image>,并将新构建的镜像添加到其中。清单列表是镜像清单的一个集合,每个针对不同的架构。
-
将清单列表推送到注册中心:
podman manifest push <registry>/<image>
$ podman manifest push <registry>/<image>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此清单列表充当拉取多架构容器的单个入口点。
因此,您可以根据单个清单列表,为平台拉取合适的容器镜像。
您还可以使用
podman manifest remove <manifest_list> <digest_ID>命令从清单列表中删除条目,其中<digest_ID>是容器镜像的 SHA-256 校验和。例如:podman manifest remove <registry>/<image> sha256:cb8a924afdf…。
验证
显示清单列表:
podman manifest inspect <registry>/<image>
$ podman manifest inspect <registry>/<image>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-build (1)和podman-manifest (1)手册页。
4.10. 保存并加载镜像 复制链接链接已复制到粘贴板!
使用 podman save 命令将镜像保存到容器存档中。稍后您可以将其恢复到其他容器环境,或将其发送给其他人。您可以使用 --format 选项来指定归档格式。支持的格式有:
-
docker-archive -
oci-archive -
oci-dir(带有 oci 清单类型的目录) -
docker-archive(带有 v2s2 清单类型的目录)
默认格式为 docker-archive 格式。
使用 podman load 命令将容器镜像存档中的镜像加载到容器存储中。
先决条件
-
container-tools元数据包已安装。 - 本地系统上提供了拉取的镜像。
流程
将
registry.redhat.io/rhel10/support-tools镜像保存为一个 tar 包:在默认的
docker-archive格式中:podman save -o mysupport-tools.tar registry.redhat.io/rhel10/support-tools:latest
$ podman save -o mysupport-tools.tar registry.redhat.io/rhel10/support-tools:latestCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
oci-archive格式下,使用--format选项:podman save -o mysupport-tools-oci.tar --format=oci-archive registry.redhat.io/rhel10/support-tools
$ podman save -o mysupport-tools-oci.tar --format=oci-archive registry.redhat.io/rhel10/support-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow mysupport-tools.tar和mysupport-tools-oci.tar存档存储在您的当前目录中。后续步骤使用mysupport-tools.tartar 包执行。
检查
mysupport-tools.tar的文件类型:file mysupport-tools.tar mysupport-tools.tar: POSIX tar archive
$ file mysupport-tools.tar mysupport-tools.tar: POSIX tar archiveCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要从
mysupport-tools.tar加载registry.redhat.io/rhel10/support-tools:latest镜像:podman load -i mysupport-tools.tar ... Loaded image(s): registry.redhat.io/rhel10/support-tools:latest
$ podman load -i mysupport-tools.tar ... Loaded image(s): registry.redhat.io/rhel10/support-tools:latestCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-save (1)和podman-load (1)手册页。
4.11. 重新分发 UBI 镜像 复制链接链接已复制到粘贴板!
使用 podman push 命令将 UBI 镜像推送到您自己的或第三方注册中心,并将其与他人共享。您可以根据情况,从 UBI dnf 软件仓库升级或添加到该镜像。
先决条件
-
container-tools元数据包已安装。 - 本地系统上提供了拉取的镜像。
流程
可选:对
ubi镜像添加一个额外的名称:podman tag registry.redhat.io/ubi10/ubi registry.example.com:5000/ubi10/ubi
# podman tag registry.redhat.io/ubi10/ubi registry.example.com:5000/ubi10/ubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
registry.example.com:5000/ubi10/ubi镜像从本地存储推送到注册中心:podman push registry.example.com:5000/ubi10/ubi
# podman push registry.example.com:5000/ubi10/ubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow
虽然对这些镜像的使用方式的限制不多,但对于如何引用这些镜像会有一些限制。例如,您不能调用这些红帽认证的或红帽支持的镜像,除非您通过 Red Hat Partner Connect Program (Red Hat Container Certification 或 Red Hat OpenShift Operator Certification)进行了认证。
4.12. 删除镜像 复制链接链接已复制到粘贴板!
使用 podman rmi 命令来移除本地存储的容器镜像。您可以通过其 ID 或名称来删除镜像。
先决条件
-
container-tools元数据包已安装。
流程
列出本地系统上的所有镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/rhel10/support-tools latest 4b32d14201de 7 weeks ago 228 MB registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MB localhost/myubi X.Y 3269c37eae33 7 weeks ago 208 MB
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/rhel10/support-tools latest 4b32d14201de 7 weeks ago 228 MB registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MB localhost/myubi X.Y 3269c37eae33 7 weeks ago 208 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出所有容器:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7ccd6001166e registry.redhat.io/rhel10/support-tools:latest usr/bin/bash 6 seconds ago Up 5 seconds ago my-support-tools
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7ccd6001166e registry.redhat.io/rhel10/support-tools:latest usr/bin/bash 6 seconds ago Up 5 seconds ago my-support-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要删除
registry.redhat.io/rhel10/support-tools镜像,您必须使用podman stop命令停止运行该镜像的所有容器。您可以通过其 ID 或名称来停止容器。停止
my-support-tools容器:podman stop my-support-tools 7ccd6001166e9720c47fbeb077e0afd0bb635e74a1b0ede3fd34d09eaf5a52e9
$ podman stop my-support-tools 7ccd6001166e9720c47fbeb077e0afd0bb635e74a1b0ede3fd34d09eaf5a52e9Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除
registry.redhat.io/rhel10/support-tools镜像:podman rmi registry.redhat.io/rhel10/support-tools
$ podman rmi registry.redhat.io/rhel10/support-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要删除多个镜像:
podman rmi registry.redhat.io/rhel10/support-tools registry.redhat.io/ubi10/ubi
$ podman rmi registry.redhat.io/rhel10/support-tools registry.redhat.io/ubi10/ubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要从您的系统中删除所有镜像:
podman rmi -a
$ podman rmi -aCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要删除与其有多个名称(标记)关联的镜像,请添加
-f选项来删除它们:podman rmi -f 1de7d7b3f531 1de7d7b3f531...
$ podman rmi -f 1de7d7b3f531 1de7d7b3f531...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
-
使用
podman images命令列出所有镜像,以验证容器镜像是否已移除。
第 5 章 操作容器 复制链接链接已复制到粘贴板!
容器代表从解压缩的容器镜像中的文件创建的一个正在运行中或已停止的进程。您可以使用 Podman 工具来操作容器。
5.1. podman run 命令 复制链接链接已复制到粘贴板!
podman run 命令在基于容器镜像的新容器中运行一个进程。如果容器镜像尚未加载,则在从该镜像启动容器前,podman run 会以与 podman pull image相同的方式从存储库中拉取镜像和所有镜像的依赖项。容器进程具有自己的文件系统、自己的网络,以及它自己的隔离进程树。
podman run 命令的格式如下:
podman run [options] image [command [arg ...]]
podman run [options] image [command [arg ...]]
基本选项为:
-
--detach(-d):在后台运行容器,并打印新的容器 ID。 -
--attach(-a):以前台模式运行容器。 -
--name(-n):为容器分配一个名称。如果没有使用--name为容器分配名称,则它会生成一个随机字符串名称。这适用于后台和前台容器。 -
--rm:退出时自动删除容器。请注意,当容器无法成功创建或启动时,不能删除容器。 -
--tty(-t):将伪终端分配和附加给容器的标准输入。 -
--interactive(-i):对于交互式进程,请一起使用-i和-t来为容器进程分配一个终端。-i -t通常写为-it。
5.2. 在主机的容器中运行命令 复制链接链接已复制到粘贴板!
使用 podman run 命令显示容器的操作系统的类型。
先决条件
-
container-tools元数据包已安装。
流程
使用
cat /etc/os-release命令显示基于registry.access.redhat.com/ubi10/ubi容器镜像的容器的操作系统类型:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有容器。
podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESCopy to Clipboard Copied! Toggle word wrap Toggle overflow 由于
--rm选项,您应该看不到任何容器。容器已被删除。
5.3. 在容器内运行命令 复制链接链接已复制到粘贴板!
使用 podman run 命令以交互方式运行容器。
先决条件
-
container-tools元数据包已安装。
流程
运行基于
registry.redhat.io/ubi10/ubi镜像的名为myubi的容器:podman run --name=myubi -it registry.access.redhat.com/ubi10/ubi /bin/bash [root@6ccffd0f6421 /]#
$ podman run --name=myubi -it registry.access.redhat.com/ubi10/ubi /bin/bash [root@6ccffd0f6421 /]#Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
-i选项创建一个交互式会话。如果不使用-t选项,shell 将保持打开状态,但您无法对 shell 输入任何东西。 -
-t选项打开一个终端会话。如果不使用-i选项,shell 会打开,然后退出。
-
安装
procps-ng软件包,其包含一组系统工具(如ps、top和uptime,等等):dnf install procps-ng
[root@6ccffd0f6421 /]# dnf install procps-ngCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
ps -ef命令列出当前的进程:ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 12:55 pts/0 00:00:00 /bin/bash root 31 1 0 13:07 pts/0 00:00:00 ps -ef
# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 12:55 pts/0 00:00:00 /bin/bash root 31 1 0 13:07 pts/0 00:00:00 ps -efCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入
exit退出容器并返回到主机:exit
# exitCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有容器:
podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1984555a2c27 registry.redhat.io/ubi10/ubi:latest /bin/bash 21 minutes ago Exited (0) 21 minutes ago myubi
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1984555a2c27 registry.redhat.io/ubi10/ubi:latest /bin/bash 21 minutes ago Exited (0) 21 minutes ago myubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到容器处于 Exited 状态。
5.4. 构建容器 复制链接链接已复制到粘贴板!
Buildah 是在 Red Hat Enterprise Linux 中构建容器的主要工具,您可以在 Podman 中使用它来管理和运行您构建的容器。
先决条件
-
container-tools元数据包已安装。
流程
安装容器工具:确保 RHEL 系统上已安装必要的容器工具。container-tools 模块提供 Buildah、Podman 和 Skopeo。
sudo dnf install container-tools
$ sudo dnf install container-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 Containerfile : Containerfile 定义构建容器镜像的说明。此文件指定基础镜像、要安装的任何软件、要应用的配置以及要运行的应用程序。例如:
FROM registry.redhat.io/ubi10/ubi-minimal RUN microdnf -y update && microdnf -y install COPY index.html /var/www/html/ EXPOSE 80 CMD ["httpd", "-DFOREGROUND"]
FROM registry.redhat.io/ubi10/ubi-minimal RUN microdnf -y update && microdnf -y install COPY index.html /var/www/html/ EXPOSE 80 CMD ["httpd", "-DFOREGROUND"]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Buildah 构建容器镜像:在进入包含容器文件的目录后,使用
buildah bud(或podman build)构建镜像。cd /<path_to_container_file> buildah bud -t your_image_name:tag .
$ cd /<path_to_container_file> $ buildah bud -t your_image_name:tag .Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
your_image_name:您的镜像的名称。 -
标签:镜像的标签(如 latest、1.0)。 -
.: 表示 Containerfile 位于当前目录中。
-
运行容器:构建镜像后,您可以使用
podman run命令从其中运行容器。podman run -d -p 8080:80 my-web-app
$ podman run -d -p 8080:80 my-web-appCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
-d:以分离模式(在后台)运行容器。 -
-p 8080:80: 将主机上的端口 8080 映射到容器内的端口 80。 my-web-app:要运行的镜像名称。- 容器构建中的 heredocs 语法
您可以在 Containerfile 中使用
heredoc语法,以及 Red Hat Enterprise Linux 基础镜像,确保启用BuildKit。如果命令包含heredoc语法,则 Containerfile 会考虑下一行,直到行只包含 heredoc delimiter,作为同一命令的一部分。您可以使用heredocs,直接在 Containerfile 中的RUN或COPY等指令中嵌入多行字符串。这对基于 RHEL 的镜像特别有用,因为它无需为简单的任务创建单独的脚本文件,从而提高了可读性和可维护性。例如,常见的用例在单个
RUN指令中运行多个 shell 命令,以创建单个镜像层,避免&& \语法:
-
-
RUN <<EOF: << 信号是 heredoc 的开头,EOF是用户定义的分隔符。 -
<&
lt;EOF和最终EOF之间的行被视为 shell 执行的一个脚本。 -
整个块是单个
RUN指令,其效率更高且更易于阅读。
5.5. 列出容器 复制链接链接已复制到粘贴板!
使用 podman ps 命令列出系统上正在运行的容器。
先决条件
-
container-tools元数据包已安装。
流程
运行基于
registry.redhat.io/rhel10/support-tools镜像的容器:podman run -d registry.redhat.io/rhel8/support-tools
$ podman run -d registry.redhat.io/rhel8/support-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出所有容器:
要列出所有正在运行的容器:
podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 74b1da000a11 rhel10/support-tools /usr/bin/bash 2 minutes ago Up About a minute musing_brown
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 74b1da000a11 rhel10/support-tools /usr/bin/bash 2 minutes ago Up About a minute musing_brownCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要列出所有运行或停止的容器:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES IS INFRA d65aecc325a4 ubi10/ubi /bin/bash 3 secs ago Exited (0) 5 secs ago peaceful_hopper false 74b1da000a11 rhel10/support-tools /usr/bin/bash 2 mins ago Up About a minute musing_brown false
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES IS INFRA d65aecc325a4 ubi10/ubi /bin/bash 3 secs ago Exited (0) 5 secs ago peaceful_hopper false 74b1da000a11 rhel10/support-tools /usr/bin/bash 2 mins ago Up About a minute musing_brown falseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您没有删除没有运行的容器,可以使用--
rm选项重启它们。如需更多信息,请参阅系统中的
podman-images (1)手册页。
5.6. 启动容器 复制链接链接已复制到粘贴板!
如果您运行容器,然后停止它,且未将其删除,则容器会存储在本地系统上,准备再次运行。您可以使用 podman start 命令来重新运行容器。您可以根据其容器 ID 或名称来指定容器。
先决条件
-
container-tools元数据包已安装。 - 至少一个容器已经停止。
流程
启动
myubi容器:在非互动模式中:
podman start myubi
$ podman start myubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,您可以使用
podman start 1984555a2c27。在交互模式中,使用
-a(--attach)和-i(--interactive)选项来使用容器 bash shell:podman start -a -i myubi
$ podman start -a -i myubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,您可以使用
podman start -a -i 1984555a2c27。
输入
exit退出容器并返回到主机:exit
[root@6ccffd0f6421 /]# exitCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-start (1)手册页。
5.7. 检查主机的容器 复制链接链接已复制到粘贴板!
使用 podman inspect 命令,来检查 JSON 格式的现有容器的元数据。您可以根据其容器 ID 或名称来指定容器。
先决条件
-
container-tools元数据包已安装。
流程
检查 ID 64ad95327c74 定义的容器:
要获取所有元数据:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要从 JSON 文件中获取特定的内容,如
StartedAt时间戳:podman inspect --format='{{.State.StartedAt}}' 64ad95327c74 2021-03-02 11:23:54.945071961 +0100 CET$ podman inspect --format='{{.State.StartedAt}}' 64ad95327c74 2021-03-02 11:23:54.945071961 +0100 CETCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这些信息保存在层次结构中。要查看容器
StartedAt时间戳(StartedAt在State下),请使用--format选项以及容器 ID 或名称。您想要检查的其他内容示例包括:
-
.Path来查看容器运行的命令 -
.Args命令的参数 -
.Config.ExposedPorts容器公开的 TCP 或 UDP 端口 -
.State.Pid来查看容器的进程 ID .HostConfig.PortBindings从容器到主机的端口映射如需更多信息,请参阅系统中的
podman-inspect (1)手册页。
5.8. 将 localhost 上的目录挂载到容器 复制链接链接已复制到粘贴板!
您可以通过在容器内挂载主机 /dev/log 设备,来将容器内的日志消息提供给主机系统。
先决条件
-
container-tools元数据包已安装。
流程
运行名为
log_test的容器,并在容器内挂载主机/dev/log设备:podman run --name="log_test" -v /dev/log:/dev/log --rm \ registry.redhat.io/ubi10/ubi logger "Testing logging to the host"
# podman run --name="log_test" -v /dev/log:/dev/log --rm \ registry.redhat.io/ubi10/ubi logger "Testing logging to the host"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
journalctl工具来显示日志:journalctl -b | grep Testing Dec 09 16:55:00 localhost.localdomain root[14634]: Testing logging to the host
# journalctl -b | grep Testing Dec 09 16:55:00 localhost.localdomain root[14634]: Testing logging to the hostCopy to Clipboard Copied! Toggle word wrap Toggle overflow --rm选项会在容器退出时删除容器。
5.9. 挂载容器文件系统 复制链接链接已复制到粘贴板!
使用 podman mount 命令将正常工作的容器根文件系统挂载到主机可访问的位置。
先决条件
-
container-tools元数据包已安装。
流程
运行名为
mysyslog的容器:podman run -d --name=mysyslog registry.redhat.io/rhel10/support-tools
# podman run -d --name=mysyslog registry.redhat.io/rhel10/support-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有容器:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c56ef6a256f8 registry.redhat.io/rhel10/support-tools:latest usr/bin/bash 20 minutes ago Up 20 minutes ago mysyslog
# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c56ef6a256f8 registry.redhat.io/rhel10/support-tools:latest usr/bin/bash 20 minutes ago Up 20 minutes ago mysyslogCopy to Clipboard Copied! Toggle word wrap Toggle overflow 挂载
mysyslog容器:podman mount mysyslog /var/lib/containers/storage/overlay/990b5c6ddcdeed4bde7b245885ce4544c553d108310e2b797d7be46750894719/merged
# podman mount mysyslog /var/lib/containers/storage/overlay/990b5c6ddcdeed4bde7b245885ce4544c553d108310e2b797d7be46750894719/mergedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
ls命令显示挂载点的内容:ls /var/lib/containers/storage/overlay/990b5c6ddcdeed4bde7b245885ce4544c553d108310e2b797d7be46750894719/merged bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# ls /var/lib/containers/storage/overlay/990b5c6ddcdeed4bde7b245885ce4544c553d108310e2b797d7be46750894719/merged bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr varCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示 OS 版本:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-mount (1)手册页。
5.10. 将服务作为使用静态 IP 的守护进程运行 复制链接链接已复制到粘贴板!
以下示例将 support-tools 服务作为守护进程在后台运行。--ip 选项将容器网络接口设为特定的 IP 地址(如 10.88.0.44)。之后,您可以运行 podman inspect 命令来检查是否正确设置了 IP 地址。
先决条件
-
container-tools元数据包已安装。
流程
将容器网络接口设为 IP 地址 10.88.0.44:
podman run -d --ip=10.88.0.44 registry.access.redhat.com/rhel10/support-tools efde5f0a8c723f70dd5cb5dc3d5039df3b962fae65575b08662e0d5b5f9fbe85
# podman run -d --ip=10.88.0.44 registry.access.redhat.com/rhel10/support-tools efde5f0a8c723f70dd5cb5dc3d5039df3b962fae65575b08662e0d5b5f9fbe85Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查是否正确设置了 IP 地址:
podman inspect efde5f0a8c723 | grep 10.88.0.44 "IPAddress": "10.88.0.44",
# podman inspect efde5f0a8c723 | grep 10.88.0.44 "IPAddress": "10.88.0.44",Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-inspect (1)和podman-run (1)手册页。
5.11. 在运行中的容器中执行命令 复制链接链接已复制到粘贴板!
使用 podman exec 命令,来在正在运行的容器中执行命令并调查该容器。使用 podman exec 命令而不是 podman run 命令的原因是,您可以在不中断容器活动的情况下调查正在运行的容器。
先决条件
-
container-tools元数据包已安装。 - 容器正在运行。
流程
在
my-support-tools容器中执行rpm -qa命令来列出所有安装的软件包:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
my-support-tools容器中执行/bin/bash命令:podman exec -it my-support-tools /bin/bash
$ podman exec -it my-support-tools /bin/bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow 安装
procps-ng软件包,其包含一组系统工具(如ps、top和uptime,等等):dnf install procps-ng
# dnf install procps-ngCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查容器:
要列出系统上的每个进程:
ps -ef UID PID PPID C STIME TTY TIME CMD root 8 0 0 11:07 pts/0 00:00:00 /bin/bash root 47 8 0 11:13 pts/0 00:00:00 ps -ef
# ps -ef UID PID PPID C STIME TTY TIME CMD root 8 0 0 11:07 pts/0 00:00:00 /bin/bash root 47 8 0 11:13 pts/0 00:00:00 ps -efCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要显示文件系统磁盘空间使用情况:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要显示系统信息:
uname -r 6.13.4-200.fc41.x86_64
# uname -r 6.13.4-200.fc41.x86_64Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要以 MB 为单位显示空闲和使用的内存量:
free --mega total used free shared buff/cache available Mem: 2818 615 1183 12 1020 1957 Swap: 3124 0 3124
# free --mega total used free shared buff/cache available Mem: 2818 615 1183 12 1020 1957 Swap: 3124 0 3124Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.12. 在两个容器间共享文件 复制链接链接已复制到粘贴板!
使用卷可以持久保留容器中的数据,即使容器被删除。卷可用于在多个容器间共享数据。卷是保存在主机上的文件夹。卷可以在容器和主机间共享。
主要优点是:
- 卷可以在容器间共享。
- 卷可以更容易备份或迁移。
- 卷不会增加容器的大小。
先决条件
-
container-tools元数据包已安装。
流程
创建卷:
podman volume create hostvolume
$ podman volume create hostvolumeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示卷的信息:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,它会在卷目录中创建一个卷。您可以将挂载点路径保存到变量,以便更轻松地操作:
$ mntPoint=$(podman volume inspect hostvolume --format {{.Mountpoint}})。请注意,如果您运行
sudo podman volume create hostvolume,则挂载点会更改为/var/lib/containers/storage/volumes/hostvolume/_data。使用存储在
mntPoint变量中的路径来在目录中创建一个文本文件:echo "Hello from host" >> $mntPoint/host.txt
$ echo "Hello from host" >> $mntPoint/host.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出
mntPoint变量所定义的目录中的所有文件:ls $mntPoint/ host.txt
$ ls $mntPoint/ host.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行名为
myubi1的容器,并将主机上hostvolume卷名定义的目录映射到容器上的/containervolume1目录:podman run -it --name myubi1 -v hostvolume:/containervolume1 registry.access.redhat.com/ubi10/ubi /bin/bash
$ podman run -it --name myubi1 -v hostvolume:/containervolume1 registry.access.redhat.com/ubi10/ubi /bin/bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,如果您使用
mntPoint变量定义的卷路径(-v $mntPoint:/containervolume1),则在运行podman volume prune命令时数据可能会丢失,因为这会删除未使用的卷。始终使用-v hostvolume_name:/containervolume_name。列出容器上共享卷中的文件:
ls /containervolume1 host.txt
# ls /containervolume1 host.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以查看在主机上创建的
host.txt文件。在
/containervolume1目录中创建一个文本文件:echo "Hello from container 1" >> /containervolume1/container1.txt
# echo "Hello from container 1" >> /containervolume1/container1.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
CTRL+p和CTRL+q从容器分离。 列出主机上共享卷中的文件,您应该看到两个文件:
ls $mntPoint container1.rxt host.txt
$ ls $mntPoint container1.rxt host.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此时,您要在容器和主机间共享文件。要在两个容器之间共享文件,请运行另一个名为
myubi2的容器。运行名为
myubi2的容器,并将主机上hostvolume卷名定义的目录映射到容器上的/containervolume2目录:podman run -it --name myubi2 -v hostvolume:/containervolume2 registry.access.redhat.com/ubi10/ubi /bin/bash
$ podman run -it --name myubi2 -v hostvolume:/containervolume2 registry.access.redhat.com/ubi10/ubi /bin/bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出容器上共享卷中的文件:
ls /containervolume2 container1.txt host.txt
# ls /containervolume2 container1.txt host.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到您在主机上创建的
host.txt文件,以及您在myubi1容器中创建的container1.txt文件。在
/containervolume2目录中创建一个文本文件:echo "Hello from container 2" >> /containervolume2/container2.txt
# echo "Hello from container 2" >> /containervolume2/container2.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
CTRL+p和CTRL+q从容器分离。 列出主机上共享卷中的文件,您应该看到三个文件:
ls $mntPoint container1.rxt container2.txt host.txt
$ ls $mntPoint container1.rxt container2.txt host.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-volume (1)手册页。
5.13. 导出和导入容器 复制链接链接已复制到粘贴板!
您可以使用 podman export 命令将正在运行的容器的文件系统导出到本地机器上的 tar 包中。例如,如果您有一个大容器,不常使用,或者您想要保存快照以便以后恢复该容器,则您可以使用 podman export 命令将正在运行的容器的当前快照导出到 tar 包中。
您可以使用 podman import 命令导入 tar 包,并将其保存为文件系统镜像。然后您可以运行此文件系统映像,或者将其用作其他镜像的层。
先决条件
-
container-tools元数据包已安装。
流程
运行基于
registry.access.redhat.com/ubi10/ubi镜像的myubi容器:podman run -dt --name=myubi registry.access.redhat.com/10/ubi
$ podman run -dt --name=myubi registry.access.redhat.com/10/ubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有容器:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a6a6d4896142 registry.access.redhat.com/10:latest /bin/bash 7 seconds ago Up 7 seconds ago myubi
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a6a6d4896142 registry.access.redhat.com/10:latest /bin/bash 7 seconds ago Up 7 seconds ago myubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 附加到
myubi容器:podman attach myubi
$ podman attach myubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
testfile的文件:echo "hello" > testfile
[root@a6a6d4896142 /]# echo "hello" > testfileCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用
CTRL+p和CTRL+q从容器分离。 将
myubi的文件系统导出为本地机器上的myubi-container.tar:podman export -o myubi.tar a6a6d4896142
$ podman export -o myubi.tar a6a6d4896142Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出当前目录的内容:
ls -l -rw-r--r--. 1 user user 210885120 Apr 6 10:50 myubi-container.tar ...
$ ls -l -rw-r--r--. 1 user user 210885120 Apr 6 10:50 myubi-container.tar ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:创建一个
myubi-container目录,提取myubi-container.tar存档中的所有文件。以树形格式列出myubi-directory的内容:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到
myubi-container.tar包含容器文件系统。导入
myubi.tar,并将其保存为文件系统镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出所有镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/myubi-imported latest c296689a17da 51 seconds ago 211 MB
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/myubi-imported latest c296689a17da 51 seconds ago 211 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示
testfile文件的内容:podman run -it --name=myubi-imported myubi-imported cat testfile hello
$ podman run -it --name=myubi-imported myubi-imported cat testfile helloCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-export (1)和podman-import (1)手册页。
5.14. 停止容器 复制链接链接已复制到粘贴板!
使用 podman stop 命令来停止正在运行的容器。您可以根据其容器 ID 或名称来指定容器。
先决条件
-
container-tools元数据包已安装。 - 至少有一个容器正在运行。
流程
停止
myubi容器:使用容器名称:
podman stop myubi
$ podman stop myubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用容器 ID:
podman stop 1984555a2c27
$ podman stop 1984555a2c27Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要停止附加到终端会话的正在运行的容器,您可以在容器中输入
exit命令。podman stop命令发送 SIGTERM 信号来终止正在运行的容器。如果容器在定义的时间段后没有停止(默认为 10 秒),Podman 会发送一个 SIGKILL 信号。您还可以使用
podman kill命令来终止一个容器(SIGKILL),或向容器发送不同的信号。以下是向容器发送 SIGHUP 信号的示例(如果应用程序支持,SIGHUP 会使应用程序重新读取其配置文件):podman kill --signal="SIGHUP" 74b1da000a11 74b1da000a114015886c557deec8bed9dfb80c888097aa83f30ca4074ff55fb2
# podman kill --signal="SIGHUP" 74b1da000a11 74b1da000a114015886c557deec8bed9dfb80c888097aa83f30ca4074ff55fb2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-stop (1)和podman-kill (1)手册页。
5.15. 删除容器 复制链接链接已复制到粘贴板!
使用 podman rm 命令来删除容器。您可以使用容器 ID 或名称指定容器。
先决条件
-
container-tools元数据包已安装。 - 至少一个容器已经停止。
流程
列出所有运行或停止的容器:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES IS INFRA d65aecc325a4 ubi10/ubi /bin/bash 3 secs ago Exited (0) 5 secs ago peaceful_hopper false 74b1da000a11 rhel10/support-tools usr/bin/bash 2 mins ago Up About a minute musing_brown false
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES IS INFRA d65aecc325a4 ubi10/ubi /bin/bash 3 secs ago Exited (0) 5 secs ago peaceful_hopper false 74b1da000a11 rhel10/support-tools usr/bin/bash 2 mins ago Up About a minute musing_brown falseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除容器:
要删除
peaceful_hopper容器:podman rm peaceful_hopper
$ podman rm peaceful_hopperCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,
peaceful_hopper容器处于 Exited 状态,这表示它已停止,可以立即删除。要删除
musing_brown容器,首先停止容器,然后将其删除:podman stop musing_brown podman rm musing_brown
$ podman stop musing_brown $ podman rm musing_brownCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要删除多个容器:
podman rm clever_yonath furious_shockley
$ podman rm clever_yonath furious_shockleyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要从本地系统中删除所有容器:
podman rm -a
$ podman rm -aCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
-
使用
podman ps -a命令列出所有镜像,以验证容器是否已移除。
5.16. 为容器创建 SELinux 策略 复制链接链接已复制到粘贴板!
要为容器生成 SELinux 策略,使用 UDICA 工具。如需更多信息,请参阅 udica SELinux 策略生成器简介。
5.17. 在 Podman 中配置预执行钩子 复制链接链接已复制到粘贴板!
您可以创建插件脚本来定义对容器操作的精细控制,特别是阻止未经授权的操作,如拉取、运行或列出容器镜像。
文件 /etc/containers/podman_preexec_hooks.txt 必须由管理员创建,可为空。如果 /etc/containers/podman_preexec_hooks.txt 不存在,则不会执行插件脚本。
以下规则适用于插件脚本:
- 必须是 root 所有且不可写。
-
必须位于
/usr/libexec/podman/pre-exec-hooks和/etc/containers/pre-exec-hooks目录中。 - 按顺序和字母顺序执行。
-
如果所有插件脚本都返回零值,则
podman命令执行了。 -
如果任何插件脚本返回非零值,则表示失败。
podman命令退出,并返回第一个失败的脚本的非零值。 红帽建议使用以下命名约定来按照正确顺序执行脚本:
DDD_name.lang,其中:-
DDD是指示脚本执行顺序的十进制数字。如有必要,使用一个或多个前导零。 -
name是插件脚本的名称。 -
lang(可选)是给定编程语言的文件扩展。例如,插件脚本的名称可以是:001-check-groups.sh。
-
插件脚本在创建时有效。在插件脚本之前创建的容器不会受到影响。
先决条件
-
container-tools元数据包已安装。
流程
创建名为
001-check-groups.sh的脚本插件。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 该脚本检查用户是否在指定的组中。
-
USER和GROUP是 Podman 设置的环境变量。 -
001-check-groups.sh脚本提供的退出代码将提供给podman二进制文件。 -
podman命令退出,并返回第一个失败的脚本的非零值。
验证
检查
001-check-groups.sh脚本是否正常工作:podman run image ...
$ podman run image ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果用户不在正确的组中,则会出现以下错误:
external preexec hook /etc/containers/pre-exec-hooks/001-check-groups.sh failed
external preexec hook /etc/containers/pre-exec-hooks/001-check-groups.sh failedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.18. 在容器中调试应用程序 复制链接链接已复制到粘贴板!
您可以使用针对故障排除的不同方面量身定做的各种命令行工具。如需更多信息,请参阅 调试容器中的应用程序。
第 6 章 可重复生成的容器构建简介 复制链接链接已复制到粘贴板!
Red Hat Enterprise Linux (RHEL)现在支持使用红帽工具 Podman 和 Buildah 可重复生成的容器构建。当用户使用相同的输入构建它们时,这个新功能减少了镜像的更改,但在不同时间。当从一个镜像版本移到较新版本的该镜像时,镜像之间的更改可能会减少从 registry 中拉取的数据量。可重复生成的容器构建对于确保供应链安全性、促进可靠的软件部署以及促进有效的调试至关重要。
在以前的版本中,升级容器镜像的大小并提高了客户有关更新有效负载大小的信息,增加了与 tarball 创建相关的现有挑战和限制。在 Konflux 等系统中,每个 Git 提交都会生成新的 tarball,这需要整个镜像的完整重新下载。mtime 更改等因素意味着,即使用户安装相同的 RPM,存储要求也会加倍,尽管底层数据没有改变。这不仅会负担 registry 存储,还强制客户端拉取新层,即使没有更改也是如此。这种情况进一步加剧了 rhel-bootc 和 RHEL AI 等环境中的问题,从而加快更新速度。
6.1. 可重复生成的容器构建的好处 复制链接链接已复制到粘贴板!
RHEL 容器可重复生成的构建会减少 registry 存储,创建较小的更新有效负载,并通过确保在源代码和构建环境没有改变时镜像层保持一致来实现更快的下载。这个过程可最大化层缓存的效率,防止冗余存储和传输相同的数据。可重复生成的容器构建的主要优点是:
- 减少 registry 存储 :当镜像被更新时,只会存储更改的层。可重复生成的构建通过防止非确定因素(timestamp、文件顺序、元数据)造成更改来确保来自同一源代码的相同镜像,从而避免了额外的存储。
- 高效和较小的更新有效负载:对于容器次要更新,如安全补丁,只需要下载更改的层,而不是整个镜像。可重复生成的构建还可确保只有受影响的层更改有源更新,这与小代码更改可更改多个层的非可重复构建不同。
- 快速下载:容器可重复生成的构建可以优化构建系统和最终用户,方法是通过高效的缓存实现更快的下载并减少网络流量。
6.2. 可重复生成的容器对不同环境的影响 复制链接链接已复制到粘贴板!
在 RHEL 上可重复生成的容器构建可确保无论构建时间或位置如何,都完全相同的容器镜像。可重复生成的容器构建对 diffrent 环境的影响有:
Konflux
- 增强的软件供应链完整性:可重复生成的容器构建增强了 Konflux 提供安全、透明软件供应链的任务。Konflux 使用可重复生成的构建来验证构建是否完全从其源代码中派生出。任何第三方都可以从同一输入重建容器,并验证输出是否位相同。另外,RHEL 可重复生成的容器构建可防止 "in-transit" 漏洞,攻击者可以破坏发布镜像,或将恶意代码注入构建过程。Konflux 可以证明发布的二进制文件与其源相匹配,从而减轻对其自身构建基础架构的攻击。
- 更高的合规性和透明性:Konflux 强制执行 SLSA 安全策略。它验证可重复生成的 RHEL 镜像的来源和久经验证,简化了合规性。Konflux 使用 Tekton 链来创建不可变的,在测试时对整个构建过程进行了签名。RHEL 的可重复生成的容器通过确保基础镜像可靠且可验证构建,为此测试增加了一个基础的信任层。
- 开发和安全工作流:可重复生成的构建可确保跨多个运行的一致性容器镜像摘要,简化了测试和调试。Konflux 利用它有效地扫描和更新 RHEL 容器中存在安全漏洞的软件包。Konflux 使用验证的 attestations 来自动阻止不合规的构建并强制实施安全策略,而不会降低灵活性。
bootc
- 可验证供应链并提高安全性:可重复生成的 RHEL 容器构建通过为可引导 OS 镜像创建更安全、可靠和透明的构建过程来增强 rhel-bootc。您可以验证是否从声明的源代码构建了一个特定的 bootc 镜像,这有助于攻击者通过损害构建管道将恶意代码注入容器镜像。
- 简化的 CI/CD 和 GitOps 工作流:您可以使用可重复生成的功能来管理其整个操作系统配置和应用程序堆栈,使用基于 Git 的工作流(GitOps)。对 Containerfile 的更改保证了所有环境中一致的可引导镜像。可重复生成的构建形成自动化 CI/CD 管道的基石。
RHEL AI
- 可重复生成的容器构建对于 RHEL AI 至关重要,因为它们提供基础一致性、安全性和效率 AI 模型开发和部署需要。RHEL AI 提供可引导的容器镜像,这意味着它将操作系统本身作为容器工件进行管理。可重复性可确保此基础 AI 环境始终一致且可信。
6.3. 在 RHEL 容器工具中实现可重复生成的 复制链接链接已复制到粘贴板!
RHEL 容器工具使用一组工具(如 Buildah、Podman 和 Skopeo)提供标准化的、无守护进程且可脚本化的工作流,以实现可重复性。这种方法可确保容器构建一次可在任何位置一致运行,解决与依赖项、环境和版本相关的潜在问题。
Buildah :
RHEL Buildah 通过对构建过程提供精细的控制来实现可重复生成的容器构建。它提供特定的选项来缓解非确定的inism 的源,如不稳定的标签、文件系统元数据和主机依赖的数据。用于可重复生成的构建的 Buildah 功能有:
修复了时间戳: Timestamps 导致主要不现性。默认情况下,文件创建和修改时间反映了当某人向容器层添加文件时,这绝不会有两次。Buildah 允许您将这些时间戳归零,或者将其设置为特定的固定值。
-
--rewrite-timestamp:此选项将层内容时间戳比-source-date-epoch晚于。另外,控制镜像创建的时间戳以及其层中文件的时间戳,主要用于实现确定性构建。 -
--source-date-epoch: 这个选项比 older-timestamp选项更灵活的选项,允许您为镜像层中的所有文件定义一个特定的、可重复生成的时间戳。它会影响镜像元数据中的创建和历史记录日期。您可以使用 CLI 标志、环境变量或 build-arg 来设置它。设置 标志后,环境中会公开声明的 ARG,用于RUN指令并获取静态主机名。另外,容器 ID 字段在提交的镜像中被清除。
-
Podman:
在面向用户的界面时,podman build 命令会将实际镜像创建委派给 Buildah 库。这意味着 Podman 通过使用与 Buildah 相同的核心功能实现可重复生成的容器构建,专注于控制构建过程中非确定的inism 的源。
Podman 命令还接受 --rewrite-timestamp 和- -source-date-epoch 选项。此外,--no-cache 选项指示 Podman 忽略其本地缓存并执行全新的构建。使用此选项有助于验证您的容器镜像可以从头开始可靠地删除。
skopeo:
Skopeo 通过引用不可变镜像摘要而不是可变标签来实现可重复生成的容器构建。Skopeo 主要传输和管理镜像,而 Buildah 等其他工具处理实际可重复生成的镜像创建。
使用 --source-date-epoch and --rewrite-timestamp 选项可以提高构建可重复性。但是,完全的可重复性无法保证。使用 COPY 指令的-- from 选项从其他镜像添加的内容,通过 RUN 指令的-- mount=from= 选项访问,或者使用 ADD 指令下载,如果您引用以后移动的镜像标签,或者如果指定 URL 中的内容发生了变化。
6.4. 使用可重复生成的容器构建 复制链接链接已复制到粘贴板!
您可以使用 --source-date-epoch 和- 选项构建可重复生成的容器镜像,将 rewrite- timestampARG SOURCE_DATE_EPOCH 添加到 ContainerFile。
流程
在运行
Buildah命令时设置这些选项。例如,要从 Containerfile 构建镜像,并将所有时间戳强制到特定时间点:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行带有一致时间戳的
podman build命令,以创建可重复生成的镜像:# Set a consistent timestamp using the last Git commit date export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
# Set a consistent timestamp using the last Git commit date export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用指定时间戳构建镜像:
podman build --source-date-epoch=${SOURCE_DATE_EPOCH} --rewrite-timestamp -t my-reproducible-app .podman build --source-date-epoch=${SOURCE_DATE_EPOCH} --rewrite-timestamp -t my-reproducible-app .Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
构建后,再次运行可重复生成的命令。如果构建真正可重复生成,
buildah inspect命令应显示相同的镜像摘要。buildah bud --build-arg --source-date-epoch=${SOURCE_DATE_EPOCH} \ --rewrite-timestamp \ -f Containerfile \ -t my-reproducible-image-2 .buildah bud --build-arg --source-date-epoch=${SOURCE_DATE_EPOCH} \ --rewrite-timestamp \ -f Containerfile \ -t my-reproducible-image-2 .Copy to Clipboard Copied! Toggle word wrap Toggle overflow 比较摘要:
buildah inspect --format '{{.Digest}}' my-reproducible-image buildah inspect --format '{{.Digest}}' my-reproducible-image-2buildah inspect --format '{{.Digest}}' my-reproducible-image buildah inspect --format '{{.Digest}}' my-reproducible-image-2Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 7 章 将软件添加到 UBI 容器中 复制链接链接已复制到粘贴板!
红帽通用基础镜像(UBI)是从 RHEL 内容的子集构建的。UBI 还提供了 RHEL 软件包的一个子集,其可以免费安装并与 UBI 一起使用。要对正在运行的容器添加或更新软件,您可以使用包含 RPM 软件包和更新的 DNF 存储库。UBI 提供了一组预先构建的语言运行时容器镜像,如 Python、Perl、Node.js、Ruby,等等。
要将 UBI 存储库中的软件包添加到正在运行的 UBI 容器中:
-
在 UBI init 和 UBI 标准镜像中,使用
dnf命令 -
在 UBI 最小镜像上,请使用
microdnf命令
直接在运行的容器中安装和使用软件包会临时添加一些软件包。更改不会保存在容器镜像中。要使软件包更改持久,请参阅 使用 Buildah 从 Containerfile 构建镜像 部分。
7.1. 使用 UBI init 镜像 复制链接链接已复制到粘贴板!
您可以使用安装和配置 Web 服务器(httpd)的 Containerfile 构建容器,以便当容器在主机系统上运行时由 systemd 服务(/sbin/init)自动启动。podman build 命令使用一个或多个 Containerfiles 中的指令和指定的构建上下文目录来构建镜像。上下文目录可以指定为存档的 URL、Git 存储库或 Containerfile。如果没有指定上下文目录,则当前工作目录被视为构建上下文,且必须包含 Containerfile。您还可以使用 --file 选项指定 Containerfile。
先决条件
-
container-tools元数据包已安装。
流程
在新目录中创建一个包含以下内容的
Containerfile:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Containerfile安装httpd软件包,启用httpd服务,以便在引导时启动,创建一个测试文件(index.html),将 Web 服务器暴露给主机(端口 80),并在容器启动时启动systemdinit 服务(/sbin/init)。构建容器:
podman build --format=docker -t mysysd .
# podman build --format=docker -t mysysd .Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:如果要使用
systemd运行容器,且在您的系统上启用了 SELinux,您必须设置container_manage_cgroup布尔值变量:setsebool -P container_manage_cgroup 1
# setsebool -P container_manage_cgroup 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行名为
mysysd_run的容器:podman run -d --name=mysysd_run -p 80:80 mysysd
# podman run -d --name=mysysd_run -p 80:80 mysysdCopy to Clipboard Copied! Toggle word wrap Toggle overflow mysysd镜像作为mysysd_run容器运行,并作为守护进程,容器的端口 80 暴露在主机系统上的端口 80 上。注意在 rootless 模式中,您必须选择主机端口号 >= 1024。例如:
podman run -d --name=mysysd -p 8081:80 mysysd
$ podman run -d --name=mysysd -p 8081:80 mysysdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要使用 < 1024 的端口号 ,您必须修改
net.ipv4.ip_unprivileged_port_start变量:sysctl net.ipv4.ip_unprivileged_port_start=80
# sysctl net.ipv4.ip_unprivileged_port_start=80Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查容器是否正在运行:
podman ps a282b0c2ad3d localhost/mysysd:latest /sbin/init 15 seconds ago Up 14 seconds ago 0.0.0.0:80->80/tcp mysysd_run
# podman ps a282b0c2ad3d localhost/mysysd:latest /sbin/init 15 seconds ago Up 14 seconds ago 0.0.0.0:80->80/tcp mysysd_runCopy to Clipboard Copied! Toggle word wrap Toggle overflow 测试 Web 服务器:
curl localhost/index.html Successful Web Server Test
# curl localhost/index.html Successful Web Server TestCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2. 使用 UBI 微镜像 复制链接链接已复制到粘贴板!
您可以使用 Buildah 工具构建 ubi-micro 容器镜像。
先决条件
-
container-tools元数据包已安装。
流程
拉取并构建
registry.access.redhat.com/ubi10/ubi-micro镜像:microcontainer=$(buildah from registry.access.redhat.com/ubi10/ubi-micro)
# microcontainer=$(buildah from registry.access.redhat.com/ubi10/ubi-micro)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 挂载可正常工作的容器根文件系统:
micromount=$(buildah mount $microcontainer)
# micromount=$(buildah mount $microcontainer)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
httpd服务安装到micromount目录中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在工作容器中卸载根文件系统:
buildah umount $microcontainer
# buildah umount $microcontainerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从工作容器创建
ubi-micro-httpd镜像:buildah commit $microcontainer ubi-micro-httpd
# buildah commit $microcontainer ubi-micro-httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示有关
ubi-micro-httpd镜像的详情:podman images ubi-micro-httpd localhost/ubi-micro-httpd latest 7c557e7fbe9f 22 minutes ago 151 MB
# podman images ubi-micro-httpd localhost/ubi-micro-httpd latest 7c557e7fbe9f 22 minutes ago 151 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3. 在订阅的主机上将软件添加到 UBI 容器中 复制链接链接已复制到粘贴板!
如果您在注册和订阅的 RHEL 主机上运行 UBI 容器,会在标准 UBI 容器以及所有 UBI 软件仓库中启用 RHEL Base 和 AppStream 存储库。
红帽权利从订阅的红帽主机传递,作为在运行 Podman 的主机上的
/usr/share/containers/mounts.conf中定义的 secret 挂载。验证挂载配置:
cat /usr/share/containers/mounts.conf /usr/share/rhel/secrets:/run/secrets
$ cat /usr/share/containers/mounts.conf /usr/share/rhel/secrets:/run/secretsCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
yum、dnf和microdnf命令应该在此路径中搜索授权数据。 - 如果路径不存在,命令无法使用红帽授权的内容,如 RHV 存储库,因为它们缺少主机拥有的密钥或内容访问权限。
- 这只适用于 RHEL 主机上红帽附带或提供的 Podman。
- 如果您安装的 Podman 不是由红帽提供的,请参阅 如何将订阅数据附加到不是由红帽提供的 Docker 中运行的容器?
7.4. 在标准 UBI 容器中添加软件 复制链接链接已复制到粘贴板!
要在标准 UBI 容器中添加软件,请禁用非 UBI dnf 存储库,以确保您构建的容器可以被重新分发。
先决条件
-
container-tools元数据包已安装。
流程
拉取并运行
registry.access.redhat.com/ubi10/ubi镜像:podman run -it --name myubi registry.access.redhat.com/ubi10/ubi
$ podman run -it --name myubi registry.access.redhat.com/ubi10/ubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将软件包添加到
myubi容器。要添加在 UBI 存储库中的软件包,请禁用除 UBI 软件仓库以外的所有 dnf 软件仓库。例如,要添加
bzip2软件包:dnf install --disablerepo= --enablerepo=ubi-10-for-x86_64-appstream-rpms --enablerepo=ubi-10-for-x86_64-baseos-rpms bzip2*
# dnf install --disablerepo= --enablerepo=ubi-10-for-x86_64-appstream-rpms --enablerepo=ubi-10-for-x86_64-baseos-rpms bzip2*Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要添加不在 UBI 存储库中的软件包,请不要禁用任何存储库。例如,要添加
zsh软件包:dnf install zsh
# dnf install zshCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要添加位于不同主机存储库中的软件包,请明确启用您需要的存储库。例如,要安装
codeready-builder-for-rhel-8-x86_64-rpms存储库中的python38-devel软件包:dnf install --enablerepo=codeready-builder-for-rhel-10-x86_64-rpms python3-devel
# dnf install --enablerepo=codeready-builder-for-rhel-10-x86_64-rpms python3-develCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
列出容器内所有启用的存储库:
dnf repolist
# dnf repolistCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 确保列出了所需的存储库。
列出所有安装的软件包:
rpm -qa
# rpm -qaCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 确保列出了所需的软件包。
安装不在 Red Hat UBI 存储库中的红帽软件包可以限制在订阅的 RHEL 系统外分发容器的能力。
7.5. 在最小的 UBI 容器中添加软件 复制链接链接已复制到粘贴板!
UBI dnf 软件仓库默认在 UBI Minimal 镜像中启用。
先决条件
-
container-tools元数据包已安装。
流程
拉取并运行
registry.access.redhat.com/ubi10/ubi-minimal镜像:podman run -it --name myubimin registry.access.redhat.com/ubi10/ubi-minimal
$ podman run -it --name myubimin registry.access.redhat.com/ubi10/ubi-minimalCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将软件包添加到
myubimin容器:要添加 UBI 存储库中的软件包,请不要禁用任何存储库。例如,要添加
bzip2软件包:microdnf install bzip2 --setopt install_weak_deps=0
# microdnf install bzip2 --setopt install_weak_deps=0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要添加位于不同主机存储库中的软件包,请明确启用您需要的存储库。例如,要安装
codeready-builder-for-rhel-8-x86_64-rpms存储库中的python38-devel软件包:microdnf install --enablerepo=codeready-builder-for-rhel-10-x86_64-rpms python3-devel --setopt install_weak_deps=0
# microdnf install --enablerepo=codeready-builder-for-rhel-10-x86_64-rpms python3-devel --setopt install_weak_deps=0Copy to Clipboard Copied! Toggle word wrap Toggle overflow --setopt install_weak_deps=false选项禁用弱依赖项的安装。弱依赖项包括建议或推荐的软件包,这些软件包不是严格要求的,但通常被默认安装。
验证
列出容器内所有启用的存储库:
microdnf repolist
# microdnf repolistCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 确保列出了所需的存储库。
列出所有安装的软件包:
rpm -qa
# rpm -qaCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 确保列出了所需的软件包。
安装不在 Red Hat UBI 存储库中的红帽软件包可以限制在订阅的 RHEL 系统外分发容器的能力。
7.6. 将软件添加到未订阅的主机上的 UBI 容器中 复制链接链接已复制到粘贴板!
在未订阅的 RHEL 系统上添加软件包时,您不必禁用任何存储库。
先决条件
-
container-tools元数据包已安装。
流程
将软件包添加到基于 UBI 标准或 UBI init 镜像的正在运行的容器中。不要禁用任何存储库。使用
podman run命令运行容器,然后使用dnf install命令在容器内使用。例如,要将
bzip2软件包添加到基于 UBI 标准的容器中:podman run -it --name myubi registry.access.redhat.com/ubi10/ubi dnf install bzip2
$ podman run -it --name myubi registry.access.redhat.com/ubi10/ubi # dnf install bzip2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,要将
bzip2软件包添加到基于 UBI init 的容器中:podman run -it --name myubimin registry.access.redhat.com/ubi10/ubi-minimal microdnf install bzip2
$ podman run -it --name myubimin registry.access.redhat.com/ubi10/ubi-minimal # microdnf install bzip2Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
列出所有启用的存储库:
要列出基于 UBI 标准或 UBI init 镜像的容器中所有启用的存储库:
dnf repolist
# dnf repolistCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要列出基于 UBI 最小容器的容器中所有启用的存储库:
microdnf repolist
# microdnf repolistCopy to Clipboard Copied! Toggle word wrap Toggle overflow
- 确保列出了所需的存储库。
列出所有安装的软件包:
rpm -qa
# rpm -qaCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 确保列出了所需的软件包。
7.7. 构建基于 UBI 的镜像 复制链接链接已复制到粘贴板!
您可以使用 Buildah 工具从 Containerfile 创建基于 UBI 的 web 服务器容器。您必须禁用所有非UBI dnf 软件仓库,以确保您的镜像只包含可重新分发的红帽软件。
对于 UBI 最小镜像,请使用 microdnf 而不是 dnf:RUN microdnf update -y && rm -rf /var/cache/yum 和 RUN microdnf install httpd -y && microdnf clean all 命令。
先决条件
-
container-tools元数据包已安装。
流程
创建
Containerfile:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 构建容器镜像:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
运行 web 服务器:
podman run -d --name=myweb -p 80:80 johndoe/webserver bbe98c71d18720d966e4567949888dc4fb86eec7d304e785d5177168a5965f64
# podman run -d --name=myweb -p 80:80 johndoe/webserver bbe98c71d18720d966e4567949888dc4fb86eec7d304e785d5177168a5965f64Copy to Clipboard Copied! Toggle word wrap Toggle overflow 测试 Web 服务器:
curl http://localhost/index.html The Web Server is Running
# curl http://localhost/index.html The Web Server is RunningCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.8. 使用 Application Stream 运行时镜像 复制链接链接已复制到粘贴板!
基于 Application Streams 的运行时镜像提供了一组容器镜像,您可以使用它们作为容器构建的基础。
支持的运行时镜像有 Python、Ruby、s2-core、s2i-base、.NET Core、PHP。运行时镜像在 红帽容器目录 中提供。
因为这些 UBI 镜像包含与旧镜像同样的基本软件,所以您可以 使用 Red Hat Software Collections Container Images 指南 了解这些镜像。
7.9. 获取 UBI 容器镜像源代码 复制链接链接已复制到粘贴板!
源代码以可下载容器镜像的形式提供给所有基于 UBI 的红帽镜像。虽然源容器镜像被打包为容器,但无法运行。要在您的系统上安装红帽源容器镜像,请使用 skopeo 命令,而不是 podman pull 命令。
源容器镜像根据其代表的二进制容器命名。例如,对于特定的标准 RHEL UBI 10 容器 registry.access.redhat.com/ubi10:8.1-397 ,附加 -source 来获取源容器镜像(registry.access.redhat.com/ubi10:8.1-397-source)。
先决条件
-
container-tools元数据包已安装。
流程
使用
skopeo copy命令将源容器镜像复制到本地目录中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
skopeo inspect命令检查源容器镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 解包所有内容:
cd $HOME/TEST for f in $(ls); do tar xvf $f; done
$ cd $HOME/TEST $ for f in $(ls); do tar xvf $f; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查结果:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果结果正确,则镜像可以使用。
注意发布容器镜像后可能需要几小时时间才能使用其相关源容器。
如需更多信息,请参阅系统中的
skopeo-copy (1)和skopeo-inspect (1)手册页。
第 8 章 使用 pod 复制链接链接已复制到粘贴板!
容器是您可以使用 Podman、Skopeo 和 Buildah 容器工具管理的最小单元。Podman pod 是一个或多个容器的组。Pod 概念是由 Kubernetes 引入的。podman pod 与 Kubernetes 定义类似。Pod 是您可以在 OpenShift 或 Kubernetes 环境中创建、部署和管理的最小计算单元。每个 Podman pod 都包括一个 infra 容器。此容器包含与 pod 关联的命名空间,允许 Podman 将其他容器连接到 pod。它允许您在 pod 中启动和停止容器,pod 将保持运行。registry.access.redhat.com/ubi10/pause 镜像上的默认 infra 容器。
8.1. 创建 pod 复制链接链接已复制到粘贴板!
您可以创建具有一个容器的 pod。
先决条件
-
container-tools元数据包已安装。
流程
创建空 pod:
podman pod create --name mypod 223df6b390b4ea87a090a4b5207f7b9b003187a6960bd37631ae9bc12c433aff The pod is in the initial state Created.
$ podman pod create --name mypod 223df6b390b4ea87a090a4b5207f7b9b003187a6960bd37631ae9bc12c433aff The pod is in the initial state Created.Copy to Clipboard Copied! Toggle word wrap Toggle overflow pod 处于 Created 的初始状态。
可选:列出所有 pod:
podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 223df6b390b4 mypod Created Less than a second ago 1 3afdcd93de3e
$ podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 223df6b390b4 mypod Created Less than a second ago 1 3afdcd93de3eCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,pod 有一个容器。
可选:列出与其关联的所有 pod 和容器:
podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD 3afdcd93de3e registry.access.redhat.com/ubi10/pause Less than a second ago Created 223df6b390b4-infra 223df6b390b4
$ podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD 3afdcd93de3e registry.access.redhat.com/ubi10/pause Less than a second ago Created 223df6b390b4-infra 223df6b390b4Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到
podman ps命令中的 pod ID 与podman pod ps命令中的 pod ID 匹配。默认 infra 容器是基于registry.access.redhat.com/ubi10/pause镜像的。在名为
mypod的现有 pod 中运行名为myubi的容器:podman run -dt --name myubi --pod mypod registry.access.redhat.com/ubi10/ubi /bin/bash 5df5c48fea87860cf75822ceab8370548b04c78be9fc156570949013863ccf71
$ podman run -dt --name myubi --pod mypod registry.access.redhat.com/ubi10/ubi /bin/bash 5df5c48fea87860cf75822ceab8370548b04c78be9fc156570949013863ccf71Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有 pod:
podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 223df6b390b4 mypod Running Less than a second ago 2 3afdcd93de3e
$ podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 223df6b390b4 mypod Running Less than a second ago 2 3afdcd93de3eCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到 pod 有两个容器。
可选:列出与其关联的所有 pod 和容器:
podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD 5df5c48fea87 registry.access.redhat.com/ubi10/ubi:latest /bin/bash Less than a second ago Up Less than a second ago myubi 223df6b390b4 3afdcd93de3e registry.access.redhat.com/ubi10/pause Less than a second ago Up Less than a second ago 223df6b390b4-infra 223df6b390b4
$ podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD 5df5c48fea87 registry.access.redhat.com/ubi10/ubi:latest /bin/bash Less than a second ago Up Less than a second ago myubi 223df6b390b4 3afdcd93de3e registry.access.redhat.com/ubi10/pause Less than a second ago Up Less than a second ago 223df6b390b4-infra 223df6b390b4Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.2. 显示 pod 信息 复制链接链接已复制到粘贴板!
了解如何显示 pod 信息。
先决条件
-
container-tools元数据包已安装。 - pod 已创建。详情请参阅 创建 pod 一节。
流程
显示在 pod 中运行的活跃进程:
要显示 pod 中容器的运行进程,请输入:
podman pod top mypod USER PID PPID %CPU ELAPSED TTY TIME COMMAND 0 1 0 0.000 24.077433518s ? 0s /pause root 1 0 0.000 24.078146025s pts/0 0s /bin/bash
$ podman pod top mypod USER PID PPID %CPU ELAPSED TTY TIME COMMAND 0 1 0 0.000 24.077433518s ? 0s /pause root 1 0 0.000 24.078146025s pts/0 0s /bin/bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要显示一个或多个 pod 中容器的资源使用情况统计的实时流,请输入:
podman pod stats -a --no-stream ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS a9f807ffaacd frosty_hodgkin -- 3.092MB / 16.7GB 0.02% -- / -- -- / -- 2 3b33001239ee sleepy_stallman -- -- / -- -- -- / -- -- / -- --
$ podman pod stats -a --no-stream ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS a9f807ffaacd frosty_hodgkin -- 3.092MB / 16.7GB 0.02% -- / -- -- / -- 2 3b33001239ee sleepy_stallman -- -- / -- -- -- / -- -- / -- --Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要显示描述 pod 的信息,请输入:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以查看 pod 中容器的信息。
从 Podman v5.0.0 开始,pod 输出始终是一个 JSON 数组,无论 pod 数量如何。
如需更多信息,请参阅系统中的 podman-pod-top (1)、podman-pod-stats (1) 和 podman-pod-inspect (1) 手册页。
8.3. 停止 pod 复制链接链接已复制到粘贴板!
您可以使用 podman pod stop 命令停止一个或多个 pod。
先决条件
-
container-tools元数据包已安装。 - pod 已创建。详情请参阅 创建 pod 一节。
流程
停止 pod
mypod:podman pod stop mypod
$ podman pod stop mypodCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出与其关联的所有 pod 和容器:
podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 5df5c48fea87 registry.redhat.io/ubi10/ubi:latest /bin/bash About a minute ago Exited (0) 7 seconds ago myubi 223df6b390b4 mypod 3afdcd93de3e registry.access.redhat.com/10/pause About a minute ago Exited (0) 7 seconds ago 8a4e6527ac9d-infra 223df6b390b4 mypod
$ podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 5df5c48fea87 registry.redhat.io/ubi10/ubi:latest /bin/bash About a minute ago Exited (0) 7 seconds ago myubi 223df6b390b4 mypod 3afdcd93de3e registry.access.redhat.com/10/pause About a minute ago Exited (0) 7 seconds ago 8a4e6527ac9d-infra 223df6b390b4 mypodCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到 pod
mypod和容器myubi都处于"Exited"状态。
8.4. 删除 pod 复制链接链接已复制到粘贴板!
您可以使用 podman pod rm 命令删除一个或多个已停止的 pod 和容器。
流程
删除 pod
mypod,请输入:podman pod rm mypod 223df6b390b4ea87a090a4b5207f7b9b003187a6960bd37631ae9bc12c433aff
$ podman pod rm mypod 223df6b390b4ea87a090a4b5207f7b9b003187a6960bd37631ae9bc12c433affCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,删除 pod 会自动移除其中的所有容器。
可选:检查是否所有容器和 pod 都已删除:
podman ps podman pod ps
$ podman ps $ podman pod psCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-pod-rm (1)手册页。
第 9 章 管理容器网络 复制链接链接已复制到粘贴板!
本章提供了有关如何在容器间通信的信息。
9.1. 列出容器网络 复制链接链接已复制到粘贴板!
在 Podman 中,有两个网络行为 - rootless 和 rootful:
- rootless 网络 - 网络会自动设置,容器没有 IP 地址。
- Rootful 网络 - 容器有一个 IP 地址。
先决条件
container-tools 元数据包已安装。
流程
以 root 用户身份列出所有网络:
podman network ls NETWORK ID NAME VERSION PLUGINS 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuning
# podman network ls NETWORK ID NAME VERSION PLUGINS 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuningCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 默认情况下,Podman 提供了一个桥接网络。
Rootful 用户的网络列表与无根用户相同。
如需更多信息,请参阅系统中的
podman-network-ls (1)手册页。
9.2. 检查网络 复制链接链接已复制到粘贴板!
对于 podman network ls 命令列出的指定网络,显示启用的插件、启用的插件、网络类型等。
先决条件
-
container-tools元数据包已安装。
流程
检查默认
podman网络:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到 IP 范围、已启用插件、网络类型和其他网络设置。
如需更多信息,请参阅系统中的
podman-network-inspect (1)手册页。
9.3. 创建网络 复制链接链接已复制到粘贴板!
使用 podman network create 命令创建新网络。默认情况下,Podman 创建一个外部网络。您可以使用 podman network create --internal 命令创建内部网络。内部网络中的容器可以和主机上的其他容器通信,但无法连接主机之外的网络,也无法从主机访问。
先决条件
-
container-tools元数据包已安装。
流程
创建名为
mynet的外部网络:podman network create mynet /etc/cni/net.d/mynet.conflist
# podman network create mynet /etc/cni/net.d/mynet.conflistCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
列出所有网络:
podman network ls NETWORK ID NAME VERSION PLUGINS 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuning 11c844f95e28 mynet 0.4.0 bridge,portmap,firewall,tuning,dnsname
# podman network ls NETWORK ID NAME VERSION PLUGINS 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuning 11c844f95e28 mynet 0.4.0 bridge,portmap,firewall,tuning,dnsnameCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到创建的
mynet网络和默认podman网络。
从 Podman 4.0 开始,如果使用 podman network create 命令创建新的外部网络,则默认启用 DNS 插件。
如需更多信息,请参阅系统中的 podman-network-create (1) 手册页。
9.4. 将容器连接到网络 复制链接链接已复制到粘贴板!
使用 podman network connect 命令,将容器连接到网络。
先决条件
-
container-tools元数据软件包已安装。 -
已使用
podman network create命令创建了网络。 - 容器已创建。
流程
将名为
mycontainer的容器连接到名为mynet的网络:podman network connect mynet mycontainer
# podman network connect mynet mycontainerCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证
mycontainer是否已连接到mynet网络:podman inspect --format='{{.NetworkSettings.Networks}}' mycontainer map[podman:0xc00042ab40 mynet:0xc00042ac60]# podman inspect --format='{{.NetworkSettings.Networks}}' mycontainer map[podman:0xc00042ab40 mynet:0xc00042ac60]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到
mycontainer已连接到mynet和podman网络。
9.5. 断开容器与网络的连接 复制链接链接已复制到粘贴板!
使用 podman network disconnect 命令,断开容器与网络的连接。
先决条件
-
container-tools元数据软件包已安装。 -
已使用
podman network create命令创建了网络。 - 容器连接到网络。
流程
将名为
mycontainer的容器与名为mynet的网络的连接:podman network disconnect mynet mycontainer
# podman network disconnect mynet mycontainerCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证
mycontainer是否从mynet网络断开连接:podman inspect --format='{{.NetworkSettings.Networks}}' mycontainer map[podman:0xc000537440]# podman inspect --format='{{.NetworkSettings.Networks}}' mycontainer map[podman:0xc000537440]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到
mycontainer从mynet网络断开连接,mycontainer仅连接到默认的podman网络。如需更多信息,请参阅系统中的
podman-network-disconnect (1)手册页。
9.6. 删除网络 复制链接链接已复制到粘贴板!
使用 podman network rm 命令删除指定的网络。
先决条件
-
container-tools元数据包已安装。
流程
列出所有网络:
podman network ls NETWORK ID NAME VERSION PLUGINS 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuning 11c844f95e28 mynet 0.4.0 bridge,portmap,firewall,tuning,dnsname
# podman network ls NETWORK ID NAME VERSION PLUGINS 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuning 11c844f95e28 mynet 0.4.0 bridge,portmap,firewall,tuning,dnsnameCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除
mynet网络:podman network rm mynet mynet
# podman network rm mynet mynetCopy to Clipboard Copied! Toggle word wrap Toggle overflow
如果移除的网络关联有关联的容器,则必须使用 podman network rm -f 命令删除容器和 pod。
验证
检查
mynet网络是否已删除:podman network ls NETWORK ID NAME VERSION PLUGINS 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuning
# podman network ls NETWORK ID NAME VERSION PLUGINS 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuningCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-network-rm (1)手册页。
9.7. 删除所有未使用的网络 复制链接链接已复制到粘贴板!
使用 podman network prune 删除所有未使用的网络。未使用的网络是一个网络,没有连接它的容器。podman network prune 命令不会删除默认的 podman 网络。
先决条件
-
container-tools元数据包已安装。
流程
删除所有未使用的网络:
podman network prune WARNING! This will remove all networks not used by at least one container. Are you sure you want to continue? [y/N] y
# podman network prune WARNING! This will remove all networks not used by at least one container. Are you sure you want to continue? [y/N] yCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证所有网络已被删除:
podman network ls NETWORK ID NAME VERSION PLUGINS 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuning
# podman network ls NETWORK ID NAME VERSION PLUGINS 2f259bab93aa podman 0.4.0 bridge,portmap,firewall,tuningCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-network-prune (1)手册页。
第 10 章 容器间的通信 复制链接链接已复制到粘贴板!
了解利用端口映射、DNS 在 pod 内解析或编排通信,来在容器、应用程序和主机系统之间建立通信。
10.1. 网络模式和层 复制链接链接已复制到粘贴板!
Podman 中有几个不同的网络模式:
-
bridge- 在默认网桥网络上创建另一个网络 -
container:<id>- 使用与容器相同的网络<id>id -
host- 使用主机网络堆栈 -
network-id- 使用一个用户定义的、由podmannetwork create 命令创建的网络 -
private- 为容器创建一个新网络 -
swig4nets- 创建一个带有swig4netns的用户网络堆栈,无根容器的默认选项 -
pasta-slirp4netns的高性能替代。从 Podman v4.4.1 开始,您可以使用pasta。 -
none- 为容器创建一个网络命名空间,但不为其配置网络接口。容器没有网络连接。 -
ns:<path>- 要加入的网络命名空间的路径
主机模式使容器可以完全访问本地系统服务,如 D-bus、一个用于进程间通信的系统(IPC),因此被视为不安全。
10.2. slirp4netns 和 pasta 之间的区别 复制链接链接已复制到粘贴板!
与 slirp4netns 相比,pasta 网络模式的显著区别包括:
-
pasta支持 IPv6 端口转发。 -
pasta比slirp4netns更高效。 -
pasta从主机复制 IP 地址,而 slirp4netns 使用预定义的 IPv4 地址。 -
pasta使用主机中的接口名称,而 slirp4netns 使用 tap0 作为接口名称。 -
pasta使用主机中的网关地址,而slirp4netns定义自己的网关地址并使用 NAT。
无根容器的默认网络模式是 slirp4netns。
10.3. 设置网络模式 复制链接链接已复制到粘贴板!
您可以使用 podman run 命令和 --network 选项来选择网络模式。
先决条件
-
container-tools模块已安装。
流程
可选:如果要使用
pasta网络模式,请安装passt软件包:{PackageManager} install passt$ {PackageManager} install passtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行基于
registry.access.redhat.com/ubi10/ubi镜像的容器:podman run --network=<netwok_mode> -d --name=myubi registry.access.redhat.com/ubi10/ubi
$ podman run --network=<netwok_mode> -d --name=myubi registry.access.redhat.com/ubi10/ubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow <netwok_mode>是所需的网络模式。另外,您可以在containers.conf文件中使用default_rootless_network_cmd选项,来切换默认的网络模式。注意无根容器的默认网络模式是
slirp4netns。
验证
验证网络模式的设置:
podman inspect --format {{.HostConfig.NetworkMode}} myubi <netwok_mode>$ podman inspect --format {{.HostConfig.NetworkMode}} myubi <netwok_mode>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.4. 检查容器的网络设置 复制链接链接已复制到粘贴板!
使用 podman inspect 命令和 --format 选项来显示 podman inspect 输出中的各个项目。
先决条件
-
container-tools元数据包已安装。
流程
显示容器的 IP 地址:
podman inspect --format='{{.NetworkSettings.IPAddress}}' <containerName># podman inspect --format='{{.NetworkSettings.IPAddress}}' <containerName>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示容器连接到的所有网络:
podman inspect --format='{{.NetworkSettings.Networks}}' <containerName># podman inspect --format='{{.NetworkSettings.Networks}}' <containerName>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示端口映射:
podman inspect --format='{{.NetworkSettings.Ports}}' <containerName># podman inspect --format='{{.NetworkSettings.Ports}}' <containerName>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.5. 容器和应用程序间的通信 复制链接链接已复制到粘贴板!
您可以在容器和应用程序之间进行通信。应用程序端口处于 listening 或 open 状态。这些端口会自动公开给容器网络,因此您可以使用这些网络来访问这些容器。默认情况下,Web 服务器侦听端口 80。使用这个流程,myubi 容器与 web-container 应用通信。
先决条件
-
container-tools元数据包已安装。
流程
启动名为
web-container的容器:podman run -dt --name=web-container docker.io/library/httpd
# podman run -dt --name=web-container docker.io/library/httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出所有容器:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b8c057333513 docker.io/library/httpd:latest httpd-foreground 4 seconds ago Up 5 seconds ago web-container
# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b8c057333513 docker.io/library/httpd:latest httpd-foreground 4 seconds ago Up 5 seconds ago web-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查容器并显示 IP 地址:
podman inspect --format='{{.NetworkSettings.IPAddress}}' web-container 10.88.0.2# podman inspect --format='{{.NetworkSettings.IPAddress}}' web-container 10.88.0.2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
myubi容器并验证 web 服务器是否正在运行:podman run -it --name=myubi ubi10/ubi curl 10.88.0.2:80
# podman run -it --name=myubi ubi10/ubi curl 10.88.0.2:80Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.6. 容器和主机间的通信 复制链接链接已复制到粘贴板!
默认情况下,podman 网络是一个桥接网络。这意味着网络设备将容器网络桥接到主机网络。
先决条件
-
container-tools元数据包已安装。 -
web-container正在运行。如需更多信息,请参阅 容器和应用程序之间的沟通。
流程
验证网桥是否已配置:
podman network inspect podman | grep bridge "type": "bridge"# podman network inspect podman | grep bridge "type": "bridge"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示主机网络配置:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到
web-container有一个podman0子网的 IP,并且网络桥接到主机。检查
web-container并显示其 IP 地址:podman inspect --format='{{.NetworkSettings.IPAddress}}' web-container 10.88.0.2# podman inspect --format='{{.NetworkSettings.IPAddress}}' web-container 10.88.0.2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 直接从主机访问
web-container:curl 10.88.0.2:80
$ curl 10.88.0.2:80Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.7. 使用端口映射在容器间通信 复制链接链接已复制到粘贴板!
在两个容器之间进行通信的最方便方法是使用公布的端口。可使用两种方式发布端口:自动或手动发布。
先决条件
-
container-tools元数据包已安装。
流程
运行未发布的容器:
podman run -dt --name=web1 ubi10/httpd-24
# podman run -dt --name=web1 ubi10/httpd-24Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行自动发布的容器:
podman run -dt --name=web2 -P ubi10/httpd-24
# podman run -dt --name=web2 -P ubi10/httpd-24Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行手动发布的容器,并发布容器端口 8080:
podman run -dt --name=web3 -p 8888:8080 ubi10/httpd-24
# podman run -dt --name=web3 -p 8888:8080 ubi10/httpd-24Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出所有容器:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到:
-
容器
web1没有公布的端口,只能通过容器网络或网桥访问。 容器
web2已自动映射端口 43595 和 42423,以分别发布应用端口 8080 和 8443。注意自动端口映射是可能的,因为
registry.access.redhat.com/10/httpd-24镜像在 Containerfile 中有EXPOSE 8080和EXPOSE 8443命令。-
容器
web3有一个手动发布的端口。主机端口 8888 映射到容器端口 8080。
-
容器
显示
web1和web3容器的 IP 地址:podman inspect --format='{{.NetworkSettings.IPAddress}}' web1 podman inspect --format='{{.NetworkSettings.IPAddress}}' web3# podman inspect --format='{{.NetworkSettings.IPAddress}}' web1 # podman inspect --format='{{.NetworkSettings.IPAddress}}' web3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 <IP>:<port> 表示法访问
web1容器:curl 10.88.0.2:8080 ... <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title> ...
# curl 10.88.0.2:8080 ... <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title> ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 localhost:<port> 表示法访问
web2容器:curl localhost:43595 ... <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title> ...
# curl localhost:43595 ... <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title> ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 <IP>:<port> 表示法访问
web3容器:curl 10.88.0.4:8080 ... <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title> ...
# curl 10.88.0.4:8080 ... <title>Test Page for the HTTP Server on Red Hat Enterprise Linux</title> ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.8. 使用 DNS 在容器间通信 复制链接链接已复制到粘贴板!
启用 DNS 插件时,请使用容器名称来处理容器。
先决条件
-
container-tools元数据软件包已安装。 -
已使用
podman network create命令创建启用了 DNS 插件的网络。
流程
运行附加到
mynet网络的接收器容器:podman run -d --net mynet --name receiver ubi10 sleep 3000
# podman run -d --net mynet --name receiver ubi10 sleep 3000Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
发送者容器并通过其名称访问接收器(receiver)容器:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
CTRL+C退出。您可以看到,
发送者(sender)容器可以使用其名称 ping接收器容器。
10.9. 在 pod 中的两个容器间通信 复制链接链接已复制到粘贴板!
同一 pod 中的所有容器共享 IP 地址、MAC 地址和端口映射。您可以使用 localhost:port 表示法在同一 pod 中的容器之间进行通信。
先决条件
-
container-tools元数据包已安装。
流程
创建名为
web-pod的 pod:podman pod create --name=web-pod
$ podman pod create --name=web-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 pod 中运行名为
web-container的 web 容器:podman container run -d --pod web-pod --name=web-container docker.io/library/httpd
$ podman container run -d --pod web-pod --name=web-container docker.io/library/httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出与其关联的所有 pod 和容器:
podman ps --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 58653cf0cf09 k8s.gcr.io/pause:3.5 4 minutes ago Up 3 minutes ago 4e61a300c194-infra 4e61a300c194 web-pod b3f4255afdb3 docker.io/library/httpd:latest httpd-foreground 3 minutes ago Up 3 minutes ago web-container 4e61a300c194 web-pod
$ podman ps --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 58653cf0cf09 k8s.gcr.io/pause:3.5 4 minutes ago Up 3 minutes ago 4e61a300c194-infra 4e61a300c194 web-pod b3f4255afdb3 docker.io/library/httpd:latest httpd-foreground 3 minutes ago Up 3 minutes ago web-container 4e61a300c194 web-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 根据 docker.io/library/fedora 镜像在
web-pod中运行容器:podman container run -it --rm --pod web-pod docker.io/library/fedora curl localhost
$ podman container run -it --rm --pod web-pod docker.io/library/fedora curl localhostCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到容器可以访问
web-container。
10.10. pod 的通信 复制链接链接已复制到粘贴板!
在创建 pod 时,您必须在 pod 中发布容器的端口。
先决条件
-
container-tools元数据包已安装。
流程
创建名为
web-pod的 pod:podman pod create --name=web-pod-publish -p 80:80
# podman pod create --name=web-pod-publish -p 80:80Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出所有 pod:
podman pod ls POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS 26fe5de43ab3 publish-pod Created 5 seconds ago 7de09076d2b3 1
# podman pod ls POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS 26fe5de43ab3 publish-pod Created 5 seconds ago 7de09076d2b3 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
web-pod中运行名为web-container的 web 容器:podman container run -d --pod web-pod-publish --name=web-container docker.io/library/httpd
# podman container run -d --pod web-pod-publish --name=web-container docker.io/library/httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出容器
podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7de09076d2b3 k8s.gcr.io/pause:3.5 About a minute ago Up 23 seconds ago 0.0.0.0:80->80/tcp 26fe5de43ab3-infra 088befb90e59 docker.io/library/httpd httpd-foreground 23 seconds ago Up 23 seconds ago 0.0.0.0:80->80/tcp web-container
# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7de09076d2b3 k8s.gcr.io/pause:3.5 About a minute ago Up 23 seconds ago 0.0.0.0:80->80/tcp 26fe5de43ab3-infra 088befb90e59 docker.io/library/httpd httpd-foreground 23 seconds ago Up 23 seconds ago 0.0.0.0:80->80/tcp web-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证可以访问
web-container:curl localhost:80
$ curl localhost:80Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.11. 将 pod 附加到容器网络 复制链接链接已复制到粘贴板!
在创建 pod 期间,将 pod 中的容器附加到网络。
先决条件
-
container-tools元数据包已安装。
流程
创建名为
pod-net的网络:podman network create pod-net /etc/cni/net.d/pod-net.conflist
# podman network create pod-net /etc/cni/net.d/pod-net.conflistCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 pod
web-pod:podman pod create --net pod-net --name web-pod
# podman pod create --net pod-net --name web-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
web-pod中运行一个名为web-container的容器:podman run -d --pod webt-pod --name=web-container docker.io/library/httpd
# podman run -d --pod webt-pod --name=web-container docker.io/library/httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示容器与之关联的 pod:
podman ps -p CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME b7d6871d018c registry.access.redhat.com/ubi10/pause:latest 9 minutes ago Up 6 minutes ago a8e7360326ba-infra a8e7360326ba web-pod 645835585e24 docker.io/library/httpd:latest httpd-foreground 6 minutes ago Up 6 minutes ago web-container a8e7360326ba web-pod
# podman ps -p CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME b7d6871d018c registry.access.redhat.com/ubi10/pause:latest 9 minutes ago Up 6 minutes ago a8e7360326ba-infra a8e7360326ba web-pod 645835585e24 docker.io/library/httpd:latest httpd-foreground 6 minutes ago Up 6 minutes ago web-container a8e7360326ba web-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示连接到容器的所有网络:
podman ps --format="{{.Networks}}" pod-net# podman ps --format="{{.Networks}}" pod-netCopy to Clipboard Copied! Toggle word wrap Toggle overflow
10.12. 为 Podman 设置 HTTP 代理变量 复制链接链接已复制到粘贴板!
要在代理服务器后面拉取镜像,您必须为 Podman 设置 HTTP 代理变量。Podman 读取环境变量 HTTP_PROXY,以判断 HTTP 代理信息。HTTP 代理信息可以配置为环境变量,或在 /etc/profile.d 下配置。
流程
为 Podman 设置代理变量。例如:
未经身份验证的代理:
cat /etc/profile.d/unauthenticated_http_proxy.sh export HTTP_PROXY=http://192.168.0.1:3128 export HTTPS_PROXY=http://192.168.0.1:3128 export NO_PROXY=example.com,172.5.0.0/16
# cat /etc/profile.d/unauthenticated_http_proxy.sh export HTTP_PROXY=http://192.168.0.1:3128 export HTTPS_PROXY=http://192.168.0.1:3128 export NO_PROXY=example.com,172.5.0.0/16Copy to Clipboard Copied! Toggle word wrap Toggle overflow 经过身份验证的代理:
cat /etc/profile.d/authenticated_http_proxy.sh export HTTP_PROXY=http://USERNAME:PASSWORD@192.168.0.1:3128 export HTTPS_PROXY=http://USERNAME:PASSWORD@192.168.0.1:3128 export NO_PROXY=example.com,172.5.0.0/16
# cat /etc/profile.d/authenticated_http_proxy.sh export HTTP_PROXY=http://USERNAME:PASSWORD@192.168.0.1:3128 export HTTPS_PROXY=http://USERNAME:PASSWORD@192.168.0.1:3128 export NO_PROXY=example.com,172.5.0.0/16Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 11 章 设置容器网络模式 复制链接链接已复制到粘贴板!
本章介绍了如何设置不同的网络模式的信息。
11.1. 使用静态 IP 运行容器 复制链接链接已复制到粘贴板!
使用 --ip 选项的 podman run 命令将容器网络接口设置为特定的 IP 地址(如 10.88.0.44)。要验证您是否正确设置了 IP 地址,请运行 podman inspect 命令。
先决条件
-
container-tools元数据包已安装。
流程
将容器网络接口设为 IP 地址 10.88.0.44:
podman run -d --name=myubi --ip=10.88.0.44 registry.access.redhat.com/ubi10/ubi efde5f0a8c723f70dd5cb5dc3d5039df3b962fae65575b08662e0d5b5f9fbe85
# podman run -d --name=myubi --ip=10.88.0.44 registry.access.redhat.com/ubi10/ubi efde5f0a8c723f70dd5cb5dc3d5039df3b962fae65575b08662e0d5b5f9fbe85Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查是否正确设置了 IP 地址:
podman inspect --format='{{.NetworkSettings.IPAddress}}' myubi 10.88.0.44# podman inspect --format='{{.NetworkSettings.IPAddress}}' myubi 10.88.0.44Copy to Clipboard Copied! Toggle word wrap Toggle overflow
11.2. 使用 systemd 为 Netavark 运行 DHCP 插件 复制链接链接已复制到粘贴板!
先决条件
-
container-tools元数据包已安装。
流程
使用 systemd 套接字启用 DHCP 代理:
systemctl enable --now netavark-dhcp-proxy.socket Created symlink /etc/systemd/system/sockets.target.wants/netavark-dhcp-proxy.socket → /usr/lib/systemd/system/netavark-dhcp-proxy.socket.
systemctl enable --now netavark-dhcp-proxy.socket Created symlink /etc/systemd/system/sockets.target.wants/netavark-dhcp-proxy.socket → /usr/lib/systemd/system/netavark-dhcp-proxy.socket.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:显示套接字单元文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个 macvlan 网络,并使用它指定您的主机接口。通常,它是您的外部接口:
podman network create -d macvlan --interface-name <LAN_INTERFACE> mv1 mv1
# podman network create -d macvlan --interface-name <LAN_INTERFACE> mv1 mv1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用新创建的网络运行容器:
podman run --rm --network mv1 -d --name test alpine top 894ae3b6b1081aca2a5d90a9855568eaa533c08a174874be59569d4656f9bc45
# podman run --rm --network mv1 -d --name test alpine top 894ae3b6b1081aca2a5d90a9855568eaa533c08a174874be59569d4656f9bc45Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
确认容器在本地子网上有一个 IP:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查容器以验证它是否使用了正确的 IP 地址:
podman container inspect test --format {{.NetworkSettings.Networks.mv1.IPAddress}} 192.168.188.36# podman container inspect test --format {{.NetworkSettings.Networks.mv1.IPAddress}} 192.168.188.36Copy to Clipboard Copied! Toggle word wrap Toggle overflow
当尝试连接到此 IP 地址时,请确保连接是从其他主机建立的。使用 macvlan 网络时,不支持来自同一主机的连接。
11.3. macvlan 插件 复制链接链接已复制到粘贴板!
大多数容器镜像都没有 DHCP 客户端,但 dhcp 插件充当容器的代理 DHCP 客户端,以便容器与 DHCP 服务器交互。
主机系统没有容器的网络访问权限。要允许主机外部到容器的网络连接,容器必须与主机在同一网络上具有 IP。macvlan 插件允许您将容器连接到与主机相同的网络。
此流程只适用于 rootfull 容器。Rootless 容器无法使用 macvlan 和 dhcp 插件。
您可以使用 podman network create --driver=macvlan 命令创建 macvlan 网络。
第 12 章 使用 Podman 将容器移植到 systemd 复制链接链接已复制到粘贴板!
Podman (Pod 管理器)是一个简单的功能齐全的容器引擎的无守护进程工具。Podman 提供了一个类似 Docker-CLI 的命令行,可以更轻松地从其他容器引擎进行转换,并启用 pod、容器和镜像的管理。
最初,Podman 并没有设计为提供整个 Linux 系统或管理服务,如启动顺序、依赖项检查和失败的服务恢复。systemd 负责完整的系统初始化。由于红帽将容器与 systemd 集成,您可以像在 Linux 系统中管理其他服务和功能一样管理 Podman 构建的 OCI 和 Docker 格式的容器。您可以使用 systemd 初始化服务来处理 pod 和容器。
使用 systemd 单元文件,您可以:
-
设置容器或 pod 以作为
systemd服务启动。 - 定义容器化服务运行的顺序,并检查依赖项(例如,确保另一个服务正在运行、文件可用或已挂载资源)。
-
使用
systemctl命令控制systemd系统的状态。
您可以使用 systemd 单元文件生成容器和 pod 的可移植描述。
12.1. 使用 Quadlets 自动生成一个 systemd 单元文件 复制链接链接已复制到粘贴板!
使用 Quadlet ,您描述如何以与常规 systemd 单元文件非常相似的格式运行一个容器。容器描述侧重于相关的容器细节,并在 systemd 下隐藏了运行容器的技术细节。在以下目录中的一个创建<CTRNAME>.container 单元文件:
-
对于 root 用户:
/usr/share/containers/systemd/或/etc/containers/systemd/ -
对于无根用户:
$HOME/.config/containers/systemd/,$XDG_CONFIG_HOME/containers/systemd/,/etc/containers/systemd/users/$(UID)或/etc/containers/systemd/users/
Quadlet 从 Podman v4.6 开始提供。
先决条件
-
container-tools元数据包已安装。
流程
创建
mysleep.container单元文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
[Container]部分中,您必须指定:-
Image- 您要运行的容器镜像 Exec- 要在容器内运行的命令这可让您使用
systemd单元文件中指定的所有其他字段。
-
根据
mysleep.container文件创建mysleep.service:systemctl --user daemon-reload
$ systemctl --user daemon-reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:检查
mysleep.service的状态:systemctl --user status mysleep.service ○ mysleep.service - The sleep container Loaded: loaded (/home/username/.config/containers/systemd/mysleep.container; generated) Active: inactive (dead)
$ systemctl --user status mysleep.service ○ mysleep.service - The sleep container Loaded: loaded (/home/username/.config/containers/systemd/mysleep.container; generated) Active: inactive (dead)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
mysleep.service:systemctl --user start mysleep.service
$ systemctl --user start mysleep.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查
mysleep.service的状态:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出所有容器:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 421c8293fc1b registry.access.redhat.com/ubi10-minimal:latest sleep 1000 30 seconds ago Up 10 seconds ago systemd-mysleep
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 421c8293fc1b registry.access.redhat.com/ubi10-minimal:latest sleep 1000 30 seconds ago Up 10 seconds ago systemd-mysleepCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,创建的容器的名称由以下元素组成:
-
systemd-前缀 systemd单元的名称,即systemd-mysleep这种命名有助于将常见容器与在
systemd单元中运行的容器区分开来。它还有助于确定容器运行在哪个单元中。如果要更改容器的名称,请使用[Container]部分中的ContainerName字段。如需更多信息,请参阅系统中的
podman-systemd.unit (5)手册页。
-
12.2. 启用 systemd 服务 复制链接链接已复制到粘贴板!
启用服务时,您可以有不同的选项。
流程
启用服务:
要在系统启动时启用服务,无论用户是否登录,输入:
systemctl enable <service>
# systemctl enable <service>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您必须将
systemd单元文件复制到/etc/systemd/system目录中。要在用户登录时启动服务并在用户注销时停止该服务,输入:
systemctl --user enable <service>
$ systemctl --user enable <service>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您必须将
systemd单元文件复制到$HOME/.config/systemd/user目录中。要允许用户在系统启动并保留日志时启动服务,请输入:
loginctl enable-linger <username>
# loginctl enable-linger <username>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
systemctl (1)和loginctl (1)手册页。
12.3. 使用 systemd 自动启动容器 复制链接链接已复制到粘贴板!
您可以使用 systemctl 命令控制 systemd 系统和服务管理器的状态。您可以以非 root 用户身份启用、启动、停止服务。若要以 root 用户身份安装服务,请省略 --user 选项。
先决条件
-
container-tools元数据包已安装。
流程
重新载入
systemd管理器配置:systemctl --user daemon-reload
# systemctl --user daemon-reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用服务
container.service,并在引导时启动它:systemctl --user enable container.service
# systemctl --user enable container.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 立即启动该服务:
systemctl --user start container.service
# systemctl --user start container.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查服务的状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以使用
systemctl is-enabled container.service命令检查服务是否已启用。
验证
列出正在运行或已退出的容器:
podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f20988d59920 registry.access.redhat.com/ubi10-minimal:latest top 12 seconds ago Up 11 seconds ago funny_zhukovsky
# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f20988d59920 registry.access.redhat.com/ubi10-minimal:latest top 12 seconds ago Up 11 seconds ago funny_zhukovskyCopy to Clipboard Copied! Toggle word wrap Toggle overflow
要停止 container.service,请输入:
systemctl --user stop container.service
# systemctl --user stop container.service
如需更多信息,请参阅系统中的 systemctl (1) 手册页。
12.4. 与 podman generate systemd 命令相比,使用 Quadlets 的优点 复制链接链接已复制到粘贴板!
您可以使用 Quadlets 工具,它描述了如何以类似于常规 systemd 单元文件的格式运行容器。
Quadlet 从 Podman v4.6 开始提供。
与使用 podman generate systemd 命令生成单元文件相比,Qadlets 有很多优点,例如:
-
易于维护 :容器描述侧重于相关的容器细节,并隐藏在
systemd下运行的容器的技术细节。 -
自动更新 :在更新后,Quadlets 不需要手动重新生成单元文件。如果发布了新版本的 Podman,则在
systemclt daemon-reload命令执行时会自动更新您的服务,例如在引导时。 - 简化的工作流 :由于简化的语法,您可以从头开始创建 Quadlet 文件,并在任何地方部署它们。
- 支持标准的 systemd 选项 :Qadlet 使用新表扩展了现有的 systemd-unit 语法,例如,配置容器的表。
Quadlet 支持 Kubernetes YAML 功能的子集。如需更多信息,请参阅 支持的 YAML 字段的支持矩阵。您可以使用以下工具之一生成 YAML 文件:
-
podman:
podman generate kube命令 -
OpenShift: 带有
--dry-run选项的oc generate命令 -
kubernetes: 带有
--dry-run选项的kubectl create命令
Quadlet 支持这些单元文件类型:
Container units : 用来通过运行
podman run命令管理容器。-
文件扩展名:
.container -
部分名称:
[Container] -
必填字段:描述服务运行的容器镜像的
Image
-
文件扩展名:
Kube units: 用来通过运行
podman kube play命令来管理 Kubernetes YAML 文件中定义的容器。-
文件扩展名:
.kube -
部分名称:
[Kube] -
必填字段:定义 Kubernetes YAML 文件路径的
Yaml
-
文件扩展名:
Network units: 用来创建可在
.container或.kube文件中引用的 Podman 网络。-
文件扩展名:
.network -
部分名称:
[Network] - 必填字段:无
-
文件扩展名:
Volume units :用来创建可在
.container文件中引用的 Podman 卷。-
文件扩展名:
.volume -
部分名称:
[Volume] - 必填字段:无
-
文件扩展名:
如需更多信息,请参阅系统中的 podman-systemd.unit (5) 手册页。
12.5. 使用 Podman 生成 systemd 单元文件 复制链接链接已复制到粘贴板!
Podman 允许 systemd 控制和管理容器进程。您可以使用 podman generate systemd 命令为现有容器和 pod 生成一个 systemd 单元文件。建议使用 podman generate systemd,因为生成的单元文件会频繁变化(通过对 Podman 的更新),并使用 podman generate systemd 确保获取最新版本的单元文件。
从 Podman v4.6 开始,您可以使用描述如何以类似于常规 systemd 单元文件的格式运行容器的 Quadlets,并在 systemd 下隐藏运行容器的复杂性。
先决条件
-
container-tools元数据包已安装。
流程
创建容器(如
myubi):podman create --name myubi registry.access.redhat.com/ubi10:latest sleep infinity 0280afe98bb75a5c5e713b28de4b7c5cb49f156f1cce4a208f13fee2f75cb453
$ podman create --name myubi registry.access.redhat.com/ubi10:latest sleep infinity 0280afe98bb75a5c5e713b28de4b7c5cb49f156f1cce4a208f13fee2f75cb453Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用容器名称或 ID 生成
systemd单元文件,并将其定向到~/.config/systemd/user/container-myubi.service文件中:podman generate systemd --name myubi > ~/.config/systemd/user/container-myubi.service
$ podman generate systemd --name myubi > ~/.config/systemd/user/container-myubi.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示生成的
systemd单元文件的内容:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Restart=on-failure行设置重启策略,并指示systemd在无法完全启动或停止服务时重启,或者在进程非零退出时重启。 -
ExecStart行描述了如何启动容器。 ExecStop行描述了如何停止和移除容器。如需更多信息,请参阅系统中的
podman-generate-systemd (1)手册页。
-
12.6. 使用 Podman 自动生成一个 systemd 单元文件 复制链接链接已复制到粘贴板!
默认情况下,Podman 为现有容器或 pod 生成一个单元文件。您可以使用 podman generate systemd --new 生成更多可移植的 systemd 单元文件。--new 标志指示 Podman 生成创建、启动和删除容器的单元文件。
从 Podman v4.6 开始,您可以使用描述如何以类似于常规 systemd 单元文件的格式运行容器的 Quadlets,并在 systemd 下隐藏运行容器的复杂性。
先决条件
-
container-tools元数据包已安装。
流程
拉取您要在系统中使用的镜像。例如,要拉取
httpd-24镜像:podman pull registry.access.redhat.com/ubi10/httpd-24
# podman pull registry.access.redhat.com/ubi10/httpd-24Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出系统上所有可用的镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi10/httpd-24 latest 8594be0a0b57 2 weeks ago 462 MB
# podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi10/httpd-24 latest 8594be0a0b57 2 weeks ago 462 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
httpd容器:podman create --name httpd -p 8080:8080 registry.access.redhat.com/ubi10/httpd-24 cdb9f981cf143021b1679599d860026b13a77187f75e46cc0eac85293710a4b1
# podman create --name httpd -p 8080:8080 registry.access.redhat.com/ubi10/httpd-24 cdb9f981cf143021b1679599d860026b13a77187f75e46cc0eac85293710a4b1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:验证容器是否已创建:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cdb9f981cf14 registry.access.redhat.com/ubi10/httpd-24:latest /usr/bin/run-http... 5 minutes ago Created 0.0.0.0:8080->8080/tcp httpd
# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cdb9f981cf14 registry.access.redhat.com/ubi10/httpd-24:latest /usr/bin/run-http... 5 minutes ago Created 0.0.0.0:8080->8080/tcp httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为
httpd容器生成一个systemd单元文件:podman generate systemd --new --files --name httpd /root/container-httpd.service
# podman generate systemd --new --files --name httpd /root/container-httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示生成的
container-httpd.servicesystemd单元文件的内容:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意使用
--new选项生成的单元文件不期望容器和 pod 存在。因此,它们会在启动服务时执行podman run命令(请参阅ExecStart行),而不是podman start命令。例如,请参阅使用 Podman 生成 systemd 单元文件一节。podman run命令使用以下命令行选项:-
--conmon-pidfile选项指向存储主机上运行的conmon进程的进程 ID 的路径。conmon进程以与容器相同的退出状态终止,允许systemd报告正确的服务状态并在需要时重启容器。 -
--cidfile选项指向存储容器 ID 的路径。 -
%t是运行时间目录根目录的路径,例如/run/user/$UserID。 -
%n是该服务的全名。
-
将单元文件复制到
/etc/systemd/system中,以便以 root 用户身份安装它们:cp -Z container-httpd.service /etc/systemd/system
# cp -Z container-httpd.service /etc/systemd/systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用并启动
container-httpd.service:systemctl daemon-reload systemctl enable --now container-httpd.service Created symlink /etc/systemd/system/multi-user.target.wants/container-httpd.service → /etc/systemd/system/container-httpd.service. Created symlink /etc/systemd/system/default.target.wants/container-httpd.service → /etc/systemd/system/container-httpd.service.
# systemctl daemon-reload # systemctl enable --now container-httpd.service Created symlink /etc/systemd/system/multi-user.target.wants/container-httpd.service → /etc/systemd/system/container-httpd.service. Created symlink /etc/systemd/system/default.target.wants/container-httpd.service → /etc/systemd/system/container-httpd.service.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查
container-httpd.service的状态:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
12.7. 使用 systemd 自动启动 pod 复制链接链接已复制到粘贴板!
您可以将多个容器作为 systemd 服务启动。请注意,system ctl 命令应该只用于 pod,不应通过 systemctl 单独启动或停止容器,因为它们由 pod 服务与内部 infra-container 一起管理。
从 Podman v4.6 开始,您可以使用描述如何以类似于常规 systemd 单元文件的格式运行容器的 Quadlets,并在 systemd 下隐藏运行容器的复杂性。
先决条件
-
container-tools元数据包已安装。
流程
创建一个空 pod,如
systemd-pod:podman pod create --name systemd-pod 11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577
$ podman pod create --name systemd-pod 11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有 pod:
podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 11d4646ba41b systemd-pod Created 40 seconds ago 1 8a428b257111 11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577
$ podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 11d4646ba41b systemd-pod Created 40 seconds ago 1 8a428b257111 11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在空 pod 中创建两个容器。例如,要在
systemd-pod中创建container0和container1:*podman create --pod systemd-pod --name container0 registry.access.redhat.com/ubi*10 top *podman create --pod systemd-pod --name container1 registry.access.redhat.com/ubi*10 top
$ *podman create --pod systemd-pod --name container0 registry.access.redhat.com/ubi*10 top $ *podman create --pod systemd-pod --name container1 registry.access.redhat.com/ubi*10 topCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出与其关联的所有 pod 和容器:
podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 24666f47d9b2 registry.access.redhat.com/ubi10:latest top 3 minutes ago Created container0 3130f724e229 systemd-pod 56eb1bf0cdfe k8s.gcr.io/pause:3.2 4 minutes ago Created 3130f724e229-infra 3130f724e229 systemd-pod 62118d170e43 registry.access.redhat.com/ubi10:latest top 3 seconds ago Created container1 3130f724e229 systemd-pod
$ podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 24666f47d9b2 registry.access.redhat.com/ubi10:latest top 3 minutes ago Created container0 3130f724e229 systemd-pod 56eb1bf0cdfe k8s.gcr.io/pause:3.2 4 minutes ago Created 3130f724e229-infra 3130f724e229 systemd-pod 62118d170e43 registry.access.redhat.com/ubi10:latest top 3 seconds ago Created container1 3130f724e229 systemd-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为新 pod 生成
systemd单元文件:podman generate systemd --files --name systemd-pod /home/user1/pod-systemd-pod.service /home/user1/container-container0.service /home/user1/container-container1.service
$ podman generate systemd --files --name systemd-pod /home/user1/pod-systemd-pod.service /home/user1/container-container0.service /home/user1/container-container1.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,生成了三个
systemd单元文件,一个用于systemd-podpod,另两个用于容器container0和container1。显示
pod-systemd-pod.service单元文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
[Unit]部分中的Requires行定义container-container0.service和container-container1.service单元文件的依赖项。两个单元文件都会被激活。 -
[Service]部分中的ExecStart和ExecStop行分别启动和停止 infra-container。
-
显示
container-container0.service单元文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
[Unit]部分中的BindsTo行定义pod-systemd-pod.service单元文件的依赖项 -
[Service]部分中的ExecStart和ExecStop行分别启动和停止container0。
-
显示
container-container1.service单元文件:cat container-container1.service
$ cat container-container1.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将所有生成的文件复制到
$HOME/.config/systemd/user中,以便以非 root 用户身份安装:cp pod-systemd-pod.service container-container0.service container-container1.service $HOME/.config/systemd/user
$ cp pod-systemd-pod.service container-container0.service container-container1.service $HOME/.config/systemd/userCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用该服务并在用户登录时启动:
systemctl enable --user pod-systemd-pod.service Created symlink /home/user1/.config/systemd/user/multi-user.target.wants/pod-systemd-pod.service → /home/user1/.config/systemd/user/pod-systemd-pod.service. Created symlink /home/user1/.config/systemd/user/default.target.wants/pod-systemd-pod.service → /home/user1/.config/systemd/user/pod-systemd-pod.service.
$ systemctl enable --user pod-systemd-pod.service Created symlink /home/user1/.config/systemd/user/multi-user.target.wants/pod-systemd-pod.service → /home/user1/.config/systemd/user/pod-systemd-pod.service. Created symlink /home/user1/.config/systemd/user/default.target.wants/pod-systemd-pod.service → /home/user1/.config/systemd/user/pod-systemd-pod.service.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,服务会在用户注销时停止。
验证
检查是否启用该服务:
systemctl is-enabled pod-systemd-pod.service enabled
$ systemctl is-enabled pod-systemd-pod.service enabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow
如需更多信息,请参阅系统中的 podman-create (1)、podman-generate-systemd (1) 和 systemctl (1) 手册页。
12.8. 使用 Podman 自动更新容器 复制链接链接已复制到粘贴板!
podman auto-update 命令允许您根据自动更新策略自动更新容器。当容器镜像在注册中心中被更新时,podman auto-update 命令会更新服务。要使用自动更新,必须使用 --label "io.containers.autoupdate=image" 标签创建容器,并在 podman generate systemd --new 命令生成的 systemd 单元中运行。
Podman 会搜索 "io.containers.autoupdate" 标签设为 "image" 的正在运行的容器,并与容器注册中心进行通信。如果镜像已更改,Podman 会重启对应的 systemd 单元来停止旧容器,并使用新镜像创建新容器。因此,容器、其环境和所有依赖项都会被重启。
从 Podman v4.6 开始,您可以使用描述如何以类似于常规 systemd 单元文件的格式运行容器的 Quadlets,并在 systemd 下隐藏运行容器的复杂性。
先决条件
-
container-tools元数据包已安装。
流程
启动一个基于
registry.access.redhat.com/ubi10/ubi-init镜像的myubi容器:podman run --label "io.containers.autoupdate=image" \ --name myubi -dt registry.access.redhat.com/ubi10/ubi-init top bc219740a210455fa27deacc96d50a9e20516492f1417507c13ce1533dbdcd9d
# podman run --label "io.containers.autoupdate=image" \ --name myubi -dt registry.access.redhat.com/ubi10/ubi-init top bc219740a210455fa27deacc96d50a9e20516492f1417507c13ce1533dbdcd9dCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出正在运行或已退出的容器:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 76465a5e2933 registry.access.redhat.com/10/ubi-init:latest top 24 seconds ago Up 23 seconds ago myubi
# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 76465a5e2933 registry.access.redhat.com/10/ubi-init:latest top 24 seconds ago Up 23 seconds ago myubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为
myubi容器生成一个systemd单元文件:podman generate systemd --new --files --name myubi /root/container-myubi.service
# podman generate systemd --new --files --name myubi /root/container-myubi.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将单元文件复制到
/usr/lib/systemd/system中,以便以 root 用户身份安装它:cp -Z ~/container-myubi.service /usr/lib/systemd/system
# cp -Z ~/container-myubi.service /usr/lib/systemd/systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新载入
systemd管理器配置:systemctl daemon-reload
# systemctl daemon-reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动并检查容器的状态:
systemctl start container-myubi.service systemctl status container-myubi.service
# systemctl start container-myubi.service # systemctl status container-myubi.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 自动更新容器:
podman auto-update
# podman auto-updateCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-generate-systemd (1)和systemctl (1)手册页。
12.9. 使用 systemd 自动更新容器 复制链接链接已复制到粘贴板!
如 使用 Podman 自动更新容器 一节中所述,您可以使用 podman auto-update 命令更新容器。它整合成自定义脚本,并在需要时调用。自动更新容器的另一种方法是使用预安装的 podman-auto-update.timer 和 podman-auto-update.service systemd 服务。podman-auto-update.timer 可以配置成在特定日期或时间触发自动更新。podman-auto-update.service 将来可由 systemctl 命令启动,或者可被其他 systemd 服务用作依赖项。因此,可以基于时间和事件的自动更新可以以各种方法触发,以满足单个需求和用例。
从 Podman v4.6 开始,您可以使用描述如何以类似于常规 systemd 单元文件的格式运行容器的 Quadlets,并在 systemd 下隐藏运行容器的复杂性。
先决条件
-
container-tools元数据包已安装。
流程
显示
podman-auto-update.service单元文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示
podman-auto-update.timer单元文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,
podman auto-update命令在每天午夜启动。在系统启动时启用
podman-auto-update.timer服务:systemctl enable podman-auto-update.timer
# systemctl enable podman-auto-update.timerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
systemd服务:systemctl start podman-auto-update.timer
# systemctl start podman-auto-update.timerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有计时器:
systemctl list-timers --all NEXT LEFT LAST PASSED UNIT ACTIVATES Wed 2020-12-09 00:00:00 CET 9h left n/a n/a podman-auto-update.timer podman-auto-update.service
# systemctl list-timers --all NEXT LEFT LAST PASSED UNIT ACTIVATES Wed 2020-12-09 00:00:00 CET 9h left n/a n/a podman-auto-update.timer podman-auto-update.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以看到
podman-auto-update.timer激活了podman-auto-update.service。
第 13 章 使用 Podman 将容器传送到 OpenShift 复制链接链接已复制到粘贴板!
您可以使用 YAML ("YAML Ain't Markup Language")格式生成容器和 pod 的可移植性描述。YAML 是一种用于描述配置数据的文本格式。
YAML 文件为:
- 可读。
- 易于生成。
- 可在环境间移植(例如,RHEL 和 OpenShift 之间)。
- 可移植编程语言。
- 方便使用(不需要在命令行中添加所有参数)。
使用 YAML 文件的原因:
- 您可以使用最小输入来重新运行本地编配的容器和 pod,这对于迭代开发非常有用。
-
您可以在另一台机器上运行相同的容器和 pod。例如,要在 OpenShift 环境中运行应用程序并确保应用程序正常工作。您可以使用
podman generate kube命令来生成 Kubernetes YAML 文件。然后,在将生成的 YAML 文件传送到 Kubernetes 或 OpenShift 环境之前,您可以使用podman play命令来测试本地系统上 pod 和容器的创建情况。使用podman play命令,您还可以重新创建最初在 OpenShift 或 Kubernetes 环境中创建的 pod 和容器。
podman kube play 命令支持 Kubernetes YAML 功能的子集。如需更多信息,请参阅 支持的 YAML 字段的支持矩阵。
13.1. 使用 Podman 生成 Kubernetes YAML 文件 复制链接链接已复制到粘贴板!
您可以创建一个带有一个容器的 pod,并使用 podman generate kube 命令生成 Kubernetes YAML 文件。
先决条件
-
container-tools元数据包已安装。 - pod 已创建。详情请参阅 创建 pod 一节。
流程
列出与其关联的所有 pod 和容器:
podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD 5df5c48fea87 registry.access.redhat.com/ubi10/ubi:latest /bin/bash Less than a second ago Up Less than a second ago myubi 223df6b390b4 3afdcd93de3e k8s.gcr.io/pause:3.1 Less than a second ago Up Less than a second ago 223df6b390b4-infra 223df6b390b4
$ podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD 5df5c48fea87 registry.access.redhat.com/ubi10/ubi:latest /bin/bash Less than a second ago Up Less than a second ago myubi 223df6b390b4 3afdcd93de3e k8s.gcr.io/pause:3.1 Less than a second ago Up Less than a second ago 223df6b390b4-infra 223df6b390b4Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 pod 名称或 ID 来生成 Kubernetes YAML 文件:
podman generate kube mypod > mypod.yaml
$ podman generate kube mypod > mypod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,
podman generate命令不反映任何可能附加到容器的逻辑卷管理器(LVM)逻辑卷或物理卷。显示
mypod.yaml文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
13.2. 在 OpenShift 环境中生成 Kubernetes YAML 文件 复制链接链接已复制到粘贴板!
在 OpenShift 环境中,使用 oc create 命令来生成描述应用程序的 YAML 文件。
流程
为您的
myapp应用程序生成 YAML 文件:oc create myapp --image=me/myapp:v1 -o yaml --dry-run > myapp.yaml
$ oc create myapp --image=me/myapp:v1 -o yaml --dry-run > myapp.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc create命令创建并运行myapp镜像。使用--dry-run选项打印对象,并重定向到myapp.yaml输出文件。
在 Kubernetes 环境中,您可以使用带有同样标志的 kubectl create 命令。
13.3. 使用 Podman 启动容器和 pod 复制链接链接已复制到粘贴板!
使用生成的 YAML 文件,您可以在任何环境中自动启动容器和 pod。可以使用 Podman 以外的工具(如 Kubernetes 或 Openshift)生成 YAML 文件。podman play kube 命令允许您根据 YAML 输入文件重新创建 pod 和容器。
先决条件
-
container-tools元数据包已安装。
流程
从
mypod.yaml文件创建 pod 和容器:podman play kube mypod.yaml Pod: b8c5b99ba846ccff76c3ef257e5761c2d8a5ca4d7ffa3880531aec79c0dacb22 Container: 848179395ebd33dd91d14ffbde7ae273158d9695a081468f487af4e356888ece
$ podman play kube mypod.yaml Pod: b8c5b99ba846ccff76c3ef257e5761c2d8a5ca4d7ffa3880531aec79c0dacb22 Container: 848179395ebd33dd91d14ffbde7ae273158d9695a081468f487af4e356888eceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出所有 pod:
podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID b8c5b99ba846 mypod Running 19 seconds ago 2 aa4220eaf4bb
$ podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID b8c5b99ba846 mypod Running 19 seconds ago 2 aa4220eaf4bbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 列出与其关联的所有 pod 和容器:
podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD 848179395ebd registry.access.redhat.com/ubi10/ubi:latest /bin/bash About a minute ago Up About a minute ago myubi b8c5b99ba846 aa4220eaf4bb k8s.gcr.io/pause:3.1 About a minute ago Up About a minute ago b8c5b99ba846-infra b8c5b99ba846
$ podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD 848179395ebd registry.access.redhat.com/ubi10/ubi:latest /bin/bash About a minute ago Up About a minute ago myubi b8c5b99ba846 aa4220eaf4bb k8s.gcr.io/pause:3.1 About a minute ago Up About a minute ago b8c5b99ba846-infra b8c5b99ba846Copy to Clipboard Copied! Toggle word wrap Toggle overflow podman ps命令中的 pod ID 与podman pod ps命令中的 pod ID 相匹配。如需更多信息,请参阅系统中的
podman-play-kube (1)手册页。
13.4. 在 OpenShift 环境中启动容器和 pod 复制链接链接已复制到粘贴板!
您可以使用 oc create 命令在 OpenShift 环境中创建 pod 和容器。
流程
从 OpenShift 环境中的 YAML 文件创建 pod:
oc create -f mypod.yaml
$ oc create -f mypod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意在 Kubernetes 环境中,您可以使用带有同样标志的
kubectl create命令。
13.5. 使用 Podman 手动运行容器和 pod 复制链接链接已复制到粘贴板!
以下流程演示了如何使用 Podman 手动创建与 MariaDB 数据库配对的 WordPress 内容管理系统。
假设以下目录布局:
├── mariadb-conf │ ├── Containerfile │ ├── my.cnf
├── mariadb-conf
│ ├── Containerfile
│ ├── my.cnf
先决条件
-
container-tools元数据包已安装。
流程
显示
mariadb-conf/Containerfile文件:cat mariadb-conf/Containerfile FROM docker.io/library/mariadb COPY my.cnf /etc/mysql/my.cnf
$ cat mariadb-conf/Containerfile FROM docker.io/library/mariadb COPY my.cnf /etc/mysql/my.cnfCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示
mariadb-conf/my.cnf文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
mariadb-conf/Containerfile构建docker.io/library/mariadb镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有镜像:
podman images LIST IMAGES REPOSITORY TAG IMAGE ID CREATED SIZE localhost/mariadb-conf latest b66fa0fa0ef2 57 seconds ago 416 MB
$ podman images LIST IMAGES REPOSITORY TAG IMAGE ID CREATED SIZE localhost/mariadb-conf latest b66fa0fa0ef2 57 seconds ago 416 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建名为
wordpresspod的 pod,并配置容器和主机系统之间的端口映射:podman pod create --name wordpresspod -p 8080:80
$ podman pod create --name wordpresspod -p 8080:80Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
wordpresspodpod 中创建mydb容器:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
wordpresspodpod 中创建myweb容器:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出与其关联的所有 pod 和容器:
podman ps --pod -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 9ea56f771915 k8s.gcr.io/pause:3.5 Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp 4b7f054a6f01-infra 4b7f054a6f01 wordpresspod 60e8dbbabac5 localhost/mariadb-conf:latest mariadbd Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp mydb 4b7f054a6f01 wordpresspod 045d3d506e50 docker.io/library/wordpress:latest apache2-foregroun... Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp myweb 4b7f054a6f01 wordpresspod
$ podman ps --pod -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 9ea56f771915 k8s.gcr.io/pause:3.5 Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp 4b7f054a6f01-infra 4b7f054a6f01 wordpresspod 60e8dbbabac5 localhost/mariadb-conf:latest mariadbd Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp mydb 4b7f054a6f01 wordpresspod 045d3d506e50 docker.io/library/wordpress:latest apache2-foregroun... Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp myweb 4b7f054a6f01 wordpresspodCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用
curl命令验证 pod 是否正在运行:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-play-kube (1)手册页。
13.6. 使用 Podman 生成 YAML 文件 复制链接链接已复制到粘贴板!
您可以使用 podman generate kube 命令生成 Kubernetes YAML 文件。
先决条件
-
container-tools元数据包已安装。 -
名为
wordpresspod的 pod 已创建。详情请参阅 创建 pod 一节。
流程
列出与其关联的所有 pod 和容器:
podman ps --pod -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 9ea56f771915 k8s.gcr.io/pause:3.5 Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp 4b7f054a6f01-infra 4b7f054a6f01 wordpresspod 60e8dbbabac5 localhost/mariadb-conf:latest mariadbd Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp mydb 4b7f054a6f01 wordpresspod 045d3d506e50 docker.io/library/wordpress:latest apache2-foregroun... Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp myweb 4b7f054a6f01 wordpresspod
$ podman ps --pod -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 9ea56f771915 k8s.gcr.io/pause:3.5 Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp 4b7f054a6f01-infra 4b7f054a6f01 wordpresspod 60e8dbbabac5 localhost/mariadb-conf:latest mariadbd Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp mydb 4b7f054a6f01 wordpresspod 045d3d506e50 docker.io/library/wordpress:latest apache2-foregroun... Less than a second ago Up Less than a second ago 0.0.0.0:8080->80/tcp myweb 4b7f054a6f01 wordpresspodCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 pod 名称或 ID 来生成 Kubernetes YAML 文件:
podman generate kube wordpresspod >> wordpresspod.yaml
$ podman generate kube wordpresspod >> wordpresspod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示
wordpresspod.yaml文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-play-kube (1)手册页。
13.7. 使用 Podman 自动运行容器和 pod 复制链接链接已复制到粘贴板!
在将生成的 YAML 文件传送到 Kubernetes 或 OpenShift 环境前,您可以使用 podman play kube 命令测试本地系统中的 pod 和容器的创建。
podman play kube 命令还可使用类似于 docker compose 命令的 YAML 文件自动构建并运行 pod 中具有多个容器的多个 pod。如果满足以下条件,会自动构建镜像:
- 存在一个名称与 YAML 文件中所用镜像相同的目录
- 该目录包含一个 Containerfile
先决条件
-
container-tools元数据包已安装。 -
名为
wordpresspod的 pod 已创建。详情请参阅使用 Podman 手动运行容器和 pod 一节。 - 已生成 YAML 文件。详情请参阅使用 Podman 生成 YAML 文件一节。
要从头重复整个场景,请删除本地存储的镜像:
podman rmi localhost/mariadb-conf podman rmi docker.io/library/wordpress podman rmi docker.io/library/mysql
$ podman rmi localhost/mariadb-conf $ podman rmi docker.io/library/wordpress $ podman rmi docker.io/library/mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
使用
wordpress.yaml文件创建 wordpress pod:Copy to Clipboard Copied! Toggle word wrap Toggle overflow podman play kube命令:-
根据
docker.io/library/mariadb镜像,自动构建localhost/mariadb-conf:latest镜像。 -
拉取
docker.io/library/wordpress:latest镜像。 -
创建名为
wordpresspod的 pod,它有两个容器,名为wordpresspod-mydb和wordpresspod-myweb。
-
根据
列出所有容器和 pod:
podman ps --pod -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME a1dbf7b5606c k8s.gcr.io/pause:3.5 3 minutes ago Up 2 minutes ago 0.0.0.0:8080->80/tcp 3e391d091d19-infra 3e391d091d19 wordpresspod 6c59ebe96846 localhost/mariadb-conf:latest mariadbd 2 minutes ago Exited (1) 2 minutes ago 0.0.0.0:8080->80/tcp wordpresspod-mydb 3e391d091d19 wordpresspod 29717878452f docker.io/library/wordpress:latest apache2-foregroun... 2 minutes ago Up 2 minutes ago 0.0.0.0:8080->80/tcp wordpresspod-myweb 3e391d091d19 wordpresspod
$ podman ps --pod -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME a1dbf7b5606c k8s.gcr.io/pause:3.5 3 minutes ago Up 2 minutes ago 0.0.0.0:8080->80/tcp 3e391d091d19-infra 3e391d091d19 wordpresspod 6c59ebe96846 localhost/mariadb-conf:latest mariadbd 2 minutes ago Exited (1) 2 minutes ago 0.0.0.0:8080->80/tcp wordpresspod-mydb 3e391d091d19 wordpresspod 29717878452f docker.io/library/wordpress:latest apache2-foregroun... 2 minutes ago Up 2 minutes ago 0.0.0.0:8080->80/tcp wordpresspod-myweb 3e391d091d19 wordpresspodCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
使用
curl命令验证 pod 是否正在运行:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-play-kube (1)手册页。
13.8. 使用 Podman 自动停止和删除 pod 复制链接链接已复制到粘贴板!
podman play kube --down 命令停止并删除所有 pod 及其容器。
如果使用卷,它不会被删除。
先决条件
-
container-tools元数据包已安装。 -
名为
wordpresspod的 pod 已创建。详情请参阅使用 Podman 手动运行容器和 pod 一节。 - 已生成 YAML 文件。详情请参阅使用 Podman 生成 YAML 文件一节。
- Pod 正在运行。详情请参阅使用 Podman 自动运行容器和 pod 一节。
流程
删除
wordpresspod.yaml文件创建的所有 pod 和容器:podman play kube --down wordpresspod.yaml Pods stopped: 3e391d091d190756e655219a34de55583eed3ef59470aadd214c1fc48cae92ac Pods removed: 3e391d091d190756e655219a34de55583eed3ef59470aadd214c1fc48cae92ac
$ podman play kube --down wordpresspod.yaml Pods stopped: 3e391d091d190756e655219a34de55583eed3ef59470aadd214c1fc48cae92ac Pods removed: 3e391d091d190756e655219a34de55583eed3ef59470aadd214c1fc48cae92acCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证
wordpresspod.yaml文件创建的所有 pod 和容器已被删除:podman ps --pod -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME
$ podman ps --pod -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-play-kube (1)手册页。
第 14 章 使用 RHEL 系统角色管理容器 复制链接链接已复制到粘贴板!
使用 podman RHEL 系统角色,您可以管理 Podman 配置、容器以及运行 Podman 容器的 systemd 服务。
14.1. 为 Podman 和其他容器工具配置镜像 registry 管理 复制链接链接已复制到粘贴板!
使用 podman RHEL 系统角色,您可以在多个 RHEL 系统中自动化 Podman 管理,包括 registry 配置。您可以在 Ansible playbook 中定义所需的 registry 配置,而不是手动编辑文件。
podman RHEL 系统角色使用 podman_registries_conf 变量,它接受包含 registry 设置的字典。然后,该角色会创建一个置入文件,例如在 /etc/containers/registries.conf.d/ 中应用您的配置,遵循管理系统配置的最佳实践。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有这些节点的
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
-
Unqualified-search-registries:在使用简短镜像名称时(例如podman pull <my-image> )时,扩展 registry Podman 搜索的列表。Podman 在默认 registry 后搜索 my-company-registry.com 中的镜像。 -
[registry]: 定义给定 registry 的特定属性。例如,您可以通过将insecure=true设置为运行在 my-local-registry:5000 的本地 registry 来启用不安全连接。
-
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow podman_use_new_toml_formatter变量生成与 Podman 兼容的 TOML 配置文件。此变量通过 true TOML 格式而不是之前使用的 Jinja 模板,支持所有 TOML 功能(包括表和内联表)来增强 Podman 角色。默认情况下禁用新格式器,以保持与之前格式器的行为的兼容性。要启用新格式器,请在配置中设置
podman_use_new_toml_formatter: true:
验证
在主机上运行
podman info命令:ansible managed-node-01.example.com -m command -a 'podman info'
$ ansible managed-node-01.example.com -m command -a 'podman info'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证 registeries 部分:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.2. 使用 podman RHEL 系统角色创建带有绑定挂载的无根容器 复制链接链接已复制到粘贴板!
您可以使用 podman RHEL 系统角色,通过运行 Ansible playbook 来创建带有绑定挂载的无根容器,并管理应用程序配置。
示例 Ansible playbook 启动两个 Kubernetes pod:一个用于数据库,另一个用于 web 应用。数据库 pod 配置在 playbook 中指定,而 Web 应用 Pod 在一个外部 YAML 文件中定义。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有这些节点的
sudo权限。 -
用户和组
webapp存在,且必须列在主机上的/etc/subuid和/etc/subgid文件中。 -
必须已创建名为
dbuser和名为dbgroup的组。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
run_as_user和run_as_group- 指定容器是无根的。
kube_file_content包含一个定义名为
db的第一个容器的 Kubernetes YAML 文件。您可以使用podman kube generate命令生成 Kubernetes YAML 文件。-
db容器是基于quay.io/db/db:stable容器镜像。 -
db绑定挂载将主机上的/var/lib/db目录映射到容器中的/var/lib/db目录。Z标志使用私有的 unshared 标签标记内容,因此只有db容器才能访问内容。
-
kube_file_src: <path>-
定义第二个容器。控制器节点上
/path/to/webapp.yml文件的内容将复制到受管节点上的kube_file字段中。 volumes: <list>-
一个定义要在一个或多个容器中提供数据源的 YAML 列表。例如,主机上的本地磁盘(
hostPath)或其他磁盘设备。 volumeMounts: <list>- 一个定义目标的 YAML 列表,其中单个容器将挂载一个给定卷。
podman_create_host_directories: true-
在主机上创建目录。这指示角色检查
hostPath卷的 kube 规格,并在主机上创建这些目录。如果您需要对所有权和权限有更多的控制,请使用podman_host_directories。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.podman/README.md文件。验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
14.3. 使用 podman RHEL 系统角色创建一个带有 Podman 卷的有根容器 复制链接链接已复制到粘贴板!
您可以使用 podman RHEL 系统角色,通过运行 Ansible playbook 来创建一个带有 Podman 卷的有根容器,并管理应用程序配置。
示例 Ansible playbook 部署一个名为 ubi10-httpd 的 Kubernetes pod,从 registry.access.redhat.com/ubi10/httpd-24 镜像运行一个 HTTP 服务器容器。容器的 Web 内容挂载自名为 ubi10-html-volume 的持久卷。默认情况下,podman 角色创建有根容器。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有这些节点的
sudo权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例 playbook 中指定的设置包括如下:
kube_file_content包含一个定义名为
db的第一个容器的 Kubernetes YAML 文件。您可以使用podman kube generate命令生成 Kubernetes YAML 文件。-
ubi10-httpd容器基于registry.access.redhat.com/ubi10/httpd-24容器镜像。 -
ubi10-html-volume将主机上的/var/www/html目录映射到容器。Z标志使用私有的 unshared 标签标记内容,因此只有ubi10-httpd容器可以访问其内容。 -
pod 使用挂载路径
/var/www/html,挂载名为ubi10-html-volume的现有持久性卷。
-
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.podman/README.md文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
14.4. 使用 podman RHEL 系统角色创建一个带有 secret 的 Quadlet 应用程序 复制链接链接已复制到粘贴板!
您可以使用 podman RHEL 系统角色,通过运行 Ansible playbook 来创建一个带有 secret 的 Quadlet 应用程序。
先决条件
- 您已准备好控制节点和受管节点。
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
用于连接到受管节点的帐户具有这些节点的
sudo权限。 -
容器中的 web 服务器应使用的证书和相应的私钥存储在
~/certificate.pem和~/key.pem文件中。
流程
显示证书和私钥文件的内容:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您在后续步骤中需要此信息。
将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ansible-vault create命令打开编辑器后,以<key>: <value>格式输入敏感数据:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
certificate和key变量中的所有行都以两个空格开头。- 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 流程创建一个与 MySQL 数据库配对的 WordPress 内容管理系统。
podman_quadlet_specs 角色变量为 Quadlet 定义一组配置,它指向以某种方式一起工作的一组容器或服务。它包括以下规范:-
Wordpress 网络由
quadlet-demo网络单元定义。 -
MySQL 容器的卷配置由
file_src: quadlet-demo-mysql.volume字段定义。 -
template_src: quadlet-demo-mysql.container.j2字段用于为 MySQL 容器生成一个配置。 -
两个 YAML 文件如下:
file_src: envoy-proxy-configmap.yml和file_src: quadlet-demo.yml.请注意,.yml 不是一个有效的 Quadlet 单元类型,因此这些文件将只被复制,且不会作为 Quadlet 规范来处理。 Wordpress 和 envoy 代理容器和配置由
file_src: quadlet-demo.kube字段定义。kube 单元将之前[Kube]部分中的 YAML 文件称为Yaml=quadlet-demo.yml和ConfigMap=envoy-proxy-configmap.yml。有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.podman/README.md文件。
-
Wordpress 网络由
验证 playbook 语法:
ansible-playbook --syntax-check --ask-vault-pass ~/playbook.yml
$ ansible-playbook --syntax-check --ask-vault-pass ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 15 章 使用 RHEL web 控制台管理容器镜像 复制链接链接已复制到粘贴板!
您可以使用 RHEL web 控制台基于 Web 的界面来拉取、修剪或删除您的容器镜像。
15.1. 在 web 控制台中拉取容器镜像 复制链接链接已复制到粘贴板!
您可以将容器镜像下载到本地系统,并使用它们创建容器。
先决条件
您已安装了 RHEL 10 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
cockpit-podman附加组件已安装:dnf install cockpit-podman
# dnf install cockpit-podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
- 登录到 RHEL 10 web 控制台。
- 点主菜单中的 Podman containers。
- 在 Images 表中,单击右上角的溢出菜单,然后选择 Download new image。
- 此时 Search for an image 对话框打开。
- 在 Search for 字段中,输入镜像的名称或指定其描述。
- 在 in 下拉列表中,选择要从中拉取镜像的注册中心。
- 可选:在 Tag 字段中输入镜像的标签。
- 点 。
验证
- 点主菜单中的 Podman containers。您可以在 Images 表中看到新下载的镜像。
您可以通过点 Images 表中的 按钮从下载的镜像创建容器。要创建容器,请按照 在 web 控制台中创建容器 中的步骤 3-8。
15.2. 在 web 控制台中修剪容器镜像 复制链接链接已复制到粘贴板!
您可以删除没有任何基于它的容器的所有未使用的镜像。
先决条件
- 至少一个容器镜像已拉取。
- 您已安装了 RHEL 10 web 控制台。具体步骤请参阅安装并启用 Web 控制台。
cockpit-podman附加组件已安装:dnf install cockpit-podman
# dnf install cockpit-podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
- 登录到 RHEL 10 web 控制台。
- 点主菜单中的 Podman containers。
- 在 Images 表中,单击右上角的溢出菜单,然后选择 Prune unused images。
- 此时会出现带有镜像列表的弹出窗口。点 Prune 确认您的选择。
验证
- 点主菜单中的 Podman containers。删除的镜像不应列在 Images 表中。
15.3. 在 web 控制台中删除容器镜像 复制链接链接已复制到粘贴板!
您可以使用 Web 控制台删除之前拉取的容器镜像。
先决条件
- 至少一个容器镜像已拉取。
- 您已安装了 RHEL 10 web 控制台。
cockpit-podman附加组件已安装:dnf install cockpit-podman
# dnf install cockpit-podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
- 登录到 RHEL 10 web 控制台。
-
在主菜单中,单击
Podman containers按钮。 - 在 Images 表中,选择您要删除的镜像,然后点溢出菜单并选择 Delete。
- 此时会出现一个窗口。点 Delete tagged images 确认您的选择。
验证
- 点主菜单中的 Podman containers。删除的容器不应列在 Images 表中。
第 16 章 使用 RHEL web 控制台管理容器 复制链接链接已复制到粘贴板!
您可以使用 RHEL web 控制台管理容器和 pod。使用 Web 控制台,您可以以非 root 或 root 用户身份创建容器。
- 作为 root 用户,您可以使用额外的特权和选项创建系统容器。
作为 非 root 用户,您有两个选项:
- 要仅创建用户容器,您可以在其默认模式 - Limited access 中使用 Web 控制台。
- 要创建用户和系统容器,请单击 Web 控制台页面顶部面板中的 Administrative access。
有关根和无根容器之间的区别的详情,请参阅 无根容器的特殊注意事项。
16.1. 在 web 控制台中创建一个容器检查点 复制链接链接已复制到粘贴板!
使用 Web 控制台,您可以对正在运行的容器或单个应用程序设置检查点,并将其状态保存到磁盘中。
创建检查点仅适用于系统容器。
先决条件
- 容器正在运行。
您已安装了 RHEL 10 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
cockpit-podman附加组件已安装:dnf install cockpit-podman
# dnf install cockpit-podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
- 登录到 RHEL 10 web 控制台。
- 点主菜单中的 Podman containers。
- 在 Containers 表中,选择您要修改的容器,点击溢出图标菜单,并选择 Checkpoint。
可选:在 Checkpoint container 表单中,检查您需要的选项:
- 保留所有临时检查点文件:保留检查点过程中 CRIU 创建的所有临时日志和统计文件。如果检查点失败,这些文件不会被删除,以便做进一步调试。
- 将检查点写入磁盘后继续运行:使容器在检查点后继续运行,而不是停止。
- 支持保留建立的 TCP 连接
- 点 。
验证
- 点主菜单中的 Podman containers。选择您进行了检查点的容器,点溢出菜单图标,并验证是否有 Restore 选项。
16.2. 在 web 控制台中恢复容器检查点 复制链接链接已复制到粘贴板!
您可以在重启时同时使用保存的数据来恢复容器。
创建检查点仅适用于系统容器。
先决条件
- 已对容器执行了检查点。
- 您已安装了 RHEL 10 web 控制台。具体步骤请参阅安装并启用 Web 控制台。
cockpit-podman附加组件已安装:dnf install cockpit-podman
# dnf install cockpit-podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
- 登录到 RHEL 10 web 控制台。
- 点主菜单中的 Podman containers。
- 在 Containers 表中,选择您要修改的容器,点击溢出菜单,并选择 Restore。
可选:在 Restore container 表单中,检查您需要的选项:
- 保留所有临时检查点文件 :在检查点过程中保留 CRIU 创建的所有临时日志和统计文件。如果检查点失败,这些文件不会被删除,以便做进一步调试。
- 使用建立的 TCP 连接恢复
- 如果静态设置,请忽略 IP 地址 :如果容器是使用 IP 地址启动的,则恢复的容器也会尝试使用该 IP 地址,如果该 IP 地址已在使用,则恢复会失败。如果您在创建容器时在 Integration 选项卡中添加了端口映射,则此选项适用。
- 如果静态设置,请忽略 MAC 地址 :如果容器是使用 MAC 地址启动的,则恢复的容器也尝试使用该 MAC 地址,如果该 MAC 地址已在使用,则恢复会失败。
- 点 。
验证
- 点主菜单中的 Podman containers。您可以看到 Containers 表中恢复的容器正在运行。
16.3. 在 web 控制台中创建 pod 复制链接链接已复制到粘贴板!
您可以在 RHEL web 控制台界面中创建 pod。
先决条件
您已安装了 RHEL 10 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
cockpit-podman附加组件已安装:dnf install cockpit-podman
# dnf install cockpit-podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
- 登录到 RHEL 10 web 控制台。
- 点主菜单中的 Podman containers。
- 点 。
在 Create pod 表单中提供所需的信息:
- 仅适用于管理访问 :选择容器的所有者 :系统或用户。
- 在 Name 字段中输入容器的名称。
点 ,来添加容器和主机系统之间的端口映射。
- 输入 IP 地址、主机端口、容器端口和协议。
点 添加卷。
- 输入主机路径,容器路径。您可以选中 Writable 复选框来创建可写卷。在 SELinux 下拉列表中,选择以下一个选项: No Label、Share 或 Private。
- 点 。
验证
- 点主菜单中的 Podman containers。您可以在 Containers 表中看到新创建的 pod。
16.4. 在 web 控制台中在 pod 中创建容器 复制链接链接已复制到粘贴板!
您可以在 pod 中创建容器。
先决条件
您已安装了 RHEL 10 web 控制台。
具体步骤请参阅安装并启用 Web 控制台。
cockpit-podman附加组件已安装:dnf install cockpit-podman
# dnf install cockpit-podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
- 登录到 RHEL 10 web 控制台。
- 点主菜单中的 Podman containers。
- 点 。
- 在 Name 字段中输入容器的名称。
在 Details 选项卡中提供所需的信息。
- 仅适用于管理访问 :选择容器的所有者 :系统或用户。
在 Image 下拉列表中,选择或搜索所选注册中心中的容器镜像。
- 可选:选中 Pull latest image 复选框,来拉取最新的容器镜像。
Command 字段指定命令。如果需要,您可以更改默认命令。
- 可选:选中 With terminal 复选框,来使用终端运行容器。
- Memory limit 字段指定容器的内存限制。要更改默认的内存限制,请选中复选框并指定限制。
- 仅适用于系统容器 :在 CCPU shares field 中,指定 CPU 时间的相对量。默认值为 1024。选中复选框以修改默认值。
仅适用于系统容器 :在 Restart policy 下拉菜单中,选择以下一个选项:
- No(默认值):无操作。
- On Failure :失败时重启容器。
- Always :在退出或系统引导时重启容器。
在 Integration 选项卡中提供所需的信息。
点 ,来在容器和主机系统之间添加端口映射。
- 输入 IP 地址、Host port、Container port 和 Protocol。
点 添加卷。
- 输入 host path、Container path。您可以选择 Writable 选项复选框来创建一个可写卷。在 SELinux 下拉列表中,选择以下选项之一:No Label,Shared 或 Private。
单击 来添加环境变量。
- 输入 Key 和 Value。
在 Health check 选项卡中提供所需的信息。
- 在 Command 字段中,输入健康检查命令。
指定健康检查选项:
- Interval(默认为 30 秒)
- Timeout(默认为 30 秒)
- Start period
- Retries (默认为 3)
在不健康时:选择以下一个选项:
- No action(默认):不执行任何操作。
- Restart :重启容器。
- Stop :停止容器。
Force stop: 强制停止容器,它不会等待容器退出。
注意容器和 pod 的所有者是相同的。在 pod 中,您可以检查容器,更改容器的状态、提交容器或删除容器。
验证
- 点主菜单中的 Podman containers。您可以在 Containers 表下的 pod 中看到新创建的容器。
第 17 章 在容器中运行 Skopeo、Buildah 和 Podman 复制链接链接已复制到粘贴板!
您可以在容器中运行 Skopeo、Buildah 和 Podman。
使用 Skopeo,您可以检查远程注册中心中的镜像,而无需下载整个镜像及其所有层。您还可以使用 Skopeo 来复制镜像、签名镜像、同步镜像以及在不同格式和层压缩间转换镜像。
Buildah 处理对 OCI 容器镜像的构建。使用 Buildah,您可以创建一个可运行的容器,可以从头开始,也可以使用一个镜像作为起点。您可以从正常工作的容器或使用 Containerfile 中的指令来创建镜像。您可以挂载和卸载正常工作容器的根文件系统。
借助 Podman,您可以管理容器和镜像、挂载到这些容器的卷,以及容器组构成的 pod。Podman 是基于容器生命周期管理的 libpod 库。libpod 库提供用于管理容器、Pod、容器镜像和卷的 API。
在容器中运行 Buildah、Skopeo 和 Podman 的原因:
CI/CD 系统 :
- Podman 和 Skopeo :您可以在 Kubernetes 中运行 CI/CD 系统,或者使用 OpenShift 来构建容器镜像,并在不同的容器注册表之间分发这些镜像。要将 Skopeo 集成到 Kubernetes 工作流中,您需要在容器中运行它。
-
Buildah:您希望在 Kubernetes 或 OpenShift CI/CD 系统中构建持续构建镜像的 OCI/container 镜像。在以前的版本中,人们使用 Docker 套接字连接到容器引擎,并执行
docker build命令。这等同于为系统提供了 root 访问权限,而不需要不安全的密码。因此,红帽建议在容器中使用 Buildah。
不同的版本 :
- All :您正在主机上运行一个旧的操作系统,但您想要运行最新版本的 Skopeo、Buildah 或 Podman。解决方法是在容器中运行容器工具。例如,这对在无法原生访问最新版本的 Red Hat Enterprise Linux 7 容器主机上运行 Red Hat Enterprise Linux 8 提供的最新版本的容器工具很有用。
HPC 环境 :
- All :HPC 环境中的一个常见的限制是不允许非 root 用户在主机上安装软件包。当您在容器中运行 Skopeo、Buildah 或 Podman 时,您可以以非 root 用户身份执行这些特定的任务。
17.1. 在容器中运行 Skopeo 复制链接链接已复制到粘贴板!
您可以使用 Skopeo 检查远程容器镜像。在容器中运行 Skopeo 意味着容器根文件系统与主机 root 文件系统分离。要在主机和容器间共享或复制文件,您必须挂载文件和目录。
先决条件
-
container-tools元数据包已安装。
流程
登录到 registry.redhat.io 注册中心:
podman login registry.redhat.io Username: myuser@mycompany.com Password: <password> Login Succeeded!
$ podman login registry.redhat.io Username: myuser@mycompany.com Password: <password> Login Succeeded!Copy to Clipboard Copied! Toggle word wrap Toggle overflow 获取
registry.redhat.io/rhel10/skopeo容器镜像:podman pull registry.redhat.io/rhel10/skopeo
$ podman pull registry.redhat.io/rhel10/skopeoCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Skopeo 检查远程容器镜像
registry.access.redhat.com/ubi10/ubi:Copy to Clipboard Copied! Toggle word wrap Toggle overflow --rm选项会在容器退出后删除registry.redhat.io/rhel10/skopeo镜像。
17.2. 使用凭证在容器中运行 Skopeo 复制链接链接已复制到粘贴板!
使用容器 registry 需要进行身份验证才能访问和更改数据。Skopeo 支持各种指定凭证的方法。
通过这种方法,您可以使用 --cred USERNAME[:PASSWORD] 选项在命令行中指定凭据。
先决条件
-
container-tools元数据包已安装。
流程
使用 Skopeo 根据锁定的注册中心检查远程容器镜像:
podman run --rm registry.redhat.io/rhel10/skopeo inspect --creds $USER:$PASSWORD docker://$IMAGE
$ podman run --rm registry.redhat.io/rhel10/skopeo inspect --creds $USER:$PASSWORD docker://$IMAGECopy to Clipboard Copied! Toggle word wrap Toggle overflow
17.3. 使用 authfile 在容器中运行 Skopeo 复制链接链接已复制到粘贴板!
您可以使用身份验证文件(authfile)来指定凭证。skopeo login 命令登录到特定的注册中心,并将身份验证令牌存储在 authfile 中。使用 authfile 的优点是,无需重复输入凭证。
当在同一主机上运行时,所有容器工具,如 Skopeo、Buildah 和 Podman 共享相同的 authfile。在容器中运行 Skopeo 时,您必须通过在容器中卷挂载 authfile 来共享主机上的 authfile,或者您必须在容器内重新验证。
先决条件
-
container-tools元数据包已安装。
流程
使用 Skopeo 根据锁定的注册中心检查远程容器镜像:
podman run --rm -v $AUTHFILE:/auth.json registry.redhat.io/rhel10/skopeo inspect docker://$IMAGE
$ podman run --rm -v $AUTHFILE:/auth.json registry.redhat.io/rhel10/skopeo inspect docker://$IMAGECopy to Clipboard Copied! Toggle word wrap Toggle overflow -v $AUTHFILE:/auth.json选项会将 authfile 卷挂载在容器中的 /auth.json 处。Skopeo 现在可以访问主机上的 authfile 中的身份验证令牌,并获得对注册中心的安全访问。
其他 Skopeo 命令的工作方式类似,例如:
-
使用
skopeo-copy命令,通过--source-creds和--dest-creds选项在命令行中为源和目标镜像指定凭据。它还读取/auth.jsonauthfile。 -
如果要为源和目标镜像指定单独的 authfile,请使用
--source-authfile和--dest-authfile选项,并将这些 authfiles 从主机卷挂载到容器中。
17.4. 将容器镜像复制到主机或从主机复制 复制链接链接已复制到粘贴板!
Skopeo、Buildah 和 Podman 共享相同的本地容器镜像存储。如果要将容器复制到主机容器存储或从主机容器存储中复制,则需要将其挂载到 Skopeo 容器中。
到主机容器存储的路径在 root 用户(/var/lib/containers/storage)和非 root 用户($HOME/.local/share/containers/storage)之间有所不同。
先决条件
-
container-tools元数据包已安装。
流程
将
registry.access.redhat.com/ubi10/ubi镜像复制到本地容器存储中:podman run --privileged --rm -v $HOME/.local/share/containers/storage:/var/lib/containers/storage \ registry.redhat.io/rhel10/skopeo skopeo copy \ docker://registry.access.redhat.com/ubi10/ubi containers-storage:registry.access.redhat.com/ubi10/ubi
$ podman run --privileged --rm -v $HOME/.local/share/containers/storage:/var/lib/containers/storage \ registry.redhat.io/rhel10/skopeo skopeo copy \ docker://registry.access.redhat.com/ubi10/ubi containers-storage:registry.access.redhat.com/ubi10/ubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
privileged选项禁用所有安全机制。红帽建议仅在可信环境中使用这个选项。 为了避免禁用安全机制,请将镜像导出到 tarball 或其它基于路径的镜像传输,并将其挂载到 Skopeo 容器中:
-
$ podman save --format oci-archive -o oci.tar $IMAGE -
$ podman run --rm -v oci.tar:/oci.tar registry.redhat.io/rhel10/skopeo copy oci-archive:/oci.tar $DESTINATION
-
-
可选:列出本地存储中的镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi10/ubi latest ecbc6f53bba0 8 weeks ago 211 MB
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi10/ubi latest ecbc6f53bba0 8 weeks ago 211 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow
17.5. 在容器中运行 Buildah 复制链接链接已复制到粘贴板!
流程演示了如何在容器中运行 Buildah,并根据镜像创建可正常工作的容器。
先决条件
-
container-tools元数据包已安装。
流程
登录到 registry.redhat.io 注册中心:
podman login registry.redhat.io Username: myuser@mycompany.com Password: <password> Login Succeeded!
$ podman login registry.redhat.io Username: myuser@mycompany.com Password: <password> Login Succeeded!Copy to Clipboard Copied! Toggle word wrap Toggle overflow 拉取并运行
registry.redhat.io/rhel10/buildah镜像:podman run --rm --device /dev/fuse -it \ registry.redhat.io/rhel10/buildah /bin/bash
# podman run --rm --device /dev/fuse -it \ registry.redhat.io/rhel10/buildah /bin/bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
--rm选项会在容器退出后删除registry.redhat.io/rhel10/buildah镜像。 -
device选项将主机设备添加到容器中。 -
sys_chroot- 能够更改为不同的根目录。它不包含在容器的默认功能中。
-
使用
registry.access.redhat.com/ubi10/镜像创建一个新容器:buildah from registry.access.redhat.com/ubi10/ ... ubi10/-working-container
# buildah from registry.access.redhat.com/ubi10/ ... ubi10/-working-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ubi10/-working-container容器中运行ls /命令:buildah run --isolation=chroot ubi10/-working-container ls / bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv
# buildah run --isolation=chroot ubi10/-working-container ls / bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srvCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出本地存储中的所有镜像:
buildah images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi10/ latest ecbc6f53bba0 5 weeks ago 211 MB
# buildah images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi10/ latest ecbc6f53bba0 5 weeks ago 211 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出工作容器及其基础镜像:
buildah containers CONTAINER ID BUILDER IMAGE ID IMAGE NAME CONTAINER NAME 0aaba7192762 * ecbc6f53bba0 registry.access.redhat.com/ub... ubi10/-working-container
# buildah containers CONTAINER ID BUILDER IMAGE ID IMAGE NAME CONTAINER NAME 0aaba7192762 * ecbc6f53bba0 registry.access.redhat.com/ub... ubi10/-working-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:将
registry.access.redhat.com/ubi10/镜像推送到位于registry.example.com上的本地注册中心:buildah push ecbc6f53bba0 registry.example.com:5000/ubi10/ubi
# buildah push ecbc6f53bba0 registry.example.com:5000/ubi10/ubiCopy to Clipboard Copied! Toggle word wrap Toggle overflow
17.6. 特权和非特权 Podman 容器 复制链接链接已复制到粘贴板!
默认情况下,Podman 容器是非特权的,例如无法修改主机上操作系统的某些部分。这是因为默认情况下,仅允许容器对设备进行有限的访问。
下表强调了特权容器的重要属性:您可以使用 podman run --privileged <image_name> 命令运行特权容器。
- 特权容器被授予与启动容器的用户相同的设备访问权限。
- 特权容器禁用将容器与主机隔离的安全功能。丢弃的功能、有限的设备、只读挂载点、Apparmor/SELinux 隔离和 Seccomp 过滤器都被禁用。
- 特权容器不能比启动它们的帐户具有更多的特权。
17.7. 运行带扩展权限的 Podman 复制链接链接已复制到粘贴板!
如果您无法在 rootless 环境中运行工作负载,则需要以 root 用户身份运行这些工作负载。运行具有扩展特权的容器应谨慎,因为它禁用了所有安全功能。
先决条件
-
container-tools元数据包已安装。
流程
在 Podman 容器中运行 Podman 容器:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
根据
registry.access.redhat.com/ubi10/podman镜像,运行名为privileged_podman的外部容器。 -
--privileged选项禁用将容器与主机隔离的安全功能。 -
运行
podman run ubi10 echo hello命令,以基于ubi10镜像创建内容器。 -
请注意,
ubi10短镜像名称被解析为别名。因此,拉取了registry.access.redhat.com/ubi10:latest镜像。
验证
列出所有容器:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 52537876caf4 registry.access.redhat.com/ubi10/podman podman run ubi10 e... 30 seconds ago Exited (0) 13 seconds ago privileged_podman
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 52537876caf4 registry.access.redhat.com/ubi10/podman podman run ubi10 e... 30 seconds ago Exited (0) 13 seconds ago privileged_podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-run (1)手册页。
17.8. 运行具有较少特权的 Podman 复制链接链接已复制到粘贴板!
您可以运行两个嵌套的 Podman 容器,而无需使用 --privileged 选项。运行不带 --privileged 选项的容器是一个更安全的选择。
如果您要以尽可能安全的方式尝试不同版本的 Podman,这非常有用。
先决条件
-
container-tools元数据包已安装。
流程
运行两个嵌套的容器:
podman run --name=unprivileged_podman --security-opt label=disable \ --user podman --device /dev/fuse \ registry.access.redhat.com/ubi10/podman \ podman run ubi10 echo hello
$ podman run --name=unprivileged_podman --security-opt label=disable \ --user podman --device /dev/fuse \ registry.access.redhat.com/ubi10/podman \ podman run ubi10 echo helloCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
运行基于
registry.access.redhat.com/ubi10/podman镜像的、名为unprivileged_podman的外部容器。 -
--security-opt label=disable选项禁用主机 Podman 上的 SELinux 隔离。SELinux 不允许容器化进程挂载在容器内运行所需的所有文件系统。 -
--user podman选项会自动使外部容器内的 Podman 在用户命名空间内运行。 -
--device /dev/fuse选项使用容器中的fuse-overlayfs软件包。此选项将/dev/fuse添加到外部容器中,因此容器中的 Podman 可以使用它。 -
运行
podman run ubi10 echo hello命令,以基于ubi10镜像创建内容器。 -
请注意,ubi10 短镜像名称被解析为别名。因此,拉取了
registry.access.redhat.com/ubi10:latest镜像。
验证
列出所有容器:
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a47b26290f43 podman run ubi10 e... 30 seconds ago Exited (0) 13 seconds ago unprivileged_podman
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a47b26290f43 podman run ubi10 e... 30 seconds ago Exited (0) 13 seconds ago unprivileged_podmanCopy to Clipboard Copied! Toggle word wrap Toggle overflow
17.9. 在 Podman 容器内构建容器 复制链接链接已复制到粘贴板!
您可以使用 Podman 在容器中运行容器。本例演示了如何使用 Podman 在此容器内构建并运行另一个容器。容器将运行"Moon-buggy",这是一个基于文本的简单游戏。
先决条件
-
container-tools元数据包已安装。 登陆到 registry.redhat.io 注册中心:
podman login registry.redhat.io
# podman login registry.redhat.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
运行基于
registry.redhat.io/rhel10/podman镜像的容器:podman run --privileged --name podman_container -it \ registry.redhat.io/rhel10/podman /bin/bash
# podman run --privileged --name podman_container -it \ registry.redhat.io/rhel10/podman /bin/bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
运行基于
registry.redhat.io/rhel10/podman镜像的、名为podman_container的外部容器。 -
--it选项指定您要在容器内运行交互式 bash shell。 -
--privileged选项禁用将容器与主机隔离的安全功能。
-
运行基于
在
podman_container容器中创建一个Containerfile:vi Containerfile FROM registry.access.redhat.com/ubi10/ubi RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm RUN dnf -y install moon-buggy && dnf clean all CMD ["/usr/bin/moon-buggy"]
# vi Containerfile FROM registry.access.redhat.com/ubi10/ubi RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm RUN dnf -y install moon-buggy && dnf clean all CMD ["/usr/bin/moon-buggy"]Copy to Clipboard Copied! Toggle word wrap Toggle overflow Containerfile中的命令会导致以下构建命令:-
从
registry.access.redhat.com/ubi10/ubi镜像构建容器。 -
安装
epel-release-latest-8.noarch.rpm软件包。 -
安装
moon-buggy软件包。 - 设置容器命令。
-
从
使用
Containerfile构建名为moon-buggy的新容器镜像:podman build -t moon-buggy .
# podman build -t moon-buggy .Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:列出所有镜像:
podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/moon-buggy latest c97c58abb564 13 seconds ago 1.67 GB registry.access.redhat.com/ubi10/ubi latest 4199acc83c6a 132seconds ago 213 MB
# podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/moon-buggy latest c97c58abb564 13 seconds ago 1.67 GB registry.access.redhat.com/ubi10/ubi latest 4199acc83c6a 132seconds ago 213 MBCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行一个基于
moon-buggy容器的新容器:podman run -it --name moon moon-buggy
# podman run -it --name moon moon-buggyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:标记
moon-buggy镜像:podman tag moon-buggy registry.example.com/moon-buggy
# podman tag moon-buggy registry.example.com/moon-buggyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:将
moon-buggy镜像推送到注册中心:podman push registry.example.com/moon-buggy
# podman push registry.example.com/moon-buggyCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第 18 章 监控容器 复制链接链接已复制到粘贴板!
使用 Podman 命令管理 Podman 环境。通过这种方式,您可以通过显示系统和 pod 信息,以及监控 Podman 事件来确定容器的健康状况。
18.1. 对容器使用健康检查 复制链接链接已复制到粘贴板!
您可以使用健康检查来确定运行在容器中的进程的健康状态或就绪状态。
如果健康检查成功,容器将标记为 "healthy";否则,其标记为"unhealthy"。您可以通过运行 podman exec 命令来比较健康检查,并检查退出代码。零退出值表示容器为 "healthy"。
在 Containerfile 中使用 HEALTHCHECK 指令构建镜像或在命令行上创建容器时,可以设置健康检查。您可以使用 podman inspect 或 podman ps 命令显示容器的健康检查状态。
健康检查由六个基本组件组成:
- 命令
- Retries(重试)
- Interval(间隔)
- Start-period(开始期间)
- Timeout(超时)
- 容器恢复
健康检查组件的描述如下:
- 命令(
--health-cmd选项) - Podman 在目标容器内执行命令并等待退出代码。
其他五个组件与健康检查的调度相关,它们是可选的。
- Retries (
--health-retries选项) - 在容器被标记为"unhealthy"前,定义需要发生的连续失败的健康检查的数量。一个成功的健康检查会重置重试计数器。
- Interval (
--health-interval选项) - 描述运行健康检查命令之间的时间。请注意,小的间隔会导致系统花费大量时间运行健康检查。间隔时间太长会导致难以捕捉超时。
- Start-period (
--health-start-period选项) - 描述容器启动和要忽略健康检查失败之间的时间。
- Timeout (
--health-timeout选项) - 描述健康检查在被视为不成功之前必须完成的时间段。
Retries、Interval 和 Start-period 组件的值是持续时间,如 "30s" 或 "1h15m"。有效的时间单位是"ns"、"us"或"µs","ms","s"、"m"和"h"。
- Container recovery(
--health-on-failure选项) 决定在容器状态为不健康时要执行哪些操作。当应用程序失败时,Podman 会自动重启它以提供稳健性。
--health-on-failure选项支持四个操作:-
none:不执行任何操作,这是默认操作。 -
kill:中断容器。 -
restart: 重启容器。 stop:停止容器。注意Podman 版本 4.2 及更高版本中提供
--health-on-failure选项。
-
不要将 restart 操作与 --restart 选项一起使用。在 systemd 单元内运行时,请考虑使用 kill 或 stop 操作来使用 systemd 重启策略。
健康检查在容器内运行。只有在您知道服务的健康状态是什么,并能够区分成功的和不成功的健康检查时,健康检查才有意义。
如需更多信息,请参阅系统中的 podman-healthcheck (1) 和 podman-run (1) 手册页。
18.2. 使用命令行执行健康检查 复制链接链接已复制到粘贴板!
在命令行上创建容器时,您可以设置健康检查。
先决条件
-
container-tools元数据包已安装。
流程
定义健康检查:
podman run -dt --name=hc-container -p 8080:8080 --health-cmd='curl http://localhost:8080 || exit 1' --health-interval=0 registry.access.redhat.com/ubi10/httpd-24
$ podman run -dt --name=hc-container -p 8080:8080 --health-cmd='curl http://localhost:8080 || exit 1' --health-interval=0 registry.access.redhat.com/ubi10/httpd-24Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
--health-cmd选项为容器设置健康检查命令。 -
值为 0 的
--health-interval=0选项表示您要手动运行健康检查。
-
检查
hc-container容器的健康状态:使用
podman inspect命令:podman inspect --format='{{json .State.Health.Status}}' hc-container healthy$ podman inspect --format='{{json .State.Health.Status}}' hc-container healthyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
podman ps命令:podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a680c6919fe localhost/hc-container:latest /usr/bin/run-http... 2 minutes ago Up 2 minutes (healthy) hc-container
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a680c6919fe localhost/hc-container:latest /usr/bin/run-http... 2 minutes ago Up 2 minutes (healthy) hc-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
podman healthcheck run命令:podman healthcheck run hc-container healthy
$ podman healthcheck run hc-container healthyCopy to Clipboard Copied! Toggle word wrap Toggle overflow
18.3. 使用 Containerfile 执行健康检查 复制链接链接已复制到粘贴板!
您可以使用 Containerfile 中的 HEALTHCHECK 指令来设置健康检查。
先决条件
-
container-tools元数据包已安装。
流程
创建
Containerfile:cat Containerfile FROM registry.access.redhat.com/ubi10/httpd-24 EXPOSE 8080 HEALTHCHECK CMD curl http://localhost:8080 || exit 1
$ cat Containerfile FROM registry.access.redhat.com/ubi10/httpd-24 EXPOSE 8080 HEALTHCHECK CMD curl http://localhost:8080 || exit 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意HEALTHCHECK指令仅支持docker镜像格式。对于oci镜像格式,该指令会被忽略。构建容器镜像并添加镜像名称:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行容器:
podman run -dt --name=hc-container localhost/hc-container
$ podman run -dt --name=hc-container localhost/hc-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
hc-container容器的健康状态:使用
podman inspect命令:podman inspect --format='{{json .State.Health.Status}}' hc-container healthy$ podman inspect --format='{{json .State.Health.Status}}' hc-container healthyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
podman ps命令:podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a680c6919fe localhost/hc-container:latest /usr/bin/run-http... 2 minutes ago Up 2 minutes (healthy) hc-container
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a680c6919fe localhost/hc-container:latest /usr/bin/run-http... 2 minutes ago Up 2 minutes (healthy) hc-containerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
podman healthcheck run命令:podman healthcheck run hc-container healthy
$ podman healthcheck run hc-container healthyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-healthcheck (1)和podman-run (1)手册页。
18.4. 显示 Podman 系统信息 复制链接链接已复制到粘贴板!
podman system 命令允许您通过显示系统信息来管理 Podman 系统。
先决条件
-
container-tools元数据包已安装。
流程
显示 Podman 系统信息:
要显示 Podman 磁盘用量,请输入:
podman system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 3 2 1.085GB 233.4MB (0%) Containers 2 0 28.17kB 28.17kB (100%) Local Volumes 3 0 0B 0B (0%)
$ podman system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 3 2 1.085GB 233.4MB (0%) Containers 2 0 28.17kB 28.17kB (100%) Local Volumes 3 0 0B 0B (0%)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要显示空间使用情况的详细信息,请输入:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要显示主机、当前存储统计和 Podman 构建的信息,请输入:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要删除所有未使用的容器、镜像和卷数据,请输入:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
podman system prune命令删除所有未使用的容器(悬停和未引用的)、pod 以及可选的来自本地存储的卷。 -
使用
--all选项删除所有未使用的镜像。未使用的镜像是悬停的镜像,以及没有任何容器基于该镜像的镜像。 使用
--volume选项来修剪卷。默认情况下,如果没有容器使用该卷,也不会删除卷以防止重要数据被删除。如需更多信息,请参阅系统中的
podman-system-df、podman-system-info和podman-system-pruneman page。
-
18.5. podman 事件类型 复制链接链接已复制到粘贴板!
您可以监控 Podman 中发生的事件。存在多个事件类型,每个事件类型都会报告不同的状态。
容器事件类型会报告以下状态:
- attach
- checkpoint
- cleanup
- commit
- create
- exec
- export
- import
- init
- kill
- mount
- pause
- prune
- remove
- restart
- restore
- start
- stop
- sync
- unmount
- unpause
pod 事件类型报告以下状态:
- create
- kill
- pause
- remove
- start
- stop
- unpause
镜像 事件类型会报告以下状态:
- prune
- push
- pull
- save
- remove
- tag
- untag
系统类型报告以下状态:
- refresh
- renumber
卷类型报告以下状态:
- create
- prune
remove
如需更多信息,请参阅系统中的
podman-events (1)手册页。
18.6. 监控 Podman 事件 复制链接链接已复制到粘贴板!
您可以使用 podman events 命令监控和输出 Podman 中发生的事件。每个事件都将包括一个时间戳、类型、状态、名称(如果适用)和镜像(如果适用)。
先决条件
-
container-tools元数据包已安装。
流程
运行
myubi容器:podman run -q --rm --name=myubi registry.access.redhat.com/ubi10/ubi:latest
$ podman run -q --rm --name=myubi registry.access.redhat.com/ubi10/ubi:latestCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示 Podman 事件:
要显示所有 Podman 事件,请输入:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow --stream=false选项确保podman events命令在读取最后一个已知事件时退出。在输入
podman run命令时,您可以看到几个事件:-
创建新容器时的
container create。 -
如果本地存储中不存在容器镜像,拉取镜像时的
image pull。 -
在运行时初始化容器并设置网络时的
container init。 -
启动容器时的
container start。 -
附加到容器终端时的
container attach。这是因为容器在前台运行。 -
容器退出时会发出
container died。 -
container remove,因为--rm标志用于在容器退出后删除它。
-
创建新容器时的
您还可以使用
journalctl命令显示 Podman 事件:journalctl --user -r SYSLOG_IDENTIFIER=podman Mar 08 14:27:20 fedora podman[129324]: 2023-03-08 14:27:20.913786892 +0100 CET m=+0.066920979 container remove ... Mar 08 14:27:20 fedora podman[129289]: 2023-03-08 14:27:20.696167362 +0100 CET m=+0.079089208 container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72f>
$ journalctl --user -r SYSLOG_IDENTIFIER=podman Mar 08 14:27:20 fedora podman[129324]: 2023-03-08 14:27:20.913786892 +0100 CET m=+0.066920979 container remove ... Mar 08 14:27:20 fedora podman[129289]: 2023-03-08 14:27:20.696167362 +0100 CET m=+0.079089208 container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72f>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要只显示 Podman 创建事件,请输入:
podman events --filter event=create 2023-03-08 14:27:20.696167362 +0100 CET container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.access.redhat.com/ubi10/ubi:latest, name=myubi,...)
$ podman events --filter event=create 2023-03-08 14:27:20.696167362 +0100 CET container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72fe09 (image=registry.access.redhat.com/ubi10/ubi:latest, name=myubi,...)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可以使用
journalctl命令显示 Podman 创建事件:journalctl --user -r PODMAN_EVENT=create Mar 08 14:27:20 fedora podman[129289]: 2023-03-08 14:27:20.696167362 +0100 CET m=+0.079089208 container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72f>
$ journalctl --user -r PODMAN_EVENT=create Mar 08 14:27:20 fedora podman[129289]: 2023-03-08 14:27:20.696167362 +0100 CET m=+0.079089208 container create d4748226a2bcd271b1bc4b9f88b54e8271c13ffea9b30529968291c62d72f>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如需更多信息,请参阅系统中的
podman-events (1)手册页。
18.7. 使用 Podman 事件进行审计 复制链接链接已复制到粘贴板!
在以前的版本中,必须连接到事件才能正确解释事件。例如,container-create 事件必须与 image-pull 事件连接,才可以知道使用了哪个镜像。container-create 事件也不包含所有数据,如安全设置、卷、挂载等。
从 Podman v4.4 开始,您可以直接从单个事件和 journald 条目中收集关于容器的所有相关信息。数据采用 JSON 格式,与 podman container inspect 命令使用的格式相同,并包含容器的所有配置和安全设置。您可以配置 Podman 以附加容器检查数据,以便进行审计。
先决条件
-
container-tools元数据包已安装。
流程
修改
~/.config/containers/containers.conf文件,并将events_container_create_inspect_data=true选项添加到[engine]部分:cat ~/.config/containers/containers.conf [engine] events_container_create_inspect_data=true
$ cat ~/.config/containers/containers.conf [engine] events_container_create_inspect_data=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow 对于系统范围的配置,请修改
/etc/containers/containers.conf或/usr/share/container/containers.conf文件。创建容器:
podman create registry.access.redhat.com/ubi10/ubi:latest 19524fe3c145df32d4f0c9af83e7964e4fb79fc4c397c514192d9d7620a36cd3
$ podman create registry.access.redhat.com/ubi10/ubi:latest 19524fe3c145df32d4f0c9af83e7964e4fb79fc4c397c514192d9d7620a36cd3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示 Podman 事件:
使用
podman events命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
--format "{{.ContainerInspectData}}"选项显示检查数据。 -
jq ".Config.CreateCommand"将 JSON 数据转换为更易读的格式,并显示podman create命令的参数。
-
使用
journalctl命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow podman events和journalctl命令的输出数据相同。如需更多信息,请参阅系统中的
podman-events (1)和containers.conf (5)手册页。
第 19 章 使用 Toolbx 进行开发和故障排除 复制链接链接已复制到粘贴板!
在系统上安装软件会带来某些风险:它可以改变系统的行为,并在不再需要它们后保留不需要的文件和目录。您可以通过将您喜欢的开发和调试工具、编辑器和软件开发工具包(SDK)安装到 Toolbx 完全可变的容器中来防止这些风险,而不会影响基础操作系统。您可以使用命令(如 less、lsof、rsync、ssh、sudo 和 unzip )在主机系统上执行更改。
Toolbx 工具执行以下操作:
-
将
registry.access.redhat.com/ubi10/toolbox:latest镜像拉取到您的本地系统 - 从镜像启动容器
- 在您可以从其访问主机系统的容器内运行 shell
Toolbx 可以运行根容器或无根容器,具体取决于创建 Toolbx 容器的用户的权限。需要主机系统上 root 权利的工具也应在根容器中运行。
默认容器名称是 rhel-toolbox。
19.1. 启动 Toolbx 容器 复制链接链接已复制到粘贴板!
您可以使用 toolbox create 命令创建 Toolbx 容器。然后您可以使用 toolbox enter 命令进入容器。
流程
创建一个 Toolbx 容器:
作为无根用户:
toolbox create <mytoolbox> Created container: <mytoolbox> Enter with: toolbox enter <mytoolbox>
$ toolbox create <mytoolbox> Created container: <mytoolbox> Enter with: toolbox enter <mytoolbox>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 作为 root 用户:
sudo toolbox create <mytoolbox> Created container: <mytoolbox> Enter with: toolbox enter <mytoolbox>
$ sudo toolbox create <mytoolbox> Created container: <mytoolbox> Enter with: toolbox enter <mytoolbox>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证您是否拉取了正确的镜像:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
进入 Toolbx 容器:
toolbox enter <mytoolbox>
[user@toolbox ~]$ toolbox enter <mytoolbox>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
在
<mytoolbox>容器中输入一个命令,并显示容器和镜像的名称:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
19.2. 使用 Toolbx 进行开发 复制链接链接已复制到粘贴板!
您可以以无根用户身份使用 Toolbx 容器来安装开发工具,如编辑器、编译器和软件开发工具包(SDK)。安装后,您可以继续以无根用户身份使用这些工具。
先决条件
- Toolbx 容器已创建并在运行。您已进入到 Toolbx 容器。您不需要创建具有 root 权限的 Toolbx 容器。请参阅 启动 Toolbox 容器。
流程
安装您选择的工具,例如 Emacs 文本编辑器、GCC 编译器和 GNU Debugger (GDB):
⬢[user@toolbox ~]$ sudo dnf install emacs gcc gdb
⬢[user@toolbox ~]$ sudo dnf install emacs gcc gdbCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证工具是否已安装:
⬢[user@toolbox ~]$ dnf repoquery --info --installed <package_name>
⬢[user@toolbox ~]$ dnf repoquery --info --installed <package_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
19.3. 使用 Toolbx 对主机系统进行故障排除 复制链接链接已复制到粘贴板!
您可以使用具有 root 特权的 Toolbx 容器,使用 systemd、journalctl 和 nmap 等工具查找主机系统的各种问题的根本原因,而无需在主机系统上安装它们。例如,在 Toolbx 容器中,您可以执行以下操作:
先决条件
- Toolbx 容器已创建并在运行。您已进入到 Toolbx 容器。您需要创建具有 root 特权的 Toolbx 容器。请参阅 启动 Toolbox 容器。
流程
安装
systemd套件以便能够运行journalctl命令:⬢[root@toolbox ~]# dnf install systemd
⬢[root@toolbox ~]# dnf install systemdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示主机上运行的所有进程的日志消息:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示内核的日志消息:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安装
nmap网络扫描工具:⬢[root@toolbox ~]# dnf install nmap
⬢[root@toolbox ~]# dnf install nmapCopy to Clipboard Copied! Toggle word wrap Toggle overflow 扫描网络中的 IP 地址和端口:
⬢[root@toolbox ~]# nmap -sS scanme.nmap.org Starting Nmap 7.93 ( https://nmap.org ) at 2024-01-02 10:39 CET Stats: 0:01:01 elapsed; 0 hosts completed (0 up), 256 undergoing Ping Scan Ping Scan Timing: About 29.79% done; ETC: 10:43 (0:02:24 remaining) Nmap done: 256 IP addresses (0 hosts up) scanned in 206.45 seconds
⬢[root@toolbox ~]# nmap -sS scanme.nmap.org Starting Nmap 7.93 ( https://nmap.org ) at 2024-01-02 10:39 CET Stats: 0:01:01 elapsed; 0 hosts completed (0 up), 256 undergoing Ping Scan Ping Scan Timing: About 29.79% done; ETC: 10:43 (0:02:24 remaining) Nmap done: 256 IP addresses (0 hosts up) scanned in 206.45 secondsCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
-sS选项执行 TCP SYN 扫描。大多数 Nmap 的扫描类型仅对特权用户提供,因为它们发送和接收原始数据包,这在 UNIX 系统上需要 root 访问权限。
-
19.4. 停止 Toolbx 容器 复制链接链接已复制到粘贴板!
使用 exit 命令离开 Toolbox 容器,使用 podman stop 命令停止容器。
流程
离开容器,并返回到主机:
⬢ [user@toolbox ~]$ exit
⬢ [user@toolbox ~]$ exitCopy to Clipboard Copied! Toggle word wrap Toggle overflow 停止 toolbox 容器:
⬢ [user@toolbox ~]$ podman stop <mytoolbox>
⬢ [user@toolbox ~]$ podman stop <mytoolbox>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:删除 toolbox 容器:
⬢ [user@toolbox ~]$ toolbox rm <mytoolbox>
⬢ [user@toolbox ~]$ toolbox rm <mytoolbox>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,您还可以使用
podman rm命令删除容器。
第 20 章 运行特殊容器镜像 复制链接链接已复制到粘贴板!
您可以运行一些特殊类型的容器镜像。有些容器镜像有名为 runlabels 的内置标签,可让您使用预设置的选项和参数运行这些容器。podman container runlabel <label> 命令,您可以执行 <label> 中为容器镜像定义的命令。支持的标签包括 install、run 和 uninstall。
20.1. 打开到主机的权限 复制链接链接已复制到粘贴板!
特权容器和无特权容器之间存在一些区别:例如,toolbox 容器是一个特权容器。以下是可以从容器对主机公开或可能不公开的特权示例:
-
Privileges :特权容器禁用将容器与主机隔离的安全功能。您可以使用
podman run --privileged <image_name>命令运行特权容器。例如,您可以删除主机上挂载的 root 用户所拥有的文件和目录。 -
Process tables :您可以使用
podman run --privileged --pid=host <image_name>命令为容器使用主机 PID 命名空间。然后,您可以在特权容器中使用ps -e命令列出所有在主机上运行的进程。您可以将来自主机的进程 ID 传给在特权容器中运行的命令(例如:kill <PID>)。 -
网络接口:默认情况下,容器只有一个外部网络接口和一个回送网络接口。您可以使用
podman run --net=host <image_name>命令直接从容器内部访问主机网络接口。 -
进程间的通信: 主机上的 IPC 工具可以从特权容器内访问。您可以运行
ipcs等命令,来查看主机上活动的消息队列、共享内存段和 semaphore 设置的信息。
20.2. 带有 runlabels 的容器镜像 复制链接链接已复制到粘贴板!
有些红帽镜像包括为使用这些镜像提供预设置命令行的标签。使用 podman container runlabel <label> 命令,您可以使用 podman 命令执行 <label> 中为镜像定义的命令。
现有 runlabels 包括:
- install:在执行镜像前设置主机系统。通常情况下,这会在主机上创建文件和目录,容器可在稍后运行时访问。
- run:标识在运行容器时要使用的 podman 命令行选项。通常,这些选项将在主机上放开特权,并挂载容器需要永久保留在主机上的主机内容。
- uninstall :在运行完容器后清除主机系统。
20.3. 使用 runlabels 运行 support-tools 复制链接链接已复制到粘贴板!
制作 rhel10/support-tools 容器镜像的目的是为了运行 support-toolsd 守护进程的容器化版本。support-tools 镜像包含以下 runlabels:install、run 和 uninstall。以下流程指导您安装、运行和卸载 support-tools 镜像:
先决条件
-
container-tools元数据包已安装。
流程
拉取
support-tools镜像:podman pull registry.redhat.io/rhel10/support-tools
# podman pull registry.redhat.io/rhel10/support-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示
support-tools的installrunlabel:podman container runlabel install --display rhel10/support-tools command: podman run --rm --privileged -v /:/host -e HOST=/host -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools registry.redhat.io/rhel10/support-tools:latest /bin/install.sh
# podman container runlabel install --display rhel10/support-tools command: podman run --rm --privileged -v /:/host -e HOST=/host -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools registry.redhat.io/rhel10/support-tools:latest /bin/install.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此时该命令会为主机打开权限,将主机 root 文件系统挂载到容器中的
/host,并运行install.sh脚本。对
support-tools运行installrunlabel:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会在主机系统上创建
support-tools以后要使用的文件。显示
support-tools的runrunlabel:podman container runlabel run --display rhel10/support-tools command: podman run -d --privileged --name support-tools --net=host --pid=host -v /etc/pki/support-tools:/etc/pki/support-tools -v /etc/support-tools.conf:/etc/support-tools.conf -v /etc/sysconfig/support-tools:/etc/sysconfig/support-tools -v /etc/support-tools.d:/etc/support-tools.d -v /var/log:/var/log -v /var/lib/support-tools:/var/lib/support-tools -v /run:/run -v /etc/machine-id:/etc/machine-id -v /etc/localtime:/etc/localtime -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools --restart=always registry.redhat.io/rhel10/support-tools:latest /bin/support-tools.sh
# podman container runlabel run --display rhel10/support-tools command: podman run -d --privileged --name support-tools --net=host --pid=host -v /etc/pki/support-tools:/etc/pki/support-tools -v /etc/support-tools.conf:/etc/support-tools.conf -v /etc/sysconfig/support-tools:/etc/sysconfig/support-tools -v /etc/support-tools.d:/etc/support-tools.d -v /var/log:/var/log -v /var/lib/support-tools:/var/lib/support-tools -v /run:/run -v /etc/machine-id:/etc/machine-id -v /etc/localtime:/etc/localtime -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools --restart=always registry.redhat.io/rhel10/support-tools:latest /bin/support-tools.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这表明,在启动
support-tools容器来运行support-toolsd守护进程时,命令会打开到主机以及容器内主机中的特定文件和目录的特权。为
support-tools执行runrunlabel:podman container runlabel run rhel10/support-tools command: podman run -d --privileged --name support-tools --net=host --pid=host -v /etc/pki/support-tools:/etc/pki/support-tools -v /etc/support-tools.conf:/etc/support-tools.conf -v /etc/sysconfig/support-tools:/etc/sysconfig/support-tools -v /etc/support-tools.d:/etc/support-tools.d -v /var/log:/var/log -v /var/lib/support-tools:/var/lib/support-tools -v /run:/run -v /etc/machine-id:/etc/machine-id -v /etc/localtime:/etc/localtime -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools --restart=always registry.redhat.io/rhel10/support-tools:latest /bin/support-tools.sh 28a0d719ff179adcea81eb63cc90fcd09f1755d5edb121399068a4ea59bd0f53
# podman container runlabel run rhel10/support-tools command: podman run -d --privileged --name support-tools --net=host --pid=host -v /etc/pki/support-tools:/etc/pki/support-tools -v /etc/support-tools.conf:/etc/support-tools.conf -v /etc/sysconfig/support-tools:/etc/sysconfig/support-tools -v /etc/support-tools.d:/etc/support-tools.d -v /var/log:/var/log -v /var/lib/support-tools:/var/lib/support-tools -v /run:/run -v /etc/machine-id:/etc/machine-id -v /etc/localtime:/etc/localtime -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools --restart=always registry.redhat.io/rhel10/support-tools:latest /bin/support-tools.sh 28a0d719ff179adcea81eb63cc90fcd09f1755d5edb121399068a4ea59bd0f53Copy to Clipboard Copied! Toggle word wrap Toggle overflow support-tools容器会打开特权,从主机挂载其需要的内容,并在后台运行support-toolsd守护进程(-d)。support-toolsd守护进程开始收集日志消息,并将信息定向到/var/log目录中的文件。显示
support-tools的uninstallrunlabel:podman container runlabel uninstall --display rhel10/support-tools command: podman run --rm --privileged -v /:/host -e HOST=/host -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools registry.redhat.io/rhel10/support-tools:latest /bin/uninstall.sh
# podman container runlabel uninstall --display rhel10/support-tools command: podman run --rm --privileged -v /:/host -e HOST=/host -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools registry.redhat.io/rhel10/support-tools:latest /bin/uninstall.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为
support-tools运行uninstallrunlabel:podman container runlabel uninstall rhel10/support-tools command: podman run --rm --privileged -v /:/host -e HOST=/host -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools registry.redhat.io/rhel10/support-tools:latest /bin/uninstall.sh
# podman container runlabel uninstall rhel10/support-tools command: podman run --rm --privileged -v /:/host -e HOST=/host -e IMAGE=registry.redhat.io/rhel10/support-tools:latest -e NAME=support-tools registry.redhat.io/rhel10/support-tools:latest /bin/uninstall.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow
在这种情况下, uninstall.sh 脚本只删除 /etc/logrotate.d/syslog 文件。它不会清理配置文件。
第 21 章 使用 container-tools API 复制链接链接已复制到粘贴板!
新的基于 Podman 2.0 API 的 REST 替换了使用 varlink 库的 Podman 的旧远程 API。新的 API 可以在根和无根环境中工作。
Podman v2.0 RESTful API 由 为 Podman 和 Docker 兼容的 API 提供支持的 Libpod API 组成。借助这一新的 REST API,您可以从 cURL、Postman、Google 的高级 REST 客户端等平台调用 Podman。
由于 podman 服务支持套接字激活,除非套接字上的连接处于活动状态,否则 podman 服务将不会运行。因此,要启用套接字激活功能,您需要手动启动 podman.socket 服务。当连接在套接字上处于活跃状态时,它会启动 podman 服务并运行请求的 API 操作。操作完成后,podman 进程结束,podman 服务会返回到非活动状态。
21.1. 在 root 模式中使用 systemd 启用 Podman API 复制链接链接已复制到粘贴板!
您可以执行以下操作:
-
使用
systemd激活 Podman API 套接字。 - 使用 Podman 客户端执行基本命令。
先决条件
podman-remote软件包已安装。dnf install podman-remote
# dnf install podman-remoteCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
立即启动该服务:
systemctl enable --now podman.socket
# systemctl enable --now podman.socketCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
docker-podman软件包启用到var/lib/docker.sock的链接:dnf install podman-docker
# dnf install podman-dockerCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示 Podman 的系统信息:
podman-remote info
# podman-remote infoCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证链接:
ls -al /var/run/docker.sock lrwxrwxrwx. 1 root root 23 Nov 4 10:19 /var/run/docker.sock -> /run/podman/podman.sock
# ls -al /var/run/docker.sock lrwxrwxrwx. 1 root root 23 Nov 4 10:19 /var/run/docker.sock -> /run/podman/podman.sockCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.2. 在无根模式下使用 systemd 启用 Podman API 复制链接链接已复制到粘贴板!
您可以使用 systemd 激活 Podman API 套接字和 podman API 服务。
先决条件
podman-remote软件包已安装。dnf install podman-remote
# dnf install podman-remoteCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
立即启用并启动该服务:
systemctl --user enable --now podman.socket
$ systemctl --user enable --now podman.socketCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:要使用 Docker 启用程序来与无根 Podman 套接字进行交互:
export DOCKER_HOST=unix:///run/user/<uid>/podman//podman.sock
$ export DOCKER_HOST=unix:///run/user/<uid>/podman//podman.sockCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
检查套接字的状态:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow podman.socket处于活动状态,并侦听/run/user/<uid>/podman.podman.sock,其中<uid> 是用户的 ID。显示 Podman 的系统信息:
podman-remote info
$ podman-remote infoCopy to Clipboard Copied! Toggle word wrap Toggle overflow
21.3. 手动运行 Podman API 复制链接链接已复制到粘贴板!
您可以运行 Podman API。这对于调试 API 调用,特别是在使用 Docker 兼容性层时很有用。
先决条件
podman-remote软件包已安装。dnf install podman-remote
# dnf install podman-remoteCopy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
为 REST API 运行服务:
podman system service -t 0 --log-level=debug
# podman system service -t 0 --log-level=debugCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
0 表示没有超时。rootful 服务的默认端点为
unix:/run/podman/podman.sock。 -
--log-level <level>选项设定日志级别。标准日志记录级别为debug、info、warn、error、fatal和panic。
-
0 表示没有超时。rootful 服务的默认端点为
在另一个终端中,显示 Podman 的系统信息。
podman-remote命令与常规的podman命令不同,其可通过 Podman 套接字通信:podman-remote info
# podman-remote infoCopy to Clipboard Copied! Toggle word wrap Toggle overflow 若要对 Podman API 进行故障排除,并显示请求和响应,请使用
curl命令。以 JSON 格式在 Linux 服务器上获取有关 Podman 安装的信息:Copy to Clipboard Copied! Toggle word wrap Toggle overflow jq工具是一个命令行 JSON 处理器。拉取
registry.access.redhat.com/ubi10/ubi容器镜像:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示拉取的镜像:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow