podman支持通过为无根(rootless) 容器创建systemd user unit文件,可使用systemctl命令来管理它们,类似常规服务,例如:当将数据库或web服务器等服务部署为容器时,通常希望这些容器与服务器一起自动启动,通过enable这些服务,可以确保容器在主机启动时启动。同时容器以”无根”模式运行,可以非特权用户帐户管理这些服务,以提高安全性。

systemd可以管理user service,普通用户可以为自己的服务创建unit文件,并使用systemctl命令管理这些服务当用户服务类型为非根用户时,通过文本或图形控制台或使用SSH打开第一个会话时, 该服务将自动启动。当关闭最后一次会话时,服务将停止这种行为与系统服务不同,系统服务在系统启动时启动,在系统关闭时停止。但也可以更改此默认行为,通过运行loginctl enable-linger命令强制service在服务器启动时启动并在关闭时停止。逆向操作,请使用loginctl disable-linger命令查看当前状态,使用loginctl show-user username命令。

普通用户如何配置systemd服务的自启动呢?

要定义systemd user service,创建~/.config/systemd/user/目录来存储unit文件,语法与system unit file相同要了解更多细节,请查看systemd.unit(5)和systemd.service(5)要控制新user service,使用systemctl –user选项。下面的示例列出 ~/.config/systemd/user/ 中的unit文件,强制systemd重新加载其配置,然后enable和start myapp user service:

1[user@host ~]$ ls ~/ . config/systemd/user/
2myapp . service
3[user@host ~]$ systemctl --user daemon-reload
4[user@host ~]$ systemctl --user enable myapp.service
5[user@host -]$ systemctl --user start myapp.service

注:要使用systemctl –user命令,必须在控制台登录或直接通过SSH登录,不能使用sudo或su命令。systemctl 命令与每个用户的systemd –user进程交互。只有当用户第一-次从控制台或SSH登录时,系统才会启动该进程。如果是使用的su切换开启loginctl里,会报错,具体见下图:

loginctl

配置一个普通用户下的开机自启动容器服务:

 1//配置redhat quay registry的证书可信
 2[root@servera pem]# scp -rp root@utility:/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/pki/tls/certs/ca-bundle.crt
 3[user@servera ~]$ podman login registry.lab.example.com/       //该步操作之前需要先配置registries.conf文件里的可信,不然还是会报错。
 4Username: admin
 5Password: redhat321
 6Login Succeeded!
 7[user@servera ~]$ podman search registry.lab.example.com/    这里最后的斜线不能少
 8[user@servera ~]$ mkdir -p /home/user/www
 9[user@servera ~]$ podman run -d --name web -v /home/user/www:/var/www:Z registry.lab.example.com/rhel8/httpd-24
10[user@servera ~]$ mkdir -p .config/systemd/user/
11[user@servera ~]$ podman generate systemd --name web --files
12/home/user/container-web.service
13[user@servera ~]$ mv container-web.service .config/systemd/user/
14[user@servera ~]$ systemctl --user daemon-reload
15[user@servera ~]$ podman stop container-web && podman rm container-web
16[user@servera ~]$ systemctl --user enable container-web.service --now

podman generate systemd命令使用一个容器作为模型来创建配置文件。在创建文件之后,须删除容器podman generate systemd的选项:

  • –name container_name: name选项指定容器的名称,用作模板来生成unit文件。Podman 还使用该名称来生成unit文件的名称: containers-container_name.service
  • –files: files 选项指示Podman在当前目录中生成unit文件。如没有这个选项,Podman将在标准输出中显示该文件
  • –new: new选项指示Podman配置systemd服务,以便在服务启动时创建容器,并在服务停止时删除。在这种模式下,容器是临时的,通常需要持久存储来保存数据。没有-new选项,Podman 配置服务启动和停止现有的容器,而不删除。

通过查看使用了–new和不使用–new的区别会发现,使用的–new的服务,在关闭时会使用podman rm删除容器。

重要:使用systemctl命令管理的容器由systemd控制。systemd监视容器状态,并在它们失败时重新启动它们。不要使用podman命令来启动或停止这些容器。这样做可能会干扰systemd监视

下表总结了systemd系统和user services之间的区别: