第 14 章 使用 Podman 将容器移植到 systemd

Podman (Pod Manager)是一个简单的无守护进程工具,功能齐全的容器引擎。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/ubi9-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/ubi9-minimal:latest               sleep 1000  30 seconds ago   Up 10 seconds ago systemd-mysleep

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

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

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