Docker Rootless模式通过Linux用户命名空间实现天然用户级隔离,不同用户运行的rootless dockerd实例互不可见、socket物理隔离、默认无法跨用户互通。
直接用 docker rootless 模式本身就能显著提升单机多用户环境下的容器隔离性,关键不在“额外优化”,而在于正确启用和规避常见配置盲区。它的核心隔离能力来自 linux 用户命名空间,天然让每个普通用户运行的 dockerd 实例彼此独立,互不可见、互不干扰。
确保每个用户独占 rootless dockerd 实例
Rootless 模式默认按用户隔离——不同系统用户启动的 rootless dockerd 互不感知。这意味着:
- 用户 A 运行
docker ps看不到用户 B 的任何容器 - 用户 A 的
/var/run/user/1000/docker.sock与用户 B 的/var/run/user/1001/docker.sock完全物理隔离 - 无需额外配置网络或存储驱动,用户间容器默认无法通过 Docker API 或本地 socket 互通
禁用跨用户共享的危险挂载方式
很多团队误以为“挂载宿主机 docker.sock”能简化多用户协作,但这是隔离性的最大破坏点:
-
绝对不要在 rootless 环境中使用
-v /var/run/docker.sock:/var/run/docker.sock - 这种做法会绕过用户命名空间隔离,使容器内操作直通宿主机 dockerd(即使以普通用户身份),导致任意用户可管理全系统容器
- 若需构建镜像或运行测试,应统一使用
docker buildx或buildkit的用户级 builder 实例,而非共享守护进程
配合自定义网络与用户命名空间强化边界
Rootless 默认使用 slirp4netns 做用户态网络,已具备基础隔离,但可进一步收紧:
- 为每个用户创建专属桥接网络:
docker network create --driver bridge --scope local myuser-net(--scope local确保仅当前用户可见) - 避免使用
--network host或--network container:跨用户引用,这类参数在 rootless 下多数被拒绝,是安全的默认行为 - 检查
/etc/subuid和/etc/subgid中每个用户的映射范围是否不重叠(例如 A:100000-165535,B:200000-265535),防止 UID/GID 映射冲突削弱隔离
关闭全局资源暴露,坚持最小权限原则
rootless 容器默认无法访问宿主机敏感路径,但需主动确认未显式开放:
- 禁止使用
--privileged、--cap-add=ALL或--device挂载/dev下设备节点 - 不挂载
/proc、/sys、/boot等宿主机系统目录;如确需部分信息,用只读 + 子路径方式(如-v /proc/cpuinfo:/cpuinfo:ro) - 所有容器端口映射必须避开特权端口(1–1023),强制使用高位端口(如 8080、9000),避免用户间端口抢占或伪装冲突


















