Linux 容器技术实战:从 Docker 到 Podman 的无 root 权限部署

一、为什么要做无 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、用户空间体验不一致的问题,本篇文章的实战经验和调优参数能让你在容器化落地上省去大量弯路。

相关推荐
未济3 天前
linux 配置环境变量
linux
傲世仙尊3 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
_艾伦 耶格尔.3 天前
进程间通信
linux
Liuqy-053 天前
Linux IO编程——静态库、动态库
linux
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
玉&心3 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing3 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅3 天前
linux(8) 软硬链接
linux·运维·服务器
guo_wen_qiang3 天前
上传本地镜像到harbor中
docker·容器·持续部署