docker用户命名空间隔离需三步:一配daemon.json启用userns-remap,二设subuid/subgid映射范围,三将挂载目录属主改为映射uid;--privileged被禁用,build不生效,仅run时隔离。

要在 Docker 中配置用户命名空间(User Namespace)隔离权限,核心是启用 UID/GID 映射,让容器内 root 不再等同于宿主机 root。这不是简单加个参数就能跑通的事,得配 daemon、调子 ID、对齐挂载权限,三步缺一不可。
修改 daemon.json 启用全局映射
Docker 默认关闭 UserNS,必须通过守护进程配置开启:
- 编辑 /etc/docker/daemon.json,加入:
{"userns-remap": "default"} - 保存后重启服务:
sudo systemctl restart docker - Docker 会自动创建系统用户 dockremap,并在 /etc/subuid 和 /etc/subgid 中分配一段范围(如
dockremap:100000:65536),表示容器内 UID 0~65535 映射到宿主机 100000~165535
手动指定 remap 用户与子 ID 范围(推荐生产环境)
用 "default" 适合测试,但生产建议显式管理:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 先创建专用系统用户,比如
sudo useradd -r userns-user - 在 /etc/subuid 和 /etc/subgid 中写入固定段:
userns-user:200000:65536 - 再把 daemon.json 改为:
{"userns-remap": "userns-user"} - 这样所有映射都落在预设范围内,便于审计和权限收敛
绑定挂载目录必须同步属主
启用 UserNS 后,容器内进程在宿主机上以映射后的 UID 运行(如 100000),若挂载目录属主仍是原用户,就会权限拒绝:
- 查当前 remap 起始 UID:
awk -F: '/dockremap/{print $2}' /etc/subuid(或你指定的用户) - 将宿主机挂载目录属主设为该 UID:
sudo chown -R 100000:100000 /path/on/host - 如果容器内应用需写日志或配置,这一步不做,
docker run -v就会报 permission denied
注意不兼容项与运行时限制
UserNS 是强隔离机制,天然排斥某些高危能力:
-
--privileged模式被完全禁止,启用后启动容器会直接失败 - 部分 capabilities(如
CAP_SYS_ADMIN)在映射后失效或受限 - 容器构建(
docker build)不走 UserNS,只有docker run时生效 - 网络、PID、IPC 等命名空间不受影响,可单独开关,不影响 UserNS 工作










