Red Hat Training

A Red Hat training course is available for RHEL 8

第 14 章 使用 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 的可移植描述。

14.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 模块已安装。

流程

  1. 创建 mysleep.container 单元文件:

    $ cat $HOME/.config/containers/systemd/mysleep.container
    [Unit]
    Description=The sleep container
    After=local-fs.target
    
    [Container]
    Image=registry.access.redhat.com/ubi8-minimal:latest
    Exec=sleep 1000
    
    [Install]
    # Start by default on boot
    WantedBy=multi-user.target default.target

    [Container] 部分中,您必须指定:

    • Image - 您要运行的容器镜像
    • Exec - 要在容器内运行的命令

      这可让您使用 systemd 单元文件中指定的所有其他字段。

  2. 根据 mysleep.container 文件创建 mysleep.service

    $ systemctl --user daemon-reload
  3. 可选:检查 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)
  4. 启动 mysleep.service

    $ systemctl --user start mysleep.service

验证

  1. 检查 mysleep.service 的状态:

    $ systemctl --user status mysleep.service
    ● mysleep.service - The sleep container
    	 Loaded: loaded (/home/username/.config/containers/systemd/mysleep.container; generated)
    	 Active: active (running) since Thu 2023-02-09 18:07:23 EST; 2s ago
       Main PID: 265651 (conmon)
          Tasks: 3 (limit: 76815)
    	 Memory: 1.6M
       	 CPU: 94ms
    	 CGroup: ...
  2. 列出所有容器:

    $ podman ps -a
    CONTAINER ID  IMAGE                            COMMAND               CREATED            STATUS                          PORTS   NAMES
    421c8293fc1b  registry.access.redhat.com/ubi8-minimal:latest               sleep 1000  30 seconds ago   Up 10 seconds ago systemd-mysleep

    请注意,创建的容器的名称由以下元素组成:

    • systemd- 前缀
    • systemd 单元的名称,即 systemd-mysleep

      这种命名有助于将常见容器与在 systemd 单元中运行的容器区分开来。它还有助于确定容器运行在哪个单元中。如果要更改容器的名称,请使用 [Container] 部分中的 ContainerName 字段。