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
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号进程