跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / 使用 Podman 进行基本的容器管理

使用 Podman 进行基本的容器管理

出版日期:2024-11-12
解释

容器提供了轻量级虚拟化方法,可在一台主机上同时运行多个虚拟环境(容器)。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,您可以如下所述安装它:

  1. 运行以下命令:

    > sudo transactional-update pkg install podman*
  2. 重启动系统以引导进入新快照。

3 获取容器映像

要运行容器,需要有一个映像。映像包含运行应用程序所需的全部依赖项。您可以从映像注册表获取映像。/etc/containers/registries.conf 配置文件中定义了可用的注册表。如果您有一个本地映像注册表或想要使用其他注册表,请将相应注册表添加到配置文件中。

重要
重要:SLE Micro 中没有用于构建映像的工具

SLE Micro 未提供用于构建自定义映像的工具。因此,可用来获取映像的唯一方法是从映像注册表中提取映像。

注意
注意:默认情况下未启用 openSUSE 注册表和 Docker Hub

默认安装中未配置 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 获取映像

如果您在使用 Cockpit,还可以在 Podman 容器菜单中单击 + 获取新映像,从某个映像注册表中提取映像。

借助 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。

注意
注意: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

如果某个容器在进行初次运行后才添加到 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。