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

相关推荐
GeW18 分钟前
新质生产力Linux和数据库为啥这么关键
linux
番茄啊1 小时前
linux 开启xftp连接
linux·运维·服务器
CodeYp20191 小时前
第1讲:Linux 基础指令
linux·指令
IT利刃出鞘1 小时前
Docker Compose--解决修改配置后不生效的问题
运维·docker·容器
java_logo2 小时前
Docker 部署 CloudBeaver:轻松搭建网页数据库管理平台
数据库·docker·容器·数据库管理·dbeaver·轩辕镜像·cloudbeaver
李松桃2 小时前
基于端口号的服务配置
linux·nginx-核心模块配置
Lsetea2 小时前
Docker更新SSL证书后容器仍读旧文件:单文件挂载与目录挂载排查
运维·nginx·docker·https·ssl证书
好用斋3 小时前
拾光坞安装网盘聚合LitePan:把Docker命令翻译成图形界面
运维·docker·容器
对象存储与RustFS4 小时前
Velero 接 RustFS 实操:K8s 集群备份落到自建对象存储
后端·docker·云原生
CodeYp20196 小时前
第14讲:mmap 实现文件 LRU 缓存
linux·lru·mmap