最基础且关键的是--read-only,但需配合tmpfs挂载(如/tmp、/run)和精确volume挂载才能真正降低逃逸风险;同时应丢弃非必要capabilities、禁用提权、指定非root用户运行。

直接加 --read-only 是最基础也最关键的一步,但只做这一步往往会让容器根本起不来——因为大多数应用需要往 /tmp、/run、/var/run 写临时文件或 PID。真正降低逃逸风险,靠的是“只读根 + 精确放行可写路径”的组合策略。
用 --read-only 启动容器,强制根文件系统只读
这是防御的第一道墙。启用后,整个 / 下所有路径(包括 /etc、/bin、/usr)都不可写,攻击者无法替换二进制、注入动态库、篡改配置文件或向系统目录写入恶意脚本。
- 命令示例:
docker run --read-only nginx:alpine - 验证方式:进入容器执行
mount | grep 'on / type',看到ro标志即生效 - 注意:此时
touch /test或apt update会直接报 Read-only file system
为必需路径挂载 tmpfs,提供内存级可写空间
只读 ≠ 完全不能写,而是要把写操作严格限制在无持久化、易清理、受控的区域。tmpfs 是最佳选择:数据仅驻留内存,容器退出即清空,不落盘、无残留,天然防持久化后门。
- 必须挂载的路径:
/tmp(通用临时目录)、/run和/var/run(存放 socket、PID、锁文件) - 带大小限制更安全:
--tmpfs /tmp:rw,size=10M --tmpfs /run:rw,size=5M - 避免默认无上限:不设
size=时,tmpfs 可能吃光宿主机内存
按需挂载可写 volume,且明确控制读写权限
如果应用确实需要持久化写入(如上传目录、缓存、数据库数据),必须显式用 -v 或 --mount 挂载,并禁止对其他路径开放写权限。
- 命名卷推荐用于应用数据:
-v app-uploads:/app/uploads:rw - 挂载证书或配置等敏感内容时务必只读:
-v cert-volume:/etc/tls:ro - 绑定宿主机目录要格外谨慎,加
:z或:Z处理 SELinux 上下文(如适用) - 切记:未显式挂载的任何路径,哪怕只是
/app/logs,仍继承全局只读属性
配合其他最小权限措施,形成纵深防御
只读根文件系统是重要一环,但单独使用效果有限。建议同步收紧其他攻击面:
- 丢弃非必要 capabilities:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE - 禁止容器内提权:
--security-opt no-new-privileges - 指定非 root 用户运行:
--user 1001:1001,并确保镜像中该用户有对应权限 - Kubernetes 环境下,在
securityContext中统一声明readOnlyRootFilesystem: true


















