无根容器该不该用:先看它解决的问题是不是你的问题

Docker · 3 分钟阅读· 311 次阅读

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)

阿
阿哲

排查顺序那段直接抄进值班手册了。

K
Kevin

版本差异要强调,我照着做结果参数名全变了。

老
老吴

备份没验证过等于没有,这条我认。

发表评论

验证码

提交后需站长审核,通过后才会显示。