Docker Desktop 遇到麻烦了,Podman 能接班吗?

2023年8月,Docker公司宣布将Docker Desktop的付费限制从250人降到50人,超过就得掏钱。小团队和独立开发者炸了锅。一个朋友跟我吐槽:“我们5个人的团队,一年要多花5400块,就为了在Mac上跑个容器?”

与此同时,Podman在GitHub上的Star数突破2万。Red Hat力推的这款轻量化工具,口号是“无守护进程、无Root权限”。它真能替代Docker Desktop吗?我花了三天时间,在Mac和Linux上分别搭了环境,跑了同样的项目。结果有点意思。

安装:Docker Desktop一键搞定,Podman需要动动手

Docker Desktop的安装体验没得挑。官网下载dmg文件,双击、拖拽、打开,输入密码授权,5分钟搞定。它自动配置了Docker CLI、Compose,甚至集成了Kubernetes。新手打开就能跑docker run hello-world

Podman在Mac上就没这么顺滑了。它依赖一个叫podman-machine的虚拟机(默认用QEMU跑Fedora CoreOS)。安装步骤:先装Homebrew,然后brew install podman,再执行podman machine initpodman machine start。初始化花了大概8分钟,下载了800MB的虚拟机镜像。第一次跑容器时,我遇到了一个报错——Error: cannot connect to the Podman socket。查了文档,发现需要手动设置DOCKER_HOST环境变量。

说白了,Docker Desktop是“开箱即用”,Podman是“开箱需调”。但换个角度看,Podman的安装包只有30MB,Docker Desktop接近600MB。如果你硬盘吃紧,Podman赢了第一局。

命令行:几乎一模一样,但有一个致命差异

Podman官方说它兼容Docker CLI。我试了podman pull nginxpodman run -d -p 8080:80 nginxpodman ps,全部一次通过。连docker-compose都能用podman-compose替代,社区版支持度不错。

但有一个核心差异:守护进程

Docker Desktop在后台跑着dockerd守护进程,所有容器都通过它管理。如果守护进程挂了,所有容器也跟着凉。Podman没有守护进程,每个容器直接由podman进程管理。这意味着什么?我用kill -9强杀Docker Desktop进程后,正在运行的容器全部崩溃。同样操作在Podman上,容器照常运行。

这个差异在开发环境里不太明显,但如果你在CI/CD管道里跑容器,Podman的稳定性优势就出来了。据CNCF 2023年度调查,38%的受访者遇到过Docker守护进程泄漏内存的问题。

资源占用:Podman轻了不止一点

我拿一台MacBook Air M1(8GB内存)做测试。同时启动3个容器:Nginx、PostgreSQL、Redis。

Docker Desktop情况:

  • 进程数:dockerd + containerd + 3个容器进程 = 大约12个进程
  • 内存占用:dockerd约120MB,containerd约40MB,容器本身约200MB,合计360MB
  • 磁盘使用:虚拟磁盘文件(.qcow2)固定占8GB

Podman情况:

  • 进程数:仅3个容器进程 + 1个虚拟机进程(podman-machine),合计4个
  • 内存占用:虚拟机约150MB,容器本身200MB,合计350MB
  • 磁盘使用:虚拟机镜像800MB,无额外固定占用

看起来差距不大?但注意,Docker Desktop的8GB虚拟磁盘文件是固化的,即使你只跑一个容器,它也得占8GB。Podman的虚拟机镜像可以压缩,最小化部署时仅需200MB。对于笔记本只有256GB硬盘的开发者,这个差距很实在。

网络和卷挂载:Docker更顺手,Podman有小坑

Docker Desktop的网络模式简单直接。-p 8080:80就能把宿主机端口映射到容器,Mac用户还能用host.docker.internal访问宿主机服务。卷挂载也是-v /host/path:/container/path,自动处理权限。

Podman在这块有点麻烦。它的虚拟机跑的是Fedora CoreOS,宿主机文件系统通过virtiofs9p共享。我第一次挂载Mac上的/Users/me/project到容器里,发现容器内用户是root,而宿主机用户是me,文件权限全乱套了。解决方案是podman run --user 501:20(501是Mac上我的UID),或者用podman machine init --volume /Users/me/project:/project提前配置共享目录。

网络方面,Podman的-p映射没问题,但想访问宿主机服务,得用host.containers.internal,而不是Docker的host.docker.internal。小差异,但第一次遇到会卡一会儿。

生态兼容:Docker的护城河有多深?

Docker Desktop最大的优势不是技术,是生态。Docker Hub上有超过1500万个镜像,几乎每个开源项目都提供Dockerfile。Docker Compose是行业标准,Kubernetes集成也是开箱即用。

Podman虽然能拉Docker Hub的镜像,但有些镜像依赖Docker的特定行为。我试了一个需要/var/run/docker.sock的监控工具,Podman直接报错。解决方案是用podman socket命令创建一个兼容的socket,但多了一步配置。

另外,Docker Desktop支持Windows和Mac的GPU直通(比如在容器里跑PyTorch),Podman目前只支持Linux上的NVIDIA GPU,Mac用户没戏。

迁移成本:值不值得折腾?

我的结论分情况。

适合迁移的场景:

  • 团队人数少(50人以下),不想给Docker公司交钱
  • 硬盘空间紧张,机器内存只有8GB
  • 主要用Linux开发,Podman原生支持更好
  • 对稳定性要求高,不能接受守护进程挂掉

不建议迁移的场景:

  • 重度依赖Docker Compose(特别是多服务编排)
  • 需要GPU加速(Mac用户)
  • 团队已有成熟的Docker CI/CD流程,迁移成本高
  • 新手入门,Docker Desktop的学习曲线更低

我个人的建议:如果你的项目简单(两三个容器),Podman完全够用。但如果你在大型微服务架构里,Docker Desktop的生态便利性短期内无法替代。Podman在进步,但距离无缝替代还有一段路。

最后,别急着删Docker Desktop。两个工具可以共存——Podman的容器和Docker的容器互不干扰。先跑两周Podman,看看自己能不能接受那些小坑。毕竟,工具是拿来用的,不是拿来信仰的。