是否要用 Podman 代替 Docker

是否要用 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 的差距了。