podman提供了和docker基本兼容的命令行操作,因此我们可以向使用docker那样使用podman(alias docker=podman)。和其他的容器引擎一样,podman也依赖于OCI兼容的容器运行时(runc、crun、runv等)用来创建容器。podman还支持普通用户权限创建容器、在创建容器的时候指定要使用的runtime。
systemd是成熟的初始化系统,由podman构建的OCI和docker格式的容器可以使用systemd像管理其他服务那样来管理。可以通过podman generate systemd命令为podman创建的容器或者pod来生成systemd的服务文件。
通过使用systemd来管理的容器,我们就可以管理其启动顺序,让容器中的服务像物理机上的服务一样按顺序启动。
前置知识
systemd启动服务由如下方式:
- 在系统启动的时候启动服务
# systemctl enable
Service文件需要放在/etc/system/system/目录下
- 在用户登录的时候启动服务,用户注销时关闭服务
$systemctl –user enable
Service文件需要放在$HOME/.config/systemd/user目录中
systemd管理podman容器步骤
下面说明如何通过podman生成systemd服务文件
- 创建要使用systemd管理的容器(httpd)
$ podman run -dt -p 8080:80 --name httpd docker.io/library/httpd:latest
- 使用容器名称或者id来生成一个服务文件
$ podman generate systemd --name httpd > ~/.config/systemd/user/container-httpd.service
如果~/.config/systemd/user/目录不存在请执行创建目录的命令来创建目录
$ mkdir -p ~/.config/systemd/user
- 查看生成的服务文件
cat ~/.config/systemd/user/container-httpd.service
# container-httpd.service # autogenerated by Podman 4.2.1 # Fri Oct 14 15:28:07 CST 2022 [Unit] Description=Podman container-httpd.service Documentation=man:podman-generate-systemd(1) Wants=network-online.target After=network-online.target RequiresMountsFor=/run/user/1000/containers [Service] Environment=PODMAN_SYSTEMD_UNIT=%n Restart=on-failure TimeoutStopSec=70 ExecStart=/usr/bin/podman start httpd ExecStop=/usr/bin/podman stop -t 10 httpd ExecStopPost=/usr/bin/podman stop -t 10 httpd PIDFile=/run/user/1000/containers/overlay-containers/05bda68bfd0e543d6fb5eda449c8890b8496e0ab77d5acbfe0123b98dd282a25/userdata/conmon .pid Type=forking [Install] WantedBy=default.target
- 此时可以通过systemd来进行管理podman的容器 在使用systemd管理之前,需要先停止该容器
$ podman stop httpd
$ systemctl –user start container-httpd
- 查看当前容器的状态
$ systemctl –user status container-httpd
- 验证下容器的功能
- 我们将此服务设置为自动启动
$systemctl --user enable container-httpd.service
- 重启机器进行服务验证
在重启机器之后,我们第一次登录系统的时候这个服务(容器)会被自动拉起。
此时我们的容器已经是通过systemd进行的管理,可以通过修改服务的依赖来设置容器的启动顺序、修改服务的重启策略来修改容器崩溃之后是否自动拉起等。