Podman 的使用和差异点记录

2019-11-10 2302点热度 1人点赞

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

StarryVoid

Have a good time