docker多用户权限隔离核心是user namespace映射、运行时用户控制与资源网络分治协同:通过/etc/docker/daemon.json配置"userns-remap": "default"或指定用户,结合子uid/gid分配、专属网络及能力限制,实现容器间uid隔离、资源约束与网络隔绝。
在 docker engine 安装后实现多用户权限隔离,核心不是“安装时配置”,而是安装完成后通过 user namespace(userns)映射 + 运行时用户控制 + 资源与网络分治 三者协同达成。docker 本身不提供传统操作系统的多用户登录管理,但可通过机制设计让不同用户或应用彼此不可见、不可干扰、无法越权访问宿主机资源。
启用 UserNS 全局映射(最基础的安全隔离)
这是解决多用户场景下容器间 UID/GID 冲突与 root 权限越界的根本手段:
- 编辑 /etc/docker/daemon.json,添加:
{"userns-remap": "default"} - 保存后执行
sudo systemctl restart docker - Docker 自动创建系统用户
dockremap,并在 /etc/subuid 和 /etc/subgid 中分配一段起始 UID/GID(如dockremap:100000:65536) - 此后所有容器内 UID 0(root)均映射为宿主机上 100000+ 范围的非特权 ID,不同容器即使都用 root,宿主机上实际属主也互不重叠
按用户/项目划分独立运行上下文
避免多个用户共用同一套容器环境,需从启动方式和目录结构上物理分离:
- 为每个用户或业务创建专属系统用户(如
user-a、user-b),并为其预分配子 ID 段:echo 'user-a:200000:65536' | sudo tee -a /etc/subuid /etc/subgid - 在 daemon.json 中指定映射用户:
"userns-remap": "user-a"(可为不同用户配置不同 daemon 实例或使用 dockerd --userns-remap 单独启动) - 绑定挂载路径严格归属对应用户,例如:
chown -R 200000:200000 /home/user-a/app-data,再通过-v /home/user-a/app-data:/app/data挂入
限制容器能力与资源边界(防横向影响)
即便启用 UserNS,仍需约束容器行为,防止耗尽资源或突破命名空间限制:
- 禁用特权模式:
--privileged与 UserNS 互斥,启用后自动拒绝,这是强制安全兜底 - 精确授予 Capabilities:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE --cap-add=CHOWN等按需添加 - 限制资源:
--memory=512m --cpus=0.5 --pids-limit=50防止单个容器拖垮整机 - 文件系统只读化:
--read-only --tmpfs /run --tmpfs /var/log,减少攻击面
网络与进程层面隔离(避免通信与发现)
多用户环境必须切断默认互通渠道:
- 停用默认桥接网络的容器互通:
启动 daemon 时加--icc=false(Docker 20.10+ 默认已关闭) - 为每个用户创建独立自定义网络:
docker network create --driver bridge user-a-net,启动容器时显式指定:--network user-a-net - 禁止跨网络 DNS 解析(默认不支持,无需额外操作),如需通信,通过宿主机端口映射或反向代理中转,不直连
- PID 命名空间默认启用,容器间
ps不可见;如需更强隔离,可配合--pid=host以外的默认设置(即保持独立 PID namespace)











