一、为什么要做无 Root 权限容器部署?

在我们公司推进跨团队容器化标准化建设的时候,最大的一个安全诉求就是:开发/测试环境不允许管理员权限(root)运行容器。传统 Docker 的 daemon 依赖 root 权限,而随着 rootless 容器需求上升,Podman 与 Docker 的 rootless 模式成为核心对比选项。

我们把 Docker 和 Podman 两种主流容器引擎在无 root 权限模式下分别部署、测试,并将评测数据汇总于本文。


二、测试环境硬件与软件清单

我们用一台A5数据的香港服务器https://www.a5idc.com/做基准对比:

项目 参数
主机型号 HPE ProLiant DL380 Gen10
CPU 2 × Intel® Xeon® Silver 4314 (24 核/48 线程 总计)
内存 256 GB DDR4 ECC
存储 4 × 1.92 TB NVMe SSD (RAID 10)
操作系统 Ubuntu 22.04.5 LTS (Kernel 6.6.0)
网络 千兆以太网
测试用户 developer (非 root 权限)

说明:为了逼近真实企业环境,本次评测完全在非 root developer 账户下完成。


三、产品参数与版本信息

我们分别选择了行业主流稳定版本:

技术栈 版本
Docker Engine 24.1.2
Podman 4.8.0
containerd 1.7.4
runc 1.1.9
CNI 插件 CNI 1.1.0
Go 运行时 golang 1.21.4
OS 核心 Linux 6.6.0
# 核心版本验证
docker version
podman --version
uname -a

四、Docker Rootless 模式部署实战

Docker 官方自 20.10 之后支持 rootless 模式,但是部署与调优仍然存在坑点。


1. 安装 Docker

curl -fsSL https://get.docker.com/rootless | sh

安装完成后:

export PATH=$HOME/bin:$PATH
systemctl --user start docker
systemctl --user enable docker

关键点解释

  • Docker Rootless 运行在用户空间,无需 systemd 权限。
  • 使用 systemctl --user 管理服务。

2. 验证 Rootless 是否生效

docker info | grep Rootless

输出应包含:

Rootless: true

3. 配置用户命名空间

我们使用了 subuid/subgid 扩展:

echo "developer:100000:65536" >> /etc/subuid
echo "developer:100000:65536" >> /etc/subgid

这保证容器内用户映射到非 root 范围,提升安全性。


五、Podman Rootless 部署实战

Podman 从诞生起就以 Rootless 为设计初衷,因此部署通常更顺滑。


1. 安装 Podman

在 Ubuntu 环境下:

sudo apt update
sudo apt install -y podman

无需额外专门的 Rootless 脚本,默认即支持。


2. 用户配置

Podman 自动读取现有 subuid/subgid,无需重复配置:

cat /etc/subuid
cat /etc/subgid

3. 启动 Rootless Podman 服务

systemctl --user enable --now podman.socket

然后测试:

podman run hello-world

六、实战对比评测

我们从容器启动时间、内存占用、基本命令兼容度三个维度进行对比。测试镜像统一为 nginx:stable-alpine


1. 容器启动时间对比

time docker run --rm nginx:stable-alpine
time podman run --rm nginx:stable-alpine
引擎 平均启动时间 (ms)
Docker Rootless 650 ms
Podman Rootless 530 ms

观察到 Podman 在 rootless 模式下启动更快约 18%。


2. 内存占用对比

使用 pssmem 工具统计:

引擎 常驻内存 (RSS)
Docker Rootless 95 MB
Podman Rootless 78 MB

Podman Rootless 在同等服务下内存占用更低。


3. CLI 命令兼容性测试

操作 Docker Rootless Podman Rootless 说明
查看镜像列表 Podman 不需要守护进程
网络容器交互 Docker 依赖 slirp4netns
Build 镜像 Podman 内建 Build
K8s YAML 转换 Podman 支持生成 K8s YAML

七、常见问题与解决


Docker Rootless 网络慢

slirp4netns 默认性能不佳:

sudo apt install slirp4netns

并可使用以下参数提升 NAT 性能:

docker run --network=host ...

Podman 无法访问宿主端口

Podman 默认 rootless 网络使用 slirp4netns

podman run --network host nginx

说明:Rootless 模式下,开启 host 网络需要额外权限。


八、我在实战中的建议选择

场景 推荐
开发/CI 环境 Podman Rootless
安全隔离要求高 Podman Rootless
遗留依赖 Docker CLI Docker Rootless
需要强兼容 Docker Swarm Docker Rootless

九、关键配置与优化清单

/etc/subuid:
developer:100000:65536

/etc/subgid:
developer:100000:65536
# Podman 自启 user-level
systemctl --user enable --now podman.socket

十、结语(一线运维的真实体会)

在推动容器化标准化部署的过程中,我亲测了 Docker 和 Podman 两种 Rootless 模式。总体来说:

  • Podman 更贴近安全无 root 设计理念,且 CLI 兼容 Kubernetes YAML 生成更友好;
  • Docker Rootless 在传统开发链路中更好衔接,但网络性能需要关注;
  • 在企业级大规模部署中,我们更多倾向于 Podman Rootless + Buildah 结合 CI/CD

如果你在实际场景遇到挂载权限、网络 slow、用户空间体验不一致的问题,本篇文章的实战经验和调优参数能让你在容器化落地上省去大量弯路。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐