Docker容器内核资源隔离需协同cgroups v2、命名空间强化与运行时策略:启用systemd.unified_cgroup_hierarchy=1,使用--memory=512M、--pids-limit=100等硬限参数;禁用/proc与/sys共享传播,显式限制设备访问;结合seccomp白名单与landlock路径控制;强制非root运行并配置userns-remap映射。

在 Docker 中配置容器内核资源隔离参数,是构建安全沙箱的关键一环。它不单靠限制 CPU 或内存数值,而是通过 cgroups v2、命名空间强化与运行时策略协同,从内核层切断越权路径。核心在于让容器既“跑得稳”,又“越不了界”。
启用 cgroups v2 并配置硬性资源上限
cgroups v2 是 Docker 27 安全沙箱的底层基石,相比 v1 更简洁、更强制。必须确保宿主机已启用统一层级:
- 启动内核参数中加入 systemd.unified_cgroup_hierarchy=1,并重启生效
- 验证是否启用:
mount | grep cgroup应显示cgroup2 on /sys/fs/cgroup type cgroup2 - 运行容器时使用硬限参数,避免 soft limit 被绕过:
docker run --memory=512M --memory-swap=512M --cpus=1.5 --pids-limit=100 nginx:alpine
其中--pids-limit是 v2 特有参数,可防 fork 炸弹类逃逸
绑定命名空间与禁止跨命名空间挂载
资源隔离失效常源于命名空间被穿透。需阻断常见逃逸入口:
- 禁用
/proc和/sys的共享传播:
启动时加--tmpfs /proc:ro,nosuid,nodev,noexec和--tmpfs /sys:ro,nosuid,nodev,noexec - 显式关闭设备命名空间继承:
--device-cgroup-rule='b *:* rmw'(禁止任何块设备访问),再按需白名单添加,如 NVIDIA 设备需额外配landlock策略 - 验证 PID 隔离是否有效:容器内执行
ls /proc/1/ns/,输出应不含pid_for_children,且readlink /proc/1/ns/pid的 inode 与宿主机不同
配合 seccomp + landlock 实现系统调用与文件路径双锁
Docker 27 默认启用 eBPF 增强版 seccomp,但需手动加载策略才能发挥最大效力:
- 生成最小权限策略:
使用官方docker-seccomp-tool扫描应用行为,导出 JSON 白名单策略 - 启用 Landlock 路径白名单(仅 Linux 5.13+):
在 seccomp JSON 中嵌入"landlock_rules": [{"path":"/etc", "access":["read"]}, {"path":"/tmp", "access":["read","write"]}] - 运行时加载:
docker run --security-opt seccomp=/path/to/locked-down.json --read-only ...
强制非 root 运行与用户命名空间映射
这是阻断提权链最经济有效的手段:
- 镜像内默认指定非特权用户:
Dockerfile 中添加USER 1001:1001,并确保该 UID 在宿主机无对应账号 - 启用 user namespace remap:
编辑/etc/docker/daemon.json,加入:"userns-remap": "default",然后重启 dockerd - 验证效果:容器内
cat /proc/1/status | grep Uid应显示三组 UID 均为非 0,且与宿主机 UID 不重叠


















