很多同学在用 Docker 的时候,默认容器文件系统是可读写的。一旦容器内程序存在漏洞、被入侵,攻击者就可以在容器里落文件、篡改配置、植入后门。而 --read-only 参数就是一道很实用的安全防线,把容器根文件系统设置为只读,从源头限制写入行为。
基础命令
官方原型命令:
docker run --interactive --tty --read-only --volume <writable-volume> <Container Image Name or ID> <Command>
日常简写版本(工程里最常用):
docker run -it --read-only -v <writable-volume> <镜像名/ID> <启动命令>
参数拆解
-it=--interactive --tty--interactive / -i:保持标准输入打开,不会启动后直接退出--tty / -t:分配伪终端,用来交互式操作 shell 两者搭配,就是我们熟悉的交互式进入容器终端。
--read-only核心安全参数:容器根文件系统整体只读。 除了显式挂载的卷、tmpfs 之外,容器内其他目录全部禁止写入,尝试写入会直接抛出Read-only file system错误。 适合安全加固、防止篡改、限制恶意代码落地。-v / --volume <writable-volume>配合只读模式使用:给容器开辟唯一允许写入的存储位置。 支持两种形式:- 命名卷:
myvol:/容器内路径,由 Docker 管理存储 - 绑定挂载:
/宿主机路径:/容器内路径,直接映射宿主机目录
关键逻辑:整个容器只读,只有这个挂载点可写。
- 命名卷:
<Container Image Name or ID>:镜像名称或者镜像 ID<Command>:容器启动后执行的自定义命令,如/bin/sh、bash
最简可运行示例
# 命名卷 mydata 挂载到容器内 /data,其余目录只读,进入 alpine 的 sh
docker run -it --read-only -v mydata:/data alpine /bin/sh
进入容器后:
- ✅
/data:正常读写 - ❌
/etc//usr//home:只读,无法修改
生产必加:tmpfs 临时目录
大部分业务程序会往 /tmp、/var/run、/var/log 写临时文件、pid、日志。直接 --read-only 不加处理,程序大概率启动失败。 解决方案:用 --tmpfs 挂载内存临时文件系统,数据在内存,容器销毁自动丢失:
docker run -it --read-only \
-v mydata:/data \
--tmpfs /tmp \
--tmpfs /var/run \
--tmpfs /var/log \
alpine /bin/sh
适用场景
- 安全加固:限制容器被入侵后写入、持久化恶意文件
- 无状态应用:业务数据统一放在外部卷,容器本身无状态
- 等保、审计、合规类业务,减少攻击面
- CI 一次性任务、扫描容器、沙箱环境
踩坑提醒
--read-only只约束容器联合文件系统,不会限制挂载卷内部权限,卷本身依然可以正常写入;- 启动前梳理应用写入路径:日志、缓存、pid、上传目录,没有挂载 tmpfs /volume 就会启动报错;
- 不适合需要大量动态修改自身程序文件的容器;适合程序静态、数据外存的服务。
小结
--read-only + volume + tmpfs 是一套成熟的 Docker 安全组合。容器本身变成 “不可篡改的镜像实例”,业务数据、临时文件剥离到外部存储或者内存,就算应用出现漏洞,攻击者也很难在容器内留下持久化恶意载荷,是成本很低、收益很高的容器安全手段。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)