第 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
元数据包已安装。
流程
创建
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
单元文件中指定的所有其他字段。
-
根据
mysleep.container
文件创建mysleep.service
:$ systemctl --user daemon-reload
可选:检查
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)
启动
mysleep.service
:$ systemctl --user start mysleep.service
验证
检查
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: ...
列出所有容器:
$ 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
字段。
-