#1 Podman 为什么不需要 root 权限

2026-02-18

Docker 和 Podman 都是主流容器工具,但它们的架构设计存在明显差异。Docker Engine 采用中心化的守护进程架构,Podman 则从设计上支持无守护进程运行。

Docker 的核心是 dockerd。 传统模式下,dockerd 通常以 root 权限运行,负责接收客户端请求,并通过 containerd、containerd-shim 和 runc 等组件管理容器生命周期。用户加入 Docker 组后,便可以通过守护进程执行高权限操作,因此 Docker 组通常具有接近 root 的主机控制能力。

Docker 并非无法实现 Rootless。它也支持让守护进程和容器以普通用户权限运行,但需要额外配置,且部分网络、存储和特权操作存在限制。

Podman 采用不同的设计。 它不依赖常驻的中心化守护进程,而是通过自身进程调用底层运行时(如 crun),并使用 conmon 监控容器。配合 Linux 用户命名空间,容器内的 root 可以映射为宿主机上的普通用户,从而降低容器对主机的权限要求。Podman 还可以与 systemd 集成,将容器和 Pod 管理为用户级服务。

Rootless 模式需要解决 UID/GID 映射问题。容器内可能存在多个用户,因此通常需要为宿主机用户配置 subordinate UID/GID 范围,即 /etc/subuid 和 /etc/subgid。

为什么 Docker 不默认采用 Podman 的设计? 这主要是历史路径和生态兼容性的取舍。Docker 早期便围绕守护进程构建了完整的 API、Compose 和自动化工具生态。改变默认架构不仅涉及权限,还会影响资源管理、容器生命周期及现有工作流。此外,Rootless 并不能完全替代宿主机管理员权限,网络、存储和设备访问仍有兼容性边界。

总体而言,Docker 优先考虑集中管理与生态兼容,Podman 更强调无守护进程和 Rootless 安全模型。对于希望在 Ubuntu 上以普通用户运行容器、通过 systemd 管理服务的场景,Podman 值得考虑;如果高度依赖现有 Docker 工具链,Docker Engine 依然是合理选择。两者并非绝对对立,真正的差异在于架构取舍与默认运行模式。