rootless docker在多用户服务器上实现完全隔离的关键是每人运行独立守护进程:每个用户拥有专属dockerd、socket、镜像存储及网络命名空间,依托user namespace与uid/gid映射实现内核级隔离,无需docker组权限。
在多用户共享服务器上用 docker rootless 模式实现完全隔离的守护进程,关键不是“共用一个 daemon”,而是“每人一个独立 daemon”。rootless 的设计本质就是让每个普通用户拥有专属、互不干扰的 docker 运行环境——包括独立的守护进程、socket、镜像存储、网络命名空间和容器生命周期。
每个用户运行自己的 dockerd-rootless.sh
Rootless 模式下,没有全局 daemon。系统级的 dockerd 不启动;取而代之的是每个用户在自己家目录下启动专属守护进程:
- 用户执行
dockerd-rootless.sh --experimental(需提前配置$HOME/.docker/config.json启用实验特性) - 守护进程默认监听
$XDG_RUNTIME_DIR/docker.sock(如/run/user/1001/docker.sock),路径由 UID 决定,天然隔离 - 所有数据(镜像、容器、卷、网络)默认存于
$HOME/.local/share/docker,不与其他用户交叉 - 用户退出登录或手动执行
dockerd-rootless.sh stop,其 daemon 立即终止,不影响他人
用户命名空间 + UID/GID 映射保障内核级隔离
仅靠文件路径隔离还不够,Rootless 的核心安全来自 Linux 用户命名空间:
- 守护进程自身以普通 UID(如 1001)运行,无法访问其他用户的进程、文件或 socket
- 容器内
root(UID 0)被映射到宿主机一段**非重叠的 UID 范围**(如 100000–165535),该范围对其他用户不可见、不可写 - 配置示例(
$HOME/.config/docker/daemon.json):{"userns-remap": "default", "experimental": true} - 这意味着:A 用户容器里改了
/etc/passwd,只影响 A 自己的映射视图,B 用户完全感知不到
网络与端口层面彻底分治
多用户场景下最易冲突的是网络资源,Rootless 天然规避了常见风险:
- 默认使用
slirp4netns提供用户态网络栈,每个用户有独立的虚拟网关、DNS 和端口空间 - 端口映射仅支持 ≥1024 的非特权端口,且绑定地址自动限定为
127.0.0.1(如-p 127.0.0.1:8080:80),不会抢占他人端口 - 自定义网桥(
docker network create mynet)作用域仅限本用户 daemon,B 用户看不见也连不上 A 的网桥 - 如需跨用户通信,必须显式通过宿主机中转(如反向代理),而非容器直连 —— 这反而是安全优势
权限与资源硬隔离,无需 docker 组
传统 Docker 要求用户加入 docker 组,等于授予 root 权限;Rootless 彻底绕过该机制:
- 用户无需任何系统组权限,只要能登录、有 home 目录、内核支持 user_ns(≥3.8)即可启用
- cgroups v2 必须启用(Ubuntu 22.04+/CentOS 8+ 默认开启),用于限制该用户所有容器的 CPU、内存、PID 总量
- 可配合
systemd --user管理守护进程生命周期,实现开机自启、日志聚合、资源配额(如MemoryMax=2G) - 管理员可通过
loginctl show-user $USER或systemctl --user status docker分别审计各用户资源占用,互不越界











