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. 内存占用对比

使用 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 默认性能不佳:

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

相关推荐
Tipriest_2 小时前
Linux 下开发 C/C++ 程序为什么头文件引用路径这么多和复杂
linux·c语言·c++
Tipriest_2 小时前
ubuntu快速查看一个apt包的描述信息和依赖等
linux·运维·ubuntu·apt
飞Link2 小时前
【Wandb】Linux环境下通过Docker部署Wandb教程
运维·docker·容器·数据挖掘
幺零九零零4 小时前
Docker底层-User Namespace
运维·docker·容器
时空无限4 小时前
EFK 中使用 ruby 和 javascript 脚本去掉日志中颜色字符详解
linux·javascript·elk·ruby
原神启动14 小时前
Docker 构建前后端项目Ruo-Yi
运维·docker·容器
张火火isgudi11 小时前
fedora43 安装 nvidia 驱动以及开启视频编解码硬件加速
linux·运维·视频编解码·nvidia
IT199512 小时前
Qt笔记-使用SSH2进行远程连接linux服务器并上传文件
linux·服务器·笔记
XXYBMOOO12 小时前
内核驱动开发与用户级驱动开发:深度对比与应用场景解析
linux·c++·驱动开发·嵌入式硬件·fpga开发·硬件工程