容器 20:rootless 和容器内非 root 有什么不同
在05,内侧 root 被映射为外侧 UID 1001,说明“程序显示 UID 0”不足以推出宿主特权。另一种常被混写的配置是 Dockerfile USER 65532:它指定应用在容器内的身份,并没有规定 daemon 本身用哪个宿主 UID 工作。rootless 模式则涉及 daemon 和容器进程的宿主权限前提,资源与网络能力也随委派和实现改变。
三个身份分别记账
先记录 daemon 宿主身份、容器外侧 UID 映射与应用内侧 UID,再问低端口绑定、设备访问、overlay/snapshotter、cgroup v2 控制器和网络转发在所选 rootless 实现中如何实现。不应把“daemon 非 root”和“应用 USER 非 root”合并成一项。rootless 不会凭空委派宿主 cgroup 子树,也不是应用任意设备访问的许可证。不同运行时和 Linux 版本对辅助工具、存储与网络的要求不同;适用范围必须限定到实测版本。
正常实验在专用 VM 用同一探针分别以 rootful daemon + USER 65532 与 rootless daemon + 相同应用 UID 启动,对照 daemon PID/UID、应用内外 UID/map、端口和 cgroup 可写项。边界例在没有资源委派时设置 CPU limit:配置请求也许被拒绝或不起作用,必须读 cgroup 实际内容及官方限制再解释,不能拿两次 id 输出当限额已经生效。入口给出清单,自含源码与 13 共用 Dockerfile。
本机 userns 可用,但无 rootless daemon、cgroup v2 委派和 runtime。05 的映射记录只证明 userns 的一部分;20 的 daemon/容器对照及端口、资源限制均 NOT_RUN。
| 现象 | 身份/对象 | 前提 |
|---|---|---|
| 应用 UID 65532 | Dockerfile USER 与运行时用户 | daemon 未必 rootless |
| daemon 宿主非 root | daemon PID、uid_map | 不推出 CPU 委派可用 |
| 端口绑定失败 | 端口、转发实现、权限 | 不只看应用 id |
练习
- 先预测把
USER 65532放入同一个 Dockerfile 后,宿主 daemon 身份会不会变化;在 VM 逐项读 daemon 与应用 UID/map。 - 预测 rootless 模式下设置
cpu.max一定生效吗;先确认父组控制器和委派,再对照所选实现的错误、运行时配置与实际计数。
上一篇:19:run 到 exec;下一篇:21:停止与日志。
系列总目录:从进程隔离到运行时与编排。





