今天实践docker/podman容器自启动设置。podman时红帽8预装的容器,相比于docker,podman是无守护程序容器引擎Daemonless以及无根容器Rootless。没有守护进程就没有单点,那么管理容器的方法只能利用systemd了。
下面详细介绍两种容器的开机启动设置。
一、docker容器
测试平台:树莓派4B。
docker容器是有守护进程的 dockerd,需要先systemctl enable docker设置docker开机自启动,然后再设置docker某个容器在docker服务启动后自启动。
Docker容器的重启都是由Docker守护进程完成的。使用在Docker run的时候使用--restart参数来设置,可以指定一个重启策略,用于在退出时应该或不应该重新启动容器。在docke官网查看重启策略,上面也有其他详细的说明信息。

no:退出时不要自动重启容器。这是默认设置。
on-failure[:max-retries]:仅当容器以非零退出状态退出时才重新启动。(可选)限制 Docker 守护程序尝试重新启动的次数。
always:无论退出状态如何,始终重新启动容器。当您指定 always 时,Docker 守护进程将尝试无限期地重新启动容器。无论容器的当前状态如何,容器也将始终在守护程序启动时启动。
unless-stopped:无论退出状态如何,始终重启容器,包括守护进程启动时,除非容器在 Docker 守护进程停止之前进入停止状态。
每次重新启动之前都会增加一个不断增加的延迟(前一个延迟的两倍,从 100 毫秒开始),以防止服务器泛滥。这意味着守护程序将等待 100 毫秒,然后是 200 毫秒、400、800、1600 毫秒,依此类推,直到达到on-failure限制,或者您docker stop 或docker rm -f容器时。如果容器成功重启(容器启动并运行至少 10 秒),延迟将重置为其默认值 100 毫秒。
使用nginx容器来测试:
docker run -itd --name nginx -p 8080:80 --restart=always nginx
上面的docker运行成功后,可以实用docker ps查看运行的容器,或者 curl localhost:8080 查看nginx网络服务是否正常。用于docker events查看生效的重启策略也很有用,但是笔者使用后一直卡住,没法查看。

重启一下docker服务: sudo systemctl restart docker ,然后docker ps查看nginx容器自启动成功。

容器的(尝试)重启次数可以通过docker inspect获得。
查看重启次数:docker inspect -f "{{ .RestartCount }}" nginx
查看启动时间:docker inspect -f "{{ .State.StartedAt }}" nginx

笔者使用docker stop nginx 手动停止容器后,发现没有自动重启。使用ps -ef | grep nginx 找到nginx: master process的PID,sudo kill -9 4386杀掉nignx进程,再次使用docker inspect -f "{{ .RestartCount }}" nginx查看重启次数变为1。

二、podman容器
测试平台:CentOS8 。
CentOS8默认时podman容器, Podman 没有 daemon守护进程,--restart 参数被废弃了,要想实现开机自动启动容器,只能通过 systemd 来管理了。
以前笔者使用在/usr/lib/systemd/system目录下新建podman_nginx.service,详情参考笔者的文章-CentOS8的podman容器 。
今天来使用 podman generate来实现。 podman generate --help来查看。里面有两种管理方式 kube和 systemd 。在使用podman generate systemd --help来查看systemd的方式。

等等!Podman 时无根容器,podman不需要sudo访问。那么做成服务使用systemctl来管理,就是要root权限。systemd可以管理user service,普通用户可以为自己的服务创建.unit,并使用 systemctl --user来管理。使用 man systemd.unit产看帮助信息,在里面搜索user可以查看建立$HOME/.config/systemd/user来使用用户配置。
使用mkdir -p $HOME/.config/systemd/user来创建这样的目录。
在这个目录下创建用户的.servoice文件:podman generate systemd -f -n nginx
停止正在运行的容器podman stop nginx 。
添加开机启动:systemctl --user enable container-nginx.service,可以查看创建了Created symlink,和我们设置系统开机启动一样。如不需要开机启动,只需要systemd的管理方式,那么九无需设置这一步,或者systemctl --user disable container-nginx.service来取消开机自启动。

接下里就可以重启物理机来测试了!既然添加了.service服务,那么以后的管理方式就使用systemctl来管理了。systemctl --user是不需要root权限的。

另外,CentOS8 的firewalld防火墙策略是白名单,用浏览器在局域网访问nginx容器时需要添加映射的8080端口:firewall-cmd --permanent --zone=public --add-port=8080 或者关闭防火墙:systemctl stop firewalld.service 。
网友评论