一、为什么要做无 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 |
bash
# 核心版本验证
docker version
podman --version
uname -a
四、Docker Rootless 模式部署实战
Docker 官方自 20.10 之后支持 rootless 模式,但是部署与调优仍然存在坑点。
1. 安装 Docker
bash
curl -fsSL https://get.docker.com/rootless | sh
安装完成后:
bash
export PATH=$HOME/bin:$PATH
systemctl --user start docker
systemctl --user enable docker
关键点解释
- Docker Rootless 运行在用户空间,无需 systemd 权限。
- 使用
systemctl --user管理服务。
2. 验证 Rootless 是否生效
bash
docker info | grep Rootless
输出应包含:
Rootless: true
3. 配置用户命名空间
我们使用了 subuid/subgid 扩展:
bash
echo "developer:100000:65536" >> /etc/subuid
echo "developer:100000:65536" >> /etc/subgid
这保证容器内用户映射到非 root 范围,提升安全性。
五、Podman Rootless 部署实战
Podman 从诞生起就以 Rootless 为设计初衷,因此部署通常更顺滑。
1. 安装 Podman
在 Ubuntu 环境下:
bash
sudo apt update
sudo apt install -y podman
无需额外专门的 Rootless 脚本,默认即支持。
2. 用户配置
Podman 自动读取现有 subuid/subgid,无需重复配置:
bash
cat /etc/subuid
cat /etc/subgid
3. 启动 Rootless Podman 服务
bash
systemctl --user enable --now podman.socket
然后测试:
bash
podman run hello-world
六、实战对比评测
我们从容器启动时间、内存占用、基本命令兼容度三个维度进行对比。测试镜像统一为 nginx:stable-alpine。
1. 容器启动时间对比
bash
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. 内存占用对比
使用 ps 与 smem 工具统计:
| 引擎 | 常驻内存 (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 默认性能不佳:
bash
sudo apt install slirp4netns
并可使用以下参数提升 NAT 性能:
bash
docker run --network=host ...
Podman 无法访问宿主端口
Podman 默认 rootless 网络使用 slirp4netns:
bash
podman run --network host nginx
说明:Rootless 模式下,开启 host 网络需要额外权限。
八、我在实战中的建议选择
| 场景 | 推荐 |
|---|---|
| 开发/CI 环境 | Podman Rootless |
| 安全隔离要求高 | Podman Rootless |
| 遗留依赖 Docker CLI | Docker Rootless |
| 需要强兼容 Docker Swarm | Docker Rootless |
九、关键配置与优化清单
text
/etc/subuid:
developer:100000:65536
/etc/subgid:
developer:100000:65536
bash
# 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、用户空间体验不一致的问题,本篇文章的实战经验和调优参数能让你在容器化落地上省去大量弯路。