启用user namespace需全局配置docker守护进程:创建dockremap用户,配置/etc/subuid和/etc/subgid映射(如dockremap:100000:65536),在daemon.json中设置"userns-remap": "dockremap",重启docker后所有新容器自动启用uid/gid映射隔离。

要创建带用户命名空间(User Namespace)的 Docker 容器,核心不是在 docker run 时临时加一个参数,而是先启用 Docker 守护进程的 user namespace remap 功能,之后所有容器(默认)都会运行在映射后的用户命名空间中。这是 Docker 官方推荐的安全实践,不能靠单次命令“开启”,必须全局配置。
✅ 前提:配置 Docker 启用 user namespace remap
-
创建专用系统用户(推荐)
sudo useradd -r -s /bin/false dockremap
-
配置子 UID/GID 映射范围
编辑/etc/subuid,添加一行(确保范围不与其他用户重叠):dockremap:100000:65536
同样编辑
/etc/subgid:dockremap:100000:65536
这表示:容器内 UID 0(root)→ 映射到宿主机 UID 100000;容器内 UID 1 → 映射到宿主机 UID 100001;以此类推,共 65536 个可用 ID。
-
修改 Docker daemon 配置
编辑/etc/docker/daemon.json(若不存在则新建),加入:{ "userns-remap": "dockremap" }⚠️ 注意:启用后,Docker 会自动将
/var/lib/docker下原有镜像、容器等数据迁移或重置(首次启用会清空现有容器和镜像层,务必提前备份)。 -
重启 Docker 服务
sudo systemctl restart docker
查看是否生效:
docker info | grep "Userns" # 应输出:Userns-Remap: dockremap:100000:65536
✅ 创建容器(自动使用用户命名空间)
配置生效后,所有新创建的容器默认就在用户命名空间中运行,无需额外参数:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
docker run -it --rm ubuntu:22.04 id
输出类似:
uid=0(root) gid=0(root) groups=0(root)
但这只是容器内的视图。在宿主机上查该进程:
ps aux | grep ubuntu # 看到其实际 UID 是 100000(或范围内某个值),不是 0
你也可以显式确认命名空间:
docker inspect <container-id> | grep -i userns # 输出:"UsernsMode": "host" 表示未启用;若为空或没这行,说明已启用 remap</container-id>
❗重要说明
- 不支持混合模式:一旦启用
userns-remap,无法对单个容器关闭用户命名空间(--userns=host会被忽略)。 - 某些操作受限:如挂载
devicemapper、部分--privileged行为、绑定挂载hostPath到需 root 权限的路径(如/proc/sys)可能失败。 - 文件权限注意:若挂载宿主机目录(
-v /host/path:/cont/path),容器内进程以映射 UID 写入文件,宿主机上显示为 UID 100000+,需提前调整宿主目录属主或使用:z/:Z标签(SELinux 场景)。
✅ 可选:验证用户映射是否生效
进入容器并检查:
docker run -it --rm ubuntu:22.04 sh -c 'cat /proc/self/uid_map'
正常输出三列(容器内 UID、宿主机映射 UID、长度),例如:
0 100000 65536
这表明容器内 UID 0 映射到宿主机 UID 100000,正是 user namespace remap 的关键证据。
不复杂但容易忽略。










