Docker Rootless 模式:降低守护进程高权限风险的部署要点
Rootless 与普通 Docker 的区别
传统 Docker daemon 以 root 身份运行,即使容器内进程降权,管理接口一旦被滥用仍可能影响整个宿主机。Rootless 模式把 daemon 和容器都放在非 root 用户的 user namespace 中,从架构上减少宿主机高权限暴露。
它与 userns-remap 不完全相同:userns-remap 主要映射容器用户,而 Rootless 连 daemon 本身也不以 root 运行。
前置条件
- 系统需要 newuidmap 和 newgidmap。
- /etc/subuid 与 /etc/subgid 要给运行用户分配至少 65536 个从属 UID/GID。
- 建议使用 systemd 用户服务管理 daemon。
- 网络、存储驱动和低端口绑定需要检查兼容性。
官方安装工具会创建用户级 systemd 服务和独立 Docker context。安装后应确认客户端连接的是 rootless socket,而不是仍然指向系统级 /var/run/docker.sock。
适合场景
- 多用户开发机和 CI Runner。
- 运行不可信构建任务的主机。
- 不需要复杂宿主机网络和特权设备的 Web 应用。
不能解决的问题
Rootless 不是完整沙箱。内核漏洞、错误挂载、应用层漏洞和泄露的业务凭证仍然可能造成损害。容器还需要只读文件系统、能力裁剪、seccomp、资源限制和镜像供应链检查。
迁移建议
- 在独立测试用户下安装 Rootless daemon。
- 迁移无状态服务,验证端口、卷权限和容器网络。
- 不要同时暴露 rootful 与 rootless Docker socket。
- 为用户服务启用 linger,保证退出登录后容器继续运行。
- 备份 Compose 配置和数据卷,再逐个迁移状态服务。
原始资料:Docker Rootless 官方文档
本文采用 aggregate 索引策略。