最简方式是直接加--read-only,但必须配套挂载/tmp、/run等关键路径为tmpfs以提供可写空间,否则应用易失败;该配置可阻断向系统目录写入恶意文件,需与能力限制、非root用户运行等协同构成纵深防御。

直接加 --read-only 是最简方式,但必须配套处理可写路径,否则多数应用会启动失败或运行异常。只读根文件系统能有效阻断攻击者向 /etc、/bin、/usr 等系统目录写入恶意二进制、配置或后门文件,是防御容器逃逸的基础防线。
启用只读根文件系统
启动容器时明确指定 --read-only 参数:
docker run --read-only nginx:alpine- 该参数会让整个容器根目录(
/)以ro(read-only)方式挂载,包括/tmp、/var/run、/etc/hostname等子路径 - 验证是否生效:进入容器执行
mount | grep "on / type",输出中应含ro,字样;或尝试touch /test,提示Read-only file system即成功
为必需路径提供可写空间
仅设只读会导致 nginx 写 pid、应用写日志、临时解压失败等。必须显式挂载以下关键路径:
-
/tmp:通用临时目录,用
--tmpfs /tmp:rw,size=10M -
/run 和 /var/run:存放 socket、PID 文件、锁,nginx、supervisord 等依赖,建议各配
--tmpfs /run:rw,size=5M -
/var/log:若应用坚持写日志到本地(非 stdout),可用
--tmpfs /var/log:rw,但更推荐改用标准输出 - 注意:tmpfs 不落盘、重启即清空,天然符合“临时性”语义,也规避了持久卷引入的权限扩大风险
按需挂载可写数据卷(严格限制范围)
仅在真正需要持久化或共享时才挂载,且必须显式声明路径和权限:
- 上传目录:
-v upload-data:/app/uploads:rw(命名卷,推荐) - 配置缓存(如 Redis AOF):
-v redis-cache:/data:rw - 证书或静态资源(只读):
-v cert-volume:/etc/tls:ro—— 用:ro明确禁止写入 - 避免 bind mount 宿主机敏感路径(如
/etc、/root),尤其禁用:z或:ZSELinux 标签,除非明确知晓其提权后果
配合其他最小权限机制形成纵深防御
只读根文件系统需与以下措施协同,才能显著压缩逃逸面:
- 丢弃非必要 capabilities:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE(仅保留业务必需) - 以非 root 用户运行:
--user 1001:1001,并在 Dockerfile 中用USER指令固化 - Kubernetes 场景下,在
securityContext中统一设置:readOnlyRootFilesystem: true、runAsNonRoot: true、capabilities.drop - 镜像构建阶段就删除包管理器缓存、调试工具(如
apt clean && rm -rf /var/lib/apt/lists/*),从源头减少可利用文件











