rootless模式通过用户命名空间实现uid/gid隔离映射,使容器内root对应宿主机非特权子uid,配合dockerd-rootless.sh以普通用户运行守护进程、fuse-overlayfs与slirp4netns等用户态组件,彻底消除root依赖,显著提升安全性。

Rootless 模式通过让 Docker 守护进程和容器均以普通用户身份运行,从根源上切断容器对宿主机 root 权限的依赖,显著提升安全性。它不是简单去掉 sudo,而是依托 Linux 用户命名空间(user namespaces)实现 UID/GID 的隔离映射,使容器内 root(uid 0)实际对应宿主机上一个无特权的子 UID(如 100000),即便容器被攻破,攻击者也无法获得系统级控制权。
关键安全机制配置
Rootless 的安全基础依赖三项底层机制协同工作:
-
用户命名空间映射:通过
/etc/subuid和/etc/subgid为用户分配独立的 UID/GID 范围(如myuser:100000:65536),确保容器内 root 不等于宿主机 root -
非特权守护进程:
dockerd-rootless.sh启动的 daemon 进程完全由普通用户拥有,不涉及 setuid 或 cap_sys_admin 等高危能力 -
隔离运行时组件:使用
fuse-overlayfs替代内核 overlay 驱动,用slirp4netns实现用户态网络栈,避免直接操作内核网络或文件系统模块
基础环境准备要点
配置前需确认并调整以下系统级前提:
- 内核支持用户命名空间(
CONFIG_USER_NS=y),CentOS 7 需手动启用:echo "user.max_user_namespaces=28633" > /etc/sysctl.d/userns.conf && sysctl -p - 安装必要工具包:
uidmap(UID 映射管理)、dbus-user-session(用户级 D-Bus 通信)、fuse-overlayfs(用户态存储驱动) - Docker 版本 ≥ 20.10(正式支持,非实验性),建议使用 23.0+ 或 25.0+ 获取更稳定的资源限制与 seccomp 支持
标准部署流程
以新建专用用户 devuser 为例,执行以下步骤:
- 创建用户并配置映射:
sudo useradd -m -s /bin/bash devuser,然后向/etc/subuid和/etc/subgid添加对应条目 - 切换至该用户,运行官方 rootless 安装脚本:
curl -fsSL https://get.docker.com/rootless | sh - 设置环境变量(写入
~/.bashrc):export XDG_RUNTIME_DIR=$HOME/.docker/run、export PATH=$HOME/bin:$PATH、export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock - 启动服务:
systemctl --user start docker(systemd 环境)或直接运行dockerd-rootless.sh(如 CentOS 7)
安全增强补充项
Rootless 已自带权限降级,但可进一步收紧:
- 禁用默认挂载点:在
~/.config/systemd/user/docker.service.d/override.conf中添加Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_FLAGS=--disable-host-ports",防止端口冲突 - 启用默认 seccomp profile:无需额外配置,Rootless 模式下
runc默认加载default.json,限制 400+ 系统调用 - 避免使用
--privileged或--cap-add=ALL,这些在 Rootless 下会被拒绝或静默降级,保持最小权限原则











