无根容器该不该用:先看它解决的问题是不是你的问题
rootless 容器的 UID 被映射到宿主高位区间,容器内 root 在宿主只是普通用户
它擅长的是开发机与个人服务器;如果你只是不想把用户加进 docker 组,用现成的东西更省事。
先说结论
rootless 换来的是「容器逃逸不等于整机失守」,代价是端口、网络和调试成本
- 适合:开发机与个人服务器
- 不适合:CI 里的隔离构建
- 学习成本:普通用户无法绑定 1024 以下端口,要么改内核参数,要么用反代转发
- 最大收益:用户服务默认随登录会话退出,loginctl enable-linger 才能开机自启
- 最大风险:rootless 下映射 80 端口失败,以为是防火墙没开
它到底解决什么
rootless 容器的 UID 被映射到宿主高位区间,容器内 root 在宿主只是普通用户。
换句话说,它把「开发机与个人服务器」这件事从手工变成可重复的流程。这是它真正的价值,而不是功能列表的长度。
什么时候不该用
下面三种情况,用了反而更累:
rootless 下映射 80 端口失败,以为是防火墙没开
没开 linger,SSH 一退出容器全停
/etc/subuid 只配了一半的 UID,解压大镜像直接失败
和替代方案比
subuid 分配不足 65536 时,解压稍大的镜像就会报权限错误。
| 方案 | 上手成本 | 适用规模 | 代价 |
|---|---|---|---|
| 无根容器 | 中等 | 中大型 | 需要维护 |
| Docker 加 docker 组 | 低 | 小型 | 定制能力弱 |
| Kubernetes 单节点 | 低 | 一次性任务 | 不可维护 |

这台工具的关键细节
几个决定长期体验的点:
- 普通用户无法绑定 1024 以下端口,要么改内核参数,要么用反代转发
- 用户服务默认随登录会话退出,loginctl enable-linger 才能开机自启
- subuid 分配不足 65536 时,解压稍大的镜像就会报权限错误
- slirp4netns 的转发吞吐通常只有宿主直接网络的 30-50%
我的建议
rootless 换来的是「容器逃逸不等于整机失守」,代价是端口、网络和调试成本。
先用两周,跑一个真实的小任务;两周后你还想用它,再谈长期。
还有几处容易忽略的
都是小地方,但出问题时往往就卡在这里。
- podman 不需要 daemon,docker.sock 那类「挂上就等于 root」的风险不存在
工具是解法,不是身份。
评论 (3)
排查顺序那段直接抄进值班手册了。
版本差异要强调,我照着做结果参数名全变了。
备份没验证过等于没有,这条我认。
发表评论