Docker Desktop vs Podman:本地容器管理,谁更省资源?

2024年,全球超过1500万开发者每天使用容器工具。本地跑容器,Docker Desktop曾是默认选项。但Podman这个后起之秀,正被越来越多的人讨论。

一个朋友上周跟我吐槽:他的MacBook Pro 16GB内存,开了Docker Desktop后,Chrome标签页都不敢多开。换成Podman后,说“像换了台电脑”。这事让我决定认真测一测。

核心差异:守护进程 vs 无守护进程

Docker Desktop依赖一个后台守护进程(dockerd)。你敲docker run,命令发给守护进程,它去拉镜像、创建容器。守护进程挂了,所有容器跟着完蛋。

Podman采用无守护进程架构。每个容器直接由podman命令启动,是系统普通进程。好处是什么?容器不依赖中央控制器,一个容器崩溃不影响其他。

技术上,Docker Desktop在Mac/Windows上必须跑Linux虚拟机。据Docker官方数据,这个虚拟机默认占用2GB内存。Podman通过podman machine也跑虚拟机,但可配置的资源更灵活。实测中,Podman的虚拟机默认只吃512MB内存。

性能对比:CPU和内存谁更省

拿同一台机器测:MacBook Air M1,8GB内存,跑一个Nginx容器。

Docker Desktop 4.25版本,空闲状态下后台进程占用约1.2GB内存。启动一个Nginx容器后,总内存占用跳到1.8GB。CPU在空闲时偶尔跳0.5%-2%。

Podman 4.8版本,podman machine虚拟机初始占用450MB。启动相同Nginx容器后,总占用约700MB。CPU基本不吃。

磁盘I/O上差距更大。Docker Desktop在Mac上通过osxfsgRPC FUSE做文件共享,写大文件时延迟明显。我一个同事用Docker跑MySQL,数据目录在宿主机,写入速度比原生慢30%。Podman用virtiofs,实测写入速度接近原生,差距在5%以内。

网络性能呢?Docker Desktop默认NAT模式,Podman用slirp4netns。两者吞吐量接近,但Podman的延迟略低,约少0.2毫秒。

兼容性:docker命令能直接迁移吗

Podman支持docker别名。装个podman-docker包,就能把docker命令映射到Podman。大部分docker-compose文件也能直接跑。

踩过的坑:Docker Desktop的docker buildx多架构构建,Podman原生不支持。不过Podman有podman build配合QEMU,能实现类似功能。还有,Docker Desktop的Kubernetes集成是点一下启动,Podman需要自己装minikube或kind。

据Red Hat文档,Podman兼容95%以上的Docker命令。剩下5%主要是Docker Swarm和某些企业插件。

资源占用的代价

Podman省资源,但牺牲了便利性。

Docker Desktop开箱即用。装完点几下,Kubernetes、Docker Compose全配好。Podman需要手动配置podman machine,设置端口转发、卷挂载。第一次用,我花了半小时才让容器访问宿主机文件。

Docker Desktop有图形界面,能看到容器日志、监控资源。Podman的图形界面podman-desktop还在开发中,功能简陋。

还有个细节:Docker Desktop支持Windows容器(Windows Container),Podman不行。如果你要跑.NET Framework应用,Docker是唯一选择。

选谁?看场景

个人开发机,内存8GB以下,或者你讨厌后台多一个守护进程,Podman更合适。我认识几个前端开发者,跑Node.js容器,Podman足够。

团队协作,要统一环境,或者你依赖Docker Compose的复杂编排,Docker Desktop更省心。毕竟同事出问题,你能用同一套工具链排查。

企业环境,考虑许可费。Docker Desktop对大型企业收费(每人每月5美元起)。Podman完全开源,无商业限制。

最后说一句:没有绝对更好的工具。我自己的做法是,开发用Podman,CI/CD用Docker。两者不冲突,选适合自己的就行。