Docker daemon.json 无法为单个容器设置磁盘配额,仅能通过 storage-opts 限制 overlay2 新容器 rootfs 初始层大小(非运行时硬限),或配置日志轮转、data-root 路径、清理策略等全局防护措施。
docker 的 daemon.json 无法直接为单个容器设置磁盘配额大小,这是关键前提。很多人误以为加个 "storage-opts": ["overlay2.size=10g"] 就能限制某个容器的磁盘使用量,但实际它只影响新容器 rootfs 的初始层大小上限(且仅对 overlay2 + 特定内核有效),不控制运行时写入总量,也不约束卷(volume)或匿名卷空间。
真正起作用的配置,分两类场景:
容器根文件系统(rootfs)的初始大小限制(有限作用)
适用于 overlay2 驱动,且希望新容器启动时自带一个“上限感知”的基础层:
"storage-driver": "overlay2""storage-opts": ["overlay2.size=10G"]
⚠️ 注意:
- 该参数仅在容器首次创建时生效,设定的是镜像层 + 初始可写层的理论最大尺寸,不是运行时硬隔离;
- 多数现代内核(5.4+)默认禁用此选项,需配合
"overlay2.override_kernel_check": true(不推荐生产环境盲目启用); - 容器持续写日志、tmp 目录、/var/lib/app 等路径仍可能突破该值——因为 overlay2 的 upperdir 实际受宿主机文件系统空间约束,无配额机制。
全局性磁盘保护:靠 daemon.json 控制“防爆盘”行为
虽然不能限单个容器总磁盘,但可通过以下参数避免 /var/lib/docker 被撑爆:
-
日志自动轮转(最刚需)
"log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }→ 单个容器日志文件超 100MB 自动切新文件,最多保留 3 个,旧日志被删除。
-
迁移数据根目录到大容量磁盘
"data-root": "/data/docker"
→ 把镜像、容器、卷等全部移到独立 XFS/ext4 分区,再在此分区上配 quota 或监控,才是可控路径。
-
镜像/构建缓存清理策略(间接控盘)
daemon.json 不直接支持自动清理,但可配合定期执行:docker system prune -af --volumes # 清理无用数据(需脚本化+定时任务)
正确思路:配额不在 daemon.json,而在挂载与文件系统
若你真需要“某容器最多用 5GB 磁盘”,应放弃 daemon.json 设配额幻想,改用:
- ✅ 绑定挂载一个已设 XFS project quota 的目录(如
/mnt/appdata); - ✅ 用
--tmpfs /tmp:size=512m替代临时数据写入; - ✅ 换 ZFS 存储驱动,为每个容器子卷设
quota=5g(全局变更,影响所有容器)。
daemon.json 是守护进程级开关,不是容器资源控制器。它的角色是“划边界、防失控、保稳定”,而不是“给每个容器发额度”。


















