启用--read-only使容器根文件系统只读,需配合--tmpfs为/tmp、/run等路径挂载可写tmpfs,或用-v显式挂载可写volume,未挂载路径仍只读,可通过mount命令验证及touch测试写入权限。

直接在启动容器时加 --read-only 参数,就能让容器根文件系统变为只读,这是最基础也最有效的防护手段。
启用只读模式的核心命令
运行容器时添加 --read-only 选项即可:
-
docker run --read-only nginx:alpine—— 整个根文件系统(/)禁止写入 - 该设置会自动禁用
/proc、/sys等虚拟文件系统的写权限,避免运行时被篡改 - 若镜像中程序默认向
/tmp或/var/log写日志,会因权限失败而崩溃,需配合挂载修复
为必要目录提供可写能力
只读不等于完全不能写,关键是要有选择地开放:
- 用
-v挂载主机目录或命名卷到容器内指定路径:-v /host/logs:/var/log:rw - 对必须临时写入的路径(如
/tmp),可用tmpfs内存卷:--tmpfs /tmp:rw,size=10m - 挂载
/proc、/sys等系统路径时,务必加:ro显式声明只读,防止意外覆盖宿主机状态
配合其他安全机制协同生效
只读文件系统不是孤立策略,需与以下配置联动:
- 搭配 非 root 用户运行:Dockerfile 中用
USER appuser,避免进程即使获得写权限也无法修改系统关键路径 - 禁用特权模式:
--privileged会绕过只读限制,必须关闭 - 限制能力集:
--cap-drop=ALL --cap-add=NET_BIND_SERVICE,进一步缩小攻击面 - 验证应用兼容性:提前测试程序是否依赖写入根目录下的配置或缓存,否则只读会直接导致启动失败
生产环境推荐实践
只读应作为默认策略,尤其用于无状态服务和API网关类容器:
- 静态站点容器(Nginx/HTTPD):天然适合全只读,连
/tmp都可省略 - 数据库客户端或CLI工具容器:仅需
--tmpfs /tmp即可满足临时需求 - CI/CD 构建容器:若需写入构建产物,挂载专用命名卷,根文件系统仍保持只读
- 配合镜像扫描(如 Trivy)和签名验证(DCT),形成从构建到运行的完整防护链


















