加--read-only可使容器根文件系统只读,需配合--tmpfs为/tmp、/run等路径提供内存可写空间,并通过mount检查ro标识和touch测试验证生效,再叠加--user、--cap-drop等机制才构成完整防护。
直接加 --read-only 就能让容器根文件系统变成只读,这是最简单也最有效的第一道防线。它从底层移除可写层,任何对 / 及其子目录(如 /etc、/bin、/usr)的写入都会立即失败,从根本上阻断恶意文件落盘或配置篡改。
只读启动必须配套可写路径
光加 --read-only 容器大概率起不来——nginx 要写 pid、应用要建 socket、日志系统要刷缓冲。必须用 --tmpfs 为运行时必需的路径提供内存级可写空间:
-
--tmpfs /tmp:rw,size=10M:供临时解压、缓存、脚本生成文件 -
--tmpfs /run:rw,size=5M和--tmpfs /var/run:rw,size=5M:存放进程 socket、pid 文件、systemd 运行时数据 - 若需持久化日志,可用
-v /host/logs:/var/log/myapp:rw单独挂卷,不破坏只读原则
验证是否真正生效
进容器后执行两步检查:
-
mount | grep "on / type"—— 输出中应含ro,(逗号不能少),表示根挂载确实是只读 -
touch /testfile—— 应报错Read-only file system -
touch /tmp/testinTmp—— 应成功,证明 tmpfs 挂载正常
配合其他机制才完整
只读文件系统不是万能钥匙,它需要和其它安全控制叠加使用:
- 用
--user指定非 root 用户运行,避免提权后绕过只读限制 - 用
--cap-drop=ALL剥夺不必要的 Linux 能力,比如sys_admin或mknod - 在 Docker Compose 中可通过
read_only: true统一声明,再用volumes下的read_only: false精确放开个别路径
不复杂但容易忽略。核心就三点:加 --read-only、补 --tmpfs、验 mount 输出。做到这三步,容器的文件系统防护就算立住了根基。


















