直接加--read-only可使容器根文件系统只读,但需配合--tmpfs为/tmp、/run等路径挂载可写tmpfs,或用-v显式挂载可写volume,未挂载路径仍只读,可通过mount和touch验证。

直接加 --read-only 就能让容器根文件系统变成只读,这是最核心、最有效的一步。但光这样通常不够——多数应用需要往 /tmp、/run 或日志目录写数据,不配套可写路径,容器很可能启动失败或运行异常。
启用全局只读根文件系统
使用 --read-only 启动容器后,整个 /(包括 /etc、/usr、/var)都会被挂载为只读:
- 命令示例:
docker run --read-only nginx:alpine - 验证方式:进容器执行
mount | grep "on / type",输出含ro即生效;或尝试touch /test,报Read-only file system错误即成功 - 该设置会自动限制
/proc、/sys等虚拟文件系统的写权限,防止运行时被篡改
为必需路径挂载可写 tmpfs
tmpfs 是内存中的临时文件系统,不落盘、重启即清空,适合存放 PID、socket、临时文件等:
-
--tmpfs /tmp:rw,size=10M,mode=1777—— 通用临时目录 -
--tmpfs /run:rw,size=5M和--tmpfs /var/run:rw,size=5M—— Nginx、supervisord 等依赖的运行时路径 -
--tmpfs /var/log:rw—— 仅当应用坚持本地写日志;更推荐统一输出到 stdout/stderr
按需挂载可写 volume 或绑定目录
只有真正需要持久化或共享时才挂载,并严格控制读写权限:
- 上传目录:
-v upload-data:/app/uploads:rw(命名卷,推荐) - 证书或配置文件:
-v cert-volume:/etc/tls:ro—— 必须显式加:ro - 单个配置文件只读挂载:
-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro - 避免 bind mount 宿主机敏感路径(如
/etc、/root),尤其禁用:z或:Z
Docker Compose 中的等效配置
在 docker-compose.yml 中统一启用更利于生产管理:
- 服务级只读:
read_only: true(等效于--read-only) - 配合 tmpfs:
tmpfs: ["/tmp", "/run"] - 卷挂载只读(针对特定路径):
- ./conf:/etc/nginx:ro或长语法read_only: true - 注意:
read_only: true优先级高于卷级:ro,两者混用时后者无实际意义


















