rootless docker 需普通用户操作,要求内核≥4.18、docker≥20.10、启用user_namespaces,并正确配置/etc/subuid与/subgid;安装须用官方脚本并配置path;端口映射仅支持≥1024,禁用--network host。

必须用普通用户身份全程操作,root 用户执行任何一步都会导致 Rootless 失败。
确认系统和 Docker 版本是否满足前提
Rootless 模式不是“开箱即用”,它依赖内核能力与 Docker 版本协同。低于 Docker 20.10 的版本即使能跑脚本,也会在启动时崩溃或功能残缺。
- 检查内核:运行
uname -r,确保 ≥4.18(CentOS 7 需手动升级或换发行版) - 检查 Docker:运行
docker --version,确认是20.10+;若已装旧版,先卸载系统包再走 rootless 安装流程 - 验证
user_namespaces是否启用:sysctl kernel.unprivileged_userns_clone返回1才算开启;若为0,需 root 执行sysctl -w kernel.unprivileged_userns_clone=1并写入/etc/sysctl.conf
配置 /etc/subuid 和 /etc/subgid 映射
这是 Rootless 能跑起来的底层权限基石。没配或配错,dockerd-rootless.sh 启动时会直接报 subuid range is empty 错误。
- 以目标用户(比如
devuser)为例,执行以下两行(注意:必须由 root 执行,且不能漏掉第二行):echo "devuser:100000:65536" >> /etc/subuidecho "devuser:100000:65536" >> /etc/subgid - 不要用
useradd -U或其他工具自动生成 subid —— 多数发行版默认不生成,且格式可能不兼容 rootlesskit - 映射范围必须 ≥
65536,否则容器一多就会因 UID 耗尽而失败(例如docker run卡住、cannot allocate memory)
用官方脚本安装并正确加载环境变量
别手动下载二进制或改 systemd unit——官方脚本会自动适配当前用户家目录、生成 socket 路径、设置 rootlesskit 参数,手动操作极易出错。
- 切换到目标用户后,运行:
curl -fsSL https://get.docker.com/rootless | sh - 脚本末尾会输出类似
export PATH=$HOME/bin:$PATH的提示,**必须把它加进$HOME/.bashrc或$HOME/.zshrc,然后重新登录或执行source ~/.bashrc**;否则docker命令根本找不到 - 启动服务:
systemctl --user start docker;首次启动可能卡几秒,成功后systemctl --user status docker应显示active (running) - 验证:
docker info | grep "Rootless"输出Rootless: true,且docker run hello-world不报权限错误
绕不开的端口和网络限制
Rootless 模式下,-p 80:80 或 --network host 这类操作注定失败,这不是配置问题,而是 Linux 内核对非特权用户的硬性约束。
- 端口映射只能用 ≥1024 的端口,比如
-p 8080:80;若必须暴露 80 端口,得靠反向代理(如 nginx 监听 80,转发到本地 8080) -
--network host不可用,但--network bridge(默认)完全正常;自定义网桥、DNS 配置也都支持 - 若遇到容器内无法解析域名,检查
/etc/resolv.conf是否被 slirp4netns 覆盖;可临时加--dns 8.8.8.8测试
最容易被忽略的是:每次切换用户 shell 后,systemctl --user 依赖的 D-Bus session 可能未激活,导致 start docker 报 Failed to connect to bus。此时应运行 loginctl enable-linger $USER(需 root 执行一次),之后用户即使无图形会话也能持久运行 user services。











