Docker 启用 UserNS 隔离需配置 daemon.json 的 "userns-remap": "default" 并重启服务,使容器内 UID/GID 映射到宿主机非特权范围(如 100000+),提升安全性;映射后容器 root 对应宿主机非 root,绑定挂载需同步调整宿主机目录属主,且不兼容 --privileged 模式。

在 Docker 中启用 UserNS(User Namespace)隔离,能将容器内 UID/GID 映射到宿主机上非特权范围,避免容器内 root 用户直接对应宿主机 root,显著提升安全性。核心是启用 user namespace remapping,并合理配置映射规则。
启用 Docker 的 UserNS 全局支持
Docker 默认不开启 UserNS,需通过 daemon 配置全局启用。编辑 /etc/docker/daemon.json,添加 userns-remap 字段:
{ "userns-remap": "default" }
保存后重启 Docker 服务:sudo systemctl restart docker。Docker 会自动创建用户 dockremap 并在 /etc/subuid 和 /etc/subgid 中分配一段子 ID 范围(如 dockremap:100000:65536),用于容器内 UID/GID 到宿主机的偏移映射。
理解 UID/GID 映射机制
UserNS 不是“禁止 root”,而是重映射:容器中 UID 0(root)被映射为宿主机上某个非特权起始 UID(如 100000)。容器内进程实际以该范围内的 UID 运行,无法直接操作宿主机真实 root 资源。
- 容器内
id -u显示 0,但宿主机上ps aux | grep查看进程,其 UID 是 100000+; - 容器挂载的卷若未显式设置权限,宿主机上对应文件属主会变成映射后的 UID(如 100000),需提前用
chown 100000:100000 /host/path配合; - 镜像中硬编码 UID(如
USER 1001)仍有效,但该 UID 也会被整体偏移(1001 → 101001),不影响应用逻辑。
按需指定 remap 用户或自定义子 ID 范围
不使用 "default",可指定已有系统用户(需已存在于 /etc/subuid 和 /etc/subgid):
"userns-remap": "myuser"
也可手动预分配子 ID 段(推荐用于生产环境统一管理):
echo 'myuser:200000:65536' | sudo tee -a /etc/subuid /etc/subgid
再在 daemon.json 中写 "userns-remap": "myuser"。这样可避开默认的 dockremap,便于审计与权限收敛。
注意事项与常见适配点
- 绑定挂载(-v)权限需对齐:宿主机目录属主应设为 remap 后的 UID/GID,否则容器内可能无写入权限;
-
不兼容 --privileged 和部分 Capabilities:UserNS 与特权模式互斥,启用后
--privileged会被拒绝; - 网络命名空间不受影响:UserNS 只隔离用户/组 ID,网络、PID、IPC 等仍可单独配置;
- 构建镜像时 USER 指令照常生效,但构建过程本身(docker build)不运行在 UserNS 下,仅运行时(docker run)启用。

















