Podman 比较简单粗暴,它不使用 Daemon,而是直接通过 OCI runtime(默认也是 runc)来启动容器,所以容器的进程是 /usr/bin/conmon的子进程 。这比较像 Linux 的 fork/exec 模型,而 Docker 采用的是 C/S(客户端/服务器)模型。与 C/S 模型相比,fork/exec 模型有很多优势,比如:

  • 系统管理员可以知道某个容器进程到底是谁启动的。
  • 如果利用 cgroup 对 podman 做一些限制,那么所有创建的容器都会被限制。
  • SD_NOTIFY : 如果将 podman 命令放入 systemd 单元文件中,容器进程可以通过 podman 返回通知,表明服务已准备好接收任务。
  • socket 激活 : 可以将连接的 socket 从 systemd 传递到 podman,并传递到容器进程以便使用它们。

实际上 podman 由两部分组成,一个是 podman CLI,还有一个是 container runtime,container runtime 由 conmon 来负责,主要包括监控、日志、TTY 分配以及类似 out-of-memory 情况的杂事。也就是说,所有容器都一个父进程conmon。 conmon项目:https://github.com/containers/conmon
image.png

Podman配置文件:

主要配置文件:/usr/share/containers/containers.conf

cni网络配置 /etc/cni/net.d/87-podman-bridge.conflist

镜像仓库配置 /etc/containers/registries.conf

文件系统配置 /etc/containers/storage.conf

在执行 podman run 或者 podman build 命令时自动挂载的路径 /usr/share/containers/mounts.conf
容器内允许的 seccomp 规则白名单/usr/share/containers/seccomp.json

/etc/containers/policy.json 证书安全相关配置

操作命令(基本和docker一样):

podman run -it docker.io/library/centos sh

podman ps

podman stop af3d9001ad32

podman run -dt —name hc1 registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx

conmon进程

conmon进程收到SIGTERM/SIGQUIT/SIGINT 退出前,会把相同的信号发送给容器1号进程