storageopt不能直接防范流氓进程写满磁盘,需结合--tmpfs、xfs项目配额、zfs子卷配额及logrotate等应用层措施实现可靠防护。

StorageOpt 本身不能直接防范流氓进程写满宿主机磁盘,它只是向底层存储驱动传递参数的配置项,并非通用配额开关。在默认 overlay2 驱动下,--storage-opt size=10G 会报错或被忽略;只有极少数环境(如 legacy devicemapper + direct-lvm)才可能生效,且已不推荐用于新系统。
真正起效的存储配额方案
要防止容器内流氓进程(如日志疯涨、缓存失控、恶意文件生成)耗尽宿主机磁盘,需绕过 StorageOpt,采用以下实测可靠的方式:
用 --tmpfs 限制易膨胀临时路径
适用于 /tmp、/var/log、/run 或自定义缓存目录等无需持久化的场景:
• 启动时加 --tmpfs /app/logs:rw,size=256m,该目录最多占用 256MB 内存/swap,写满即报 “No space left on device”
• 不落盘,彻底规避磁盘污染
• 多个路径可叠加:--tmpfs /tmp:size=128m --tmpfs /cache:size=512m
绑定挂载宿主机配额目录(生产首选)
把容器数据目录映射到宿主机一个已启用 XFS 项目配额的路径,由内核级 quota 强制拦截:
• 宿主机挂载时开启配额:mount -o prjquota /dev/sdb1 /mnt/data
• 标记并设限:xfs_quota -x -c 'project -s myapp' /mnt/data,再 xfs_quota -x -c 'limit -p bhard=3g myapp' /mnt/data
• 容器启动:docker run -v /mnt/data/myapp:/var/lib/app nginx
• 写满后容器内直接报 Disk quota exceeded,宿主机磁盘完全受控
换用 ZFS 存储驱动实现子卷级硬配额
适合对根文件系统整体设限,但需宿主机提前部署 ZFS 池:
• 启动 dockerd:dockerd --storage-driver=zfs --storage-opt zfs.poolname=myzpool
• 每个容器自动创建独立子卷(如 myzpool/docker/abc123)
• 手动设限:zfs set quota=5G myzpool/docker/abc123
• 配额立即生效,且作用于整个容器 rootfs,包括 upperdir 写入
必须配合的应用层兜底措施
单靠存储配额仍不够——流氓进程可能绕过挂载点,在容器内其他路径写入。还需补充:
• 容器内启用 logrotate 并配置 maxsize 和 rotate,防止日志无限追加
• 使用 du -sh / | grep G 类脚本定时检查,超阈值自动 kill 异常进程或发告警
• 宿主机部署 cadvisor + Prometheus,监控 container_fs_usage_bytes 指标,对突增写入触发告警











