使用 Podman 进行基本的容器管理
- 解释
容器提供了轻量级虚拟化方法,可在一台主机上同时运行多个虚拟环境(容器)。Podman 是 SLE Micro 上用于管理容器的默认工具。
- 原因
本文提供了关于 Podman 的基本信息,并介绍了如何使用它来管理容器。
- 工作量
读完本文大约需要 30 分钟。
- 目标
您将了解 Podman、容器映像和容器。
- 要求
已安装 Podman
1 关于容器的基础知识 #
容器提供了轻量级虚拟化方法,可在一台主机上同时运行多个虚拟环境(容器)。在诸如 Xen 或 KVM 的技术中,处理器负责模拟整个硬件环境,超级管理程序负责控制虚拟机。而容器则不同,它在操作系统级别提供虚拟化,在该级别,由内核负责控制隔离的容器。
使用容器可将应用程序隔离在自给性单元中。
容器提供近乎本机的性能。容器可以根据运行时环境直接使用主机内核,因而可最大程度地减少开销。
可以通过内核控制组控制网络接口并在容器内应用资源。
容器在主机系统的内核中运行,因此无法使用不同的内核或不同的内核版本。
容器的安全性取决于主机系统。可以通过 AppArmor 或 SELinux 配置文件保护容器化应用程序。容器比虚拟机更难以保护,因为容器的受攻击面更大。
2 关于 Podman #
Podman 是 Pod Manager 工具的简称。它是一个无守护程序容器引擎,可让您使用容器和容器映像来运行和部署应用程序。Podman 提供了一个命令行界面来管理容器。
由于 Podman 没有守护程序,因此它提供了与 systemd 的集成。这样就可以通过 systemd 单元来控制容器。您可为现有容器创建这些单元,以及生成可启动容器的单元(如果系统中不存在这些单元)。Podman 可以在容器内部运行 systemd。
Podman 支持将容器整理为 Pod。Pod 共享相同的网络接口和资源。将一组容器组织成 Pod 的典型用例包括运行数据库的容器,以及带有访问数据库的客户端的容器。
2.1 安装 Podman #
默认情况下,Podman 已包含在 SLE Micro 中。但是,如果缺少 Podman,您可以如下所述安装它:
运行以下命令:
>
sudo
transactional-update pkg install podman*重启动系统以引导进入新快照。
3 获取容器映像 #
要运行容器,需要有一个映像。映像包含运行应用程序所需的全部依赖项。您可以从映像注册表获取映像。/etc/containers/registries.conf
配置文件中定义了可用的注册表。如果您有一个本地映像注册表或想要使用其他注册表,请将相应注册表添加到配置文件中。
SLE Micro 未提供用于构建自定义映像的工具。因此,可用来获取映像的唯一方法是从映像注册表中提取映像。
默认安装中未配置 openSUSE 注册表和 Docker Hub。要从这些注册表下载容器映像,需要将注册表添加到 /etc/containers/registries.conf
文件中,如下所示:
unqualified-search-registries = ["registry.suse.com", "registry.opensuse.org", "docker.io"]
podman pull
命令可从映像注册表中提取映像。其语法如下所示:
#
podman pull[OPTIONS]SOURCE
source 可以是没有注册表名称的映像。如果是这样,Podman 会尝试从 /etc/containers/registries.conf
文件内配置的所有注册表中提取映像。默认映像标记为 latest
。提取的映像默认存放在 /var/lib/containers/storage/overlay-images/
中。
要查看 podman pull
命令的所有可用选项,请运行以下命令:
#
podman pull --help
如果您在使用 Cockpit,还可以在
菜单中单击 ,从某个映像注册表中提取映像。借助 Podman,您可以使用以下命令在某个映像注册表或注册表列表中搜索映像:
#
podman searchIMAGE_NAME
或者,您可以使用 skopeo 工具来管理容器映像和映像储存库。有关细节,请参阅下面的章节。
3.1 skopeo #
skopeo 是一个命令行实用程序,用于管理、检查容器映像和映像储存库并为其签名。使用 skopeo,您可以检查远程和本地容器注册表上的容器和储存库,还可以在不同的存储后端之间复制容器映像。
skopeo 适用于以下注册表类型:
- containers-storage:IMAGE_REFERENCE
位于本地映像存储区中的映像。
- docker://IMAGE_REFERENCE
注册表中的映像。
skopeo 提供了几个命令来管理映像和注册表:
-
inspect
该命令会提取储存库清单,可以显示可用于指定储存库的标记、容器映像的标签、映像的操作系统等信息。
该命令使用以下语法:
>
skopeo inspect REGISTRY_TYPEIMAGE_NAME
用法的示例如下:
>
skopeo inspect docker://registry.suse.com/suse/pcp:latest
{ "Name": "registry.suse.com/suse/pcp", "Digest": "sha256:eee17c009fb8b05e5825a8c9658d972ab13a17541180bd7a1348fccc6e4fc77f", "RepoTags": [ "5", "5-12.54", "5-13.10", ... ], "Created": "2023-06-19T16:59:01.617731565Z", "DockerVersion": "20.10.23-ce", "Labels": { "com.suse.application.pcp.created": "2023-06-19T16:58:29.786850402Z", "com.suse.application.pcp.description": "Performance Co-Pilot (pcp) container image based on the SLE Base Container Image. This container image is not supported when using a container runtime other than podman.", ... ], "Architecture": "amd64", "Os": "linux", "Layers": [ "sha256:a05e4c4d1fc89c7f7aa60829b8631b64873df6041f627eb2b43524e9e010446e", "sha256:19793da49ce886a67aa62657dc24a105a26d63568ce27de241246bc6cc9bc008", "sha256:403f9ef6c98d4cf277caf3166ca4455817828e33c8b699237bb8eb24cb2b41bf" ], "LayersData": [ { "MIMEType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "Digest": "sha256:a05e4c4d1fc89c7f7aa60829b8631b64873df6041f627eb2b43524e9e010446e", "Size": 47291175, "Annotations": null }, ... ], "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"-
copy
该命令可用于在注册表、容器存储后端和本地目录之间复制容器映像。
用法的示例如下:
>
skopeo copy oci:busybox_ocilayout:latest dir:existingemptydirectory
-
delete
将映像标记为稍后由注册表的垃圾回收器去除。
>
skopeo delete docker://registry.example.com/example/pause:latest
-
sync
在注册表储存库与本地目录之间同步映像。
4 使用容器 #
4.1 运行容器 #
提取容器映像后,便可基于该映像创建容器。您可以使用 podman run
命令运行映像的实例。该命令的语法如下:
#
podman run [OPTIONS] IMAGE [CONTAINER_NAME]
IMAGE 需以传输:路径格式指定。如果省略传输,则默认会使用 docker
。路径可以指特定的映像注册表。如果省略,Podman 会在 /etc/containers/registries.conf
文件所定义的注册表中搜索映像。基于 sles15
映像运行容器 sle15
的示例如下:
#
podman run registry.opensuse.org/suse/templates/images/sle-15-sp4/base/images/suse/sle15 sles15
下面是常用选项的列表。要显示完整的可用选项列表,请运行 podman run
--help
命令。
-
--detach, -d
容器将在后台运行。
-
--env, -e=env
此选项允许使用适用于要在容器内启动的进程的任意环境变量。如果指定了环境变量但未提供值,Podman 将检查主机环境中的值并设置该变量(仅当主机上设置了相应变量时)。
-
--help
列显
podman run
命令的相关帮助。--hostname=
名称,-h
设置容器内可用的容器主机名。
-
--pod=
名称 在现有 Pod 中运行容器。要创建 Pod,请在 Pod 名称前加上
new:
。-
--read-only
将容器的根文件系统挂载为只读模式。
-
--systemd=true|false|always
在 systemd 模式下运行容器。默认值为 true。
4.2 列出容器 #
Podman 可让您使用 podman ps
命令列出正在运行的所有容器。该命令的一般语法如下:
#
podman ps[OPTIONS]
命令选项可以更改显示的信息。例如,使用 --all
选项会输出 Podman 创建的所有容器(不仅仅是正在运行的容器)。
要显示 podman ps
选项的完整列表,请运行以下命令:
#
podman ps --help
4.3 停止容器 #
如果 podman run
命令成功完成,则表示一个新容器已启动。您可以运行以下命令停止容器:
#
podman stop[OPTIONS]CONTAINER
可以指定单个容器名称或 ID,也可以指定以空格分隔的一系列容器。该命令接受以下选项:
-
--all, -a
停止正在运行的所有容器。
-
--latest, -l
您无需提供容器名称,该选项将停止最后创建的容器。
-
--time, -t=
秒数 强制停止容器前需等待的秒数。
要查看 podman stop
命令的所有可用选项,请运行以下命令:
#
podman stop --help
4.4 启动容器 #
要启动已创建但被停止的容器,请使用 podman start
命令:该命令的语法如下:
#
podman start[OPTIONS]CONTAINER
CONTAINER 可以是容器名称或容器 ID。
要显示 podman
start
可用选项的完整列表,请运行以下命令:
#
podman start --help
4.4.1 提交修改后的容器 #
您可以运行具有原始映像所不具有的特定属性的新容器。要将具有这些属性的容器另存为新映像,可以使用 podman commit
命令:
#
podman commit[OPTIONS]CONTAINERIMAGE
CONTAINER 是容器名称或容器 ID。IMAGE 是新映像名称。如果映像名称不是以注册表名称开头,系统将使用值 localhost
。
4.5 去除容器 #
要从主机中去除一个或多个未使用的容器,请按如下方式使用 podman rm
命令:
#
podman rm[OPTIONS]CONTAINER
CONTAINER 可以是容器名称或容器 ID。
如果指定的容器正在运行,该命令无法将其去除。要去除正在运行的容器,请使用 -f
选项。
要显示 podman rm
选项的完整列表,请运行以下命令:
#
podman rm --help
您可以使用一条命令从主机中删除所有停止的容器:
#
podman container prune
在运行该命令之前,请确保每个已停止的容器都是您想要去除的容器,否则可能会去除仍在使用以及只是暂时停止的容器。
5 使用 Pod #
您可以将多个容器组合成一个 Pod。这样 Pod 中的容器便可共享网络、PID 和 IPC 名称空间。可以通过 podman pod
命令来管理 Pod。本节概述了用于管理 Pod 的命令。
5.1 创建 Pod #
podman pod create
命令用于创建 Pod。该命令的语法如下:
#
podman pod create[OPTIONS]
该命令会输出 Pod ID。默认情况下,Pod 创建后不会启动。您可以通过运行 Pod 中的容器来启动 Pod,也可以按第 5.3 节 “启动/停止/重启动 Pod”中所述来启动 Pod。
如果未使用 --name
选项指定 Pod 名称,Podman 将为 Pod 指派默认名称。
要显示可用选项的完整列表,请运行以下命令:
#
podman pod create --help
5.2 列出 Pod #
您可以运行以下命令来列出所有 Pod:
#
podman pod list
输出如下所示:
POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 30fba506fecb upbeat_mcclintock Created 19 hours ago 1 4324f40c9651 976a83b4d88b nervous_feynman Running 19 hours ago 2 daa5732ecd02
由于每个 Pod 都包含 INFRA
容器,因此 Pod 中的容器数量始终大于零。
5.3 启动/停止/重启动 Pod #
创建 Pod 后,必须由您将其启动,因为默认情况下 Pod 不会处于 running
状态。在下面的命令中,POD 可以是 Pod 名称或 Pod ID。
要启动 Pod,请运行以下命令:
#
podman pod start[OPTIONS]POD
要显示可用选项的完整列表,请运行以下命令:
#
podman pod start --help
要启动 Pod,请按如下所示使用 podman pod stop
:
#
podman pod stopPOD
要重启动 Pod,请按如下所示使用 podman pod restart
命令:
#
podman pod restartPOD
5.4 管理 Pod 中的容器 #
要向 Pod 中添加新容器,请结合 --pod
选项使用 podman run
命令。该命令的一般语法如下:
#
podman run[OPTIONS] --pod POD_NAME IMAGE
有关 podman run
命令的详细信息,请参见第 4.1 节 “运行容器”。
如果某个容器在进行初次运行后才添加到 Pod 中,podman start
命令就不允许启动该容器。
容器从 Pod 中去除后无法保持运行状态,因为容器本身会从主机上去除。
其他诸如启动、重启动和停止这样的操作则可以在不影响 Pod 状态的情况下针对特定容器执行。
5.5 监控 Pod 中的进程 #
要查看所有 Pod 中的所有容器,请使用以下命令:
#
podman ps -a --pod
该命令的输出结果如下所示:
CONTAINER ID IMAGE COMMAND CREATED STATUS [...] 4324f40c9651 k8s.gcr.io/pause:3.2 21 hours ago Created daa5732ecd02 k8s.gcr.io/pause:3.2 22 hours ago Up 3 hours ago e5c8e360c54b localhost/test:latest /bin/bash 3 days ago Exited (137) 3 days ago 82dad15828f7 localhost/opensuse/toolbox /bin/bash 3 days ago Exited (137) 3 days ago 1a23da456b6f docker.io/i386/ubuntu /bin/bash 4 days ago Exited (0) 6 hours ago df890193f651 localhost/opensuse/toolbox /bin/bash 4 days ago Created
前两条记录为每个 Pod 的 INFRA
容器,这些容器基于 k8s.gcr.io/pause:3.2
映像。输出结果中的其他容器为不属于任何 Pod 的独立容器。
5.6 去除 Pod #
可以通过两种方式去除删除 Pod。可以使用 podman pod
rm
命令去除一个或多个 Pod。或者,可以使用 podman pod prune
命令去除所有已停止的 Pod。
要去除一个或多个 Pod,请如下所示运行 podman pod
rm
命令:
#
podman pod rmPOD
POD 可以是 Pod 名称或 Pod ID。
要去除所有当前已停止的 Pod,请使用 podman pod
prune
命令。在运行 podman pod prune
命令之前,请确保所有已停止的 Pod 是您想要去除的 Pod,否则可能会去除仍在使用的 Pod。
6 法律声明 #
版权所有 © 2006–2024 SUSE LLC 和贡献者。保留所有权利。
根据 GNU 自由文档许可证 (GNU Free Documentation License) 版本 1.2 或(根据您的选择)版本 1.3 中的条款,在此授予您复制、分发和/或修改本文档的权限;本版权声明和许可证附带不可变部分。许可版本 1.2 的副本包含在题为“GNU Free Documentation License”的部分。
有关 SUSE 商标,请参见 https://www.suse.com/company/legal/。所有其他第三方商标分别为相应所有者的财产。商标符号(®、™ 等)代表 SUSE 及其关联公司的商标。星号 (*) 代表第三方商标。
本指南力求涵盖所有细节,但这不能确保本指南准确无误。SUSE LLC 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。