是否要用 Podman 代替 Docker
Docker 作为最有名的容器引擎应该就不用我多说了。Podman 是 Redhat 开发的 “Docker 替代品”,特点是无需后台运行守护进程,并且是 rootless 的。
- 无守护进程是个好事,少个常驻进程。
- rootless 简单说就是普通用户可以以非 root 身份管理容器,具体可看官网介绍,现在 Docker 也有办法实现。
但 rootless 说是更安全,但是对我来说反倒会带来不方便,比如跑个 nginx 需要 80、443 ,普通用户没有权限创建,root/sudo 创建了之后普通用户又看不见这个容器。
Podman 用法和 Docker 基本上一样,甚至官方文档里说习惯 docker 的可以直接
alias docker=podman
。其实现在基本的容器引擎基本都是😂
Podman 优缺点
优点:
- 最明显的优点就是内存占用小。
- 无需守护进程,配置网络代理等时更方便。
缺点:
- 资料、热度不如 docker 多,不过很多其实是通用的。
- 更新不方便
Podman 和 Docker,各大发行版都会在官方仓库收录,安装都很简单。但是代价呢,大部分发行版是 Point-Release,仓库里的会锁版本。Docker 还有官方仓库,可以替换掉发行版仓库中的来更新,但是 Podman 不放出 deb、rpm 包,你想用最新版很困难。 - 配套的 podman compose 和 docker compose 有差别,有些用 docker compose 进行的特殊操作不好实现。
特点(可能是优点也可能是缺点):
- rootless
每个用户的容器是各自独立的,不扯安全性,多用户时只看隐私性这样也会更好。但是前面也说了,有些资源就是得 root 才能操作,你可能要 podman、 sudo podman 混用。 - 生态兼容,迁移成本低
因为容器的标准已经标准化(OCI, Open Container Initiative),所以相互之间兼容是很正常的,甚至 CLI 操作也基本一样。不过因为大部分常用镜像都放在 Docker Hub,而很多文档因为使用 docker 会有一些简写,比如省略 docker.io、library这些,你需要给 Podman 配置一下缺省使用 Docker Hub。
还有就是网络问题,待写。
内存占用对比
下面是 docker 和 podan 同时运行两个相同容器的进程信息,我整理并将两者分开后结果如下。
时间 2024.11,宿主系统 Alpine Linux 3.20
Podman
Tree: MemB
[-]─8125 conmon (/usr/bin/conmon --api-version 1 -c c6c992b132) 896K
│ └─ 8138 agent (./agent) 40M
[-]─28148 conmon (/usr/bin/conmon --api-version 1 -c c97c4960f) 896K
│ └─ 28159 frps (/usr/bin/frps -c /etc/frp/frps.toml) 24M
[-]─2138 supervise-daemo (supervise-daemon) 384K
│ └─ 2139 podman (/usr/bin/podman system service --time 0) 58M
Docker
Tree: MemB
[-]─28497 containerd-shim (containerd-shim-runc-v2) 20M
│ └─ 28518 agent (./agent) 44M
[-]─28416 containerd-shim (containerd-shim-runc-v2) 19M
│ └─ 28435 frps (/usr/bin/frps -c /etc/frp/frps.toml) 23M
[-]─2393 supervise-daemo (supervise-daemon) 384K
│ [-]─2394 dockerd (/usr/bin/dockerd) 108M
│ │ ├─ 2412 containerd 49M
│ │ ├─ 28482 docker-proxy 4.4M
│ │ ├─ 2395 log_proxy 1.4M
│ │ └─ 2397 log_proxy 1.4M
首先可以看到,对每个单独容器,每个容器对应的守护进程确相差挺大。Docker 的 containerd-shim 有 20 MB,而 Podman 的 conmon 却只有 1MB 不到。也就是每跑一个容器,Docker 要比 Podman 多用 20 MB.
还有就是容器引擎的守护进程。而前面说了 Podman 无守护进程,但是为什么我图中又有了,因为我图中用的宿主系统是 Alpine,没有用 Systemd 等那一套,不过这样对比也是明显的。结果显示 dockerd 占用是 160MB 以上,而podman 是不到 60 MB,相差大概 100 MB。
所以,假如你服务器上要跑 5 个容器,那么用 docker 和 podman 的内存占用就有 100+20*5=200 MB 的差距了。