Redhat/CentOS 8 版本中,docker 默认被 podman 取代,两者虽然兼容但是仍然有所差异
1 、 Podman
Podman 是一个无守护的容器引擎,用于在 Linux 系统上开发、管理和运行 OCI 容器。容器可以有根模式下运行,也可以在无根模式下运行。简单地说:“alias docker=podman” 。
2 、 Podman 的 使用
曾经,我们使用一个 Nginx 的 Docker 镜像需要用下列类似的命令
docker pull nginx:pecl docker network create lnmp --subnet=172.16.1.0/24 --gateway 172.16.1.254 docker run -d --name nginx --network=lnmp --ip 172.16.1.10 -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -v /var/log/nginx:/var/log/nginx:rw -p 80:80/tcp -p 443:443/tcp -p 443:443/udp --restart=unless-stopped nginx:perl
现在,我们有 podman 我们参考说明直接原样转换成 podman 的命令(实际过程通常都会报错)
podman pull nginx:pecl podman network create lnmp --subnet=172.16.1.0/24 --gateway 172.16.1.254 podman run -d --name nginx --network=lnmp --ip 172.16.1.10 -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -v /var/log/nginx:/var/log/nginx:rw -p 80:80/tcp -p 443:443/tcp -p 443:443/udp --restart=unless-stopped nginx:perl
你发现,并没有成功,原因有三点
1 、 podman 没有 network 参数,实际网络管理可查阅 [ 链接 ]
2 、 podman 不需要 --restart=unless-stopped
因为其本身没有守护进程。如果你需要守护进程可以使用 systemd 进行控制
3 、 podman 使用 pod 进行容器组的管理,不再像 docker 每次使用 network 管理。但是额外的网络配置,需要手动编辑位于 /etc/cni/net.d/
下的网卡文件
所以上面的命令,改进一下就是
podman pull nginx:pecl podman pod create --name lnmp podman run -d --name nginx --pod lnmp -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -v /var/log/nginx:/var/log/nginx:rw -p 80:80/tcp -p 443:443/tcp -p 443:443/udp -nginx:perl
关于守护进程,你可以手动创建一个 systemd 服务。(注意启动时多了一个 -a
参数才可以带日志正常启动)
配置文件参考 [ 链接 ] systemd 守护参考 [ 链接 ]
vim /etc/systemd/system/[email protected] [Unit] Description=Podman Container Wants=syslog.target network.target After=syslog.target network.target network-online.target [Service] Type=forking ExecStart=/usr/bin/podman container start %i ExecStop=/usr/bin/podman container stop -t 10 %i Restart=on-failure RestartSec=10s KillMode=none PIDFile=$(/usr/bin/podman inspect %i | grep ConmonPidFile | awk -F "\"" '{print $4}') [Install] WantedBy=multi-user.target
可能涉及到的命令替换 /bin/sh -c '/usr/bin/podman inspect music | grep ConmonPidFile | awk -F\" "{print \$4}"'
如果涉及到 Ubuntu 系统,由于高版本的 Systemd 无法调用 PIDFile 中的命令参数,所以需要额外做两部操作
创建服务时额外创建一个线程符号链接到指定路径 /run/podman/nginx.pid if [ -f /run/podman/nginx.pid ]; then /usr/bin/rm -f /run/podman/nginx.pid ; fi && /usr/bin/ln -s "$(/usr/bin/podman inspect nginx | grep ConmonPidFile | awk -F "\"" '{print $4}')" /run/podman/nginx.pid > /dev/null 2>&1
修改 PIDFile 指向新配置的符号链接 PIDFile=/run/podman/%i.pid