rootless 模式是什么
rootless 模式让整个 Docker 守护进程以普通用户身份运行,容器与运行时默认不具备宿主 root 权限。它适合单机开发、需要降低提权风险的构建机以及多租户实验环境;代价是低端口发布、部分存储与网络特性受限,选型时要逐项确认。
基本信息
| 定位 | 守护进程本身以非 root 用户运行 |
|---|---|
| 识别 | docker info 的 Security Options 含 rootless |
| 典型限制 | 低端口发布、部分存储驱动、部分资源限制 |
| 进程管理 | systemctl --user 管理用户级服务 |
| 适用平台 | 以 Linux 为主,官方提供 rootless 安装脚本 |
典型使用场景
- 个人开发机:不需要 root 就能跑容器,降低误操作影响面
- 共享构建机上按用户隔离,构建任务之间互不干扰
- 多租户实验环境,避免租户借容器拿到宿主 root
- 安全要求较高的环境里,把 Docker 权限从系统层收回到用户层
- 做权限模型验证:同一套镜像在 rootless 下能否正常运行
环境识别
环境识别
docker info -f '{{json .SecurityOptions}}' # 输出含 rootless 说明当前是 rootless
docker context ls # 确认命令指向哪个守护进程
systemctl --user status docker | head -5 # 用户级服务的状态
docker run --rm alpine id # 核对容器内的实际用户身份与系统级 Docker 的差别
| 维度 | rootless | 系统级 Docker |
|---|---|---|
| 守护进程身份 | 普通用户 | root |
| 容器内默认用户 | 由镜像与运行参数决定 | 常见为 root |
| 低端口发布 | 默认受限,需额外配置或转发 | 可直接绑定 |
| 资源限制 | 部分特性行为不同 | 完整支持 |
低端口发布可以在宿主调整未特权端口起始值,或借助端口转发组件解决;功能差异要在选型阶段逐项确认,别等上线才发现。
系统级 Docker 与 rootless 实例并存时,命令指向取决于 context,排查前先确认连的是哪个守护进程。
rootless 下的资源限制与部分存储驱动行为不同,压测基线不能直接照搬系统级 Docker 的结论。
rootless 依赖用户级 systemd 与内核特性(如用户命名空间),发行版差异较大,升级内核或 systemd 后要回归验证。
rootless 降低了容器逃逸到宿主 root 的收益,但并不说明容器天然安全:镜像内容与挂载权限仍按原有规则评估。