14.7. 使用 systemd 自动启动 pod
您可以将多个容器作为 systemd
服务启动。请注意,system
ctl 命令应该只用于 pod,不应通过 systemctl
单独启动或停止容器,因为它们由 pod 服务与内部 infra-container 一起管理。
从 Podman v4.6 开始,您可以使用描述如何以类似于常规 systemd
单元文件的格式运行容器的 Quadlets ,并隐藏了在 systemd
下运行容器的复杂性。
先决条件
-
container-tools
元数据包已安装。
流程
创建一个空 pod,如
systemd-pod
:$ podman pod create --name systemd-pod 11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577
可选:列出所有 pod:
$ podman pod ps POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 11d4646ba41b systemd-pod Created 40 seconds ago 1 8a428b257111 11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577
在空 pod 中创建两个容器。例如,要在
systemd-pod
中创建container0
和container1
:$ podman create --pod systemd-pod --name container0 registry.access.redhat.com/ubi9 top $ podman create --pod systemd-pod --name container1 registry.access.redhat.com/ubi9 top
可选:列出与其关联的所有 pod 和容器:
$ podman ps -a --pod CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 24666f47d9b2 registry.access.redhat.com/ubi9:latest top 3 minutes ago Created container0 3130f724e229 systemd-pod 56eb1bf0cdfe k8s.gcr.io/pause:3.2 4 minutes ago Created 3130f724e229-infra 3130f724e229 systemd-pod 62118d170e43 registry.access.redhat.com/ubi9:latest top 3 seconds ago Created container1 3130f724e229 systemd-pod
为新的 pod 生成
systemd
单元文件:$ podman generate systemd --files --name systemd-pod /home/user1/pod-systemd-pod.service /home/user1/container-container0.service /home/user1/container-container1.service
请注意,生成了三个
systemd
单元文件,一个用于systemd-pod
pod,两个用于容器container0
和container1
。显示
pod-systemd-pod.service
单元文件:$ cat pod-systemd-pod.service # pod-systemd-pod.service # autogenerated by Podman 3.3.1 # Wed Sep 8 20:49:17 CEST 2021 [Unit] Description=Podman pod-systemd-pod.service Documentation=man:podman-generate-systemd(1) Wants=network-online.target After=network-online.target RequiresMountsFor= Requires=container-container0.service container-container1.service Before=container-container0.service container-container1.service [Service] Environment=PODMAN_SYSTEMD_UNIT=%n Restart=on-failure TimeoutStopSec=70 ExecStart=/usr/bin/podman start bcb128965b8e-infra ExecStop=/usr/bin/podman stop -t 10 bcb128965b8e-infra ExecStopPost=/usr/bin/podman stop -t 10 bcb128965b8e-infra PIDFile=/run/user/1000/containers/overlay-containers/1dfdcf20e35043939ea3f80f002c65c00d560e47223685dbc3230e26fe001b29/userdata/conmon.pid Type=forking [Install] WantedBy=multi-user.target default.target
-
[Unit]
部分中的Requires
行定义container-container0.service
和container-container1.service
单元文件的依赖项。两个单元文件都会被激活。 -
[Service]
部分中的ExecStart
和ExecStop
行分别启动和停止 infra-container。
-
显示
container-container0.service
单元文件:$ cat container-container0.service # container-container0.service # autogenerated by Podman 3.3.1 # Wed Sep 8 20:49:17 CEST 2021 [Unit] Description=Podman container-container0.service Documentation=man:podman-generate-systemd(1) Wants=network-online.target After=network-online.target RequiresMountsFor=/run/user/1000/containers BindsTo=pod-systemd-pod.service After=pod-systemd-pod.service [Service] Environment=PODMAN_SYSTEMD_UNIT=%n Restart=on-failure TimeoutStopSec=70 ExecStart=/usr/bin/podman start container0 ExecStop=/usr/bin/podman stop -t 10 container0 ExecStopPost=/usr/bin/podman stop -t 10 container0 PIDFile=/run/user/1000/containers/overlay-containers/4bccd7c8616ae5909b05317df4066fa90a64a067375af5996fdef9152f6d51f5/userdata/conmon.pid Type=forking [Install] WantedBy=multi-user.target default.target
-
[Unit]
部分中的BindsTo
行定义pod-systemd-pod.service
单元文件的依赖项 -
[Service]
部分中的ExecStart
和ExecStop
行分别启动和停止container0
。
-
显示
container-container1.service
单元文件:$ cat container-container1.service
将所有生成的文件复制到
$HOME/.config/systemd/user
中,以便以非 root 用户身份安装:$ cp pod-systemd-pod.service container-container0.service container-container1.service $HOME/.config/systemd/user
启用该服务并在用户登录时启动:
$ systemctl enable --user pod-systemd-pod.service Created symlink /home/user1/.config/systemd/user/multi-user.target.wants/pod-systemd-pod.service
/home/user1/.config/systemd/user/pod-systemd-pod.service. Created symlink /home/user1/.config/systemd/user/default.target.wants/pod-systemd-pod.service /home/user1/.config/systemd/user/pod-systemd-pod.service. 请注意,服务会在用户注销时停止。
验证
检查是否启用该服务:
$ systemctl is-enabled pod-systemd-pod.service enabled
其他资源
-
podman-create
、podman-generate-systemd
和systemctl
man page - 使用 Podman 和共享 systemd 服务运行容器
- 启用一个系统服务,以便在引导时启动