普通用户Podman容器服务自启动

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:



<br />
[user@host ~]ls ~/ . config/systemd/user/
myapp . service
[user@host ~] systemctl --user daemon-reload
[user@host ~]systemctl --user enable myapp.service
[user@host -] systemctl --user start myapp.service
注:要使用systemctl --user命令,必须在控制台登录或直接通过SSH登录,不能使用sudo或su命令。systemctl 命令与每个用户的systemd --user进程交互。<span style="color:#E53333;"><strong>只有当用户第一-次从控制台或SSH登录时,系统才会启动该进程。如果是使用的su切换开启loginctl里,会报错</strong></span>,具体见下图:



<img src="https://www.361way.com/wp-content/uploads/2021/01/loginctl.png" width="600" height="140" alt="" />



<br />



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



<br />
//配置redhat quay registry的证书可信
[root@servera pem]# scp -rp root@utility:/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/pki/tls/certs/ca-bundle.crt
[user@servera ~]podman login registry.lab.example.com/       //该步操作之前需要先配置registries.conf文件里的可信,不然还是会报错。
Username: admin
Password: redhat321
Login Succeeded!
[user@servera ~] podman search registry.lab.example.com/    这里最后的斜线不能少
[user@servera ~]mkdir -p /home/user/www
[user@servera ~] podman run -d --name web -v /home/user/www:/var/www:Z registry.lab.example.com/rhel8/httpd-24
[user@servera ~]mkdir -p .config/systemd/user/
[user@servera ~] podman generate systemd --name web --files
/home/user/container-web.service
[user@servera ~]mv container-web.service .config/systemd/user/
[user@servera ~] systemctl --user daemon-reload
[user@servera ~]podman stop container-web && podman rm container-web
[user@servera ~] systemctl --user enable container-web.service --now
podman generate systemd命令使用一个容器作为模型来创建配置文件。在创建文件之后,须删除容器podman generate systemd的选项:&nbsp;



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



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



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



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



<img src="https://www.361way.com/wp-content/uploads/2021/01/systemctl-user.png" width="600" height="438" alt="" />

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注