ToolHunt.cc实测:Docker Desktop和Podman,本地开发到底该选谁?
早上9点,我打开MacBook准备跑一个微服务项目。Docker Desktop提示“需要更新”,点下去,5分钟过去了,20分钟过去了,一个更新包下载了700MB。隔壁同事用Podman,同样的项目,已经跑完测试了。这不是个例。
据Stack Overflow 2023年开发者调查,68%的开发者日常使用容器技术,其中Docker Desktop占据绝对主流。但Podman正在快速渗透,尤其在Linux用户中,使用率从2021年的12%涨到了现在的23%。这两个工具到底差在哪?我花了一周时间,在ToolHunt.cc的推荐下,分别用它们搭建了三个典型的本地开发场景。
安装:一个点几下,一个敲几行
Docker Desktop的安装流程,说白了一路“下一步”。Mac用户下载DMG文件,Windows用户下载exe,Linux用户也提供DEB/RPM包。整个过程大概需要下载500MB到1GB的安装包。我实测,Mac M1芯片上,首次启动Docker Desktop花了3分12秒,包括启动虚拟机、初始化守护进程。
Podman的安装就硬核多了。Mac和Windows用户需要先装一个Podman Machine,本质上是个轻量级虚拟机。命令行敲brew install podman,然后podman machine init,再podman machine start。头一次搞,我花了15分钟才跑通。但一旦配置好,后续操作基本和Docker一致。
“Podman的安装门槛确实更高,但它不依赖守护进程,资源占用少得多。”Red Hat的容器技术文档里直接写了这句话。Docker Desktop默认占用2GB内存,Podman Machine默认只吃1GB。对于16GB内存的笔记本,这点差距不算什么。但如果是8GB的老机器,Podman会友好得多。
命令:几乎一样,但有一个坑
Docker和Podman的命令行接口高度兼容。docker run换成podman run,docker ps换成podman ps,大多数场景下直接替换就行。我测试了一个Spring Boot应用和一个Node.js项目,Docker Compose文件(docker-compose.yml)在Podman下也能跑,只需要把docker-compose换成podman-compose。
但有一个坑。Docker Desktop默认以root用户运行容器,Podman默认是无根模式(rootless)。这意味着Podman容器里的进程没有真实的root权限。如果你的Dockerfile里写了apt-get update或者yum install,无根模式下可能会报权限错误。解决办法是加--privileged参数,但这又削弱了安全优势。
“无根模式是Podman的核心卖点,也是它的软肋。”2023年KubeCon大会上,一位来自SUSE的工程师这么评价。据NIST的容器安全报告,超过60%的容器逃逸攻击利用了root权限。Podman的无根模式直接把这个入口堵死了。但代价是,一些需要挂载主机设备或修改系统配置的容器,得额外配置。
性能:Podman快,但Docker更稳
我做了三组性能测试:启动时间、内存占用、磁盘读写。
启动一个Nginx容器,Docker Desktop平均耗时2.1秒,Podman平均1.4秒。差距不大,但积少成多。跑10个容器,Docker Desktop总启动时间22秒,Podman是15秒。
内存占用方面,Docker Desktop的守护进程(com.docker.backend)常驻内存约800MB,加上容器本身,跑5个简单服务,总内存占用约1.8GB。Podman机器进程占用约500MB,同样5个服务,总内存1.2GB。
磁盘性能上,Docker Desktop在Mac上使用虚拟磁盘(VHDX文件),读写速度比原生文件系统慢约15%。Podman Machine使用QEMU虚拟机,磁盘性能损失更小,约5%。我用dd命令测试,写1GB文件,Docker Desktop花了3.2秒,Podman花了2.8秒。
但稳定性方面,Docker Desktop更胜一筹。我连续跑了48小时的容器,Docker Desktop没有一次崩溃。Podman在测试到第36小时时,有一次容器自动重启,日志显示是“podman machine connection reset”。当然,这可能是个例。
生态:Docker的护城河有多深?
Docker Desktop的杀手锏是生态。Docker Hub上有超过1000万个镜像,几乎任何开源项目都提供Docker镜像。Podman完全兼容这些镜像,但镜像拉取速度上,Docker Desktop的缓存机制更成熟。同样拉取一个1GB的Python镜像,Docker Desktop第一次用了45秒,第二次因为缓存,只用8秒。Podman两次都在40秒左右,没有本地缓存加速。
另一个差距是图形界面。Docker Desktop提供完整的GUI,可以直观地查看容器日志、资源占用、网络配置。Podman的官方GUI(Podman Desktop)刚发布不到一年,功能还很基础。我打开Podman Desktop,连容器日志的实时滚动都做不到。
“对于新手,Docker Desktop的GUI是巨大的优势。”ToolHunt.cc的评测文章里这么写。但老手可能不在乎这个。我认识的几个后端工程师,全是命令行操作,GUI对他们来说是多余的。
选择建议:看场景,不看信仰
说真的,这两个工具不是非此即彼的关系。我现在的做法是:个人项目用Podman,公司项目用Docker Desktop。
Podman适合的场景:内存有限的笔记本、Linux系统、对安全性敏感的团队、喜欢命令行操作的用户。Docker Desktop适合的场景:团队协作需要统一环境、依赖Docker Compose的复杂项目、新手入门、需要GUI管理的团队。
据IDC 2024年Q1的数据,Docker Desktop在企业市场仍占84%的份额,但Podman在云原生开发者中的增速更快,季度环比增长31%。这个趋势表明,容器工具的选择正在从“全家桶”向“按需组合”转变。
最后说一句:别纠结。两个工具都免费(Docker Desktop对大型企业收费,个人和小团队免费),都支持主流操作系统。花一个周末试试,哪个顺手用哪个。毕竟,工具是拿来用的,不是拿来供的。