Docker容器磁盘配额限制,限制单个容器最大磁盘占用
限制单个容器的最大磁盘占用,Docker 提供了 --storage-opt size 参数,但它不是所有环境都能直接使用。
这个参数生效的前提是:Docker 存储驱动为 overlay2,并且底层文件系统是 XFS 且挂载时启用了 pquota。
下面先带你把环境条件确认好,再给出可复现的操作步骤和验证方法。
先确认存储驱动和文件系统是否支持
执行下面两条命令,检查当前 Docker 的存储驱动和 /var/lib/docker 所在文件系统类型:
docker info | grep "Storage Driver"
df -T /var/lib/docker
如果第一条输出是 overlay2,第二条的“类型”列是 xfs,说明你已经具备使用磁盘配额的基础条件。
这里还需要确认挂载选项里包含 pquota,可以运行:
mount | grep /var/lib/docker
看到 pquota 字样即可。
如果文件系统是 ext4,--storage-opt size 不会生效,需要先调整存储驱动或改用其他方案。
用 size 参数限制容器可写层大小
启动容器时,通过 --storage-opt size 指定最大可写层容量。
例如限制为 5GB:
docker run -it --storage-opt size=5g ubuntu:22.04 /bin/bash
size 后面的单位支持 b、k、m、g,一般建议用 g。
这个配额只限制容器可写层,不限制镜像层,也不限制通过 -v 挂载的数据卷。
如果容器已经创建,这个参数无法在运行中修改,只能删除后重新创建。
使用 docker-compose 时,可以在服务的配置里这样写:
services:
app:
image: ubuntu:22.04
storage_opt:
size: 5g
环境不支持时,用数据卷配额兜底
如果你的 Docker 存储驱动不是 overlay2,或者底层文件系统不是 XFS,仍想限制磁盘占用,可以考虑把数据放到独立数据卷中,再对宿主机目录做配额限制。
例如:
docker run -d -v /data/containers/app:/data myimage
然后对宿主机上的 /data/containers/app 目录设置 XFS 项目配额:
xfs_quota -x -c 'project -s app /data/containers/app' /data
xfs_quota -x -c 'limit -p bhard=5g app' /data
这样至少能让数据卷部分受控,但容器可写层仍然可能膨胀。
因此,如果你希望从根源上限制整个容器占用的物理磁盘,最好还是优先把 Docker 存储驱动切换为 overlay2 并搭配 XFS。
验证配额是否生效及常见坑
进入容器后,用 dd 写入一个大文件,观察是否在超出限制时失败:
dd if=/dev/zero of=/tmp/test.img bs=1M count=6000
如果配额设置为 5G,写入到约 5G 时会提示 No space left on device,这是正常的预期结果。
实际操作中容易踩这几个坑:
- 镜像层共享不影响配额:多个容器共用镜像层,
size只统计每个容器自己写入的部分。 - 数据卷不占配额:
-v或--mount挂载的目录走的是宿主机文件系统,不受这个参数限制。 - 老版本 Docker 不支持:建议使用 18.09 及以上版本,具体以官方文档为准。
- 并非所有 overlay2 环境都自动支持:必须同时满足 XFS 文件系统和
pquota挂载选项,两者缺一不可。
总结:先测通再上生产
给单个容器限制磁盘占用,核心判断顺序是:先确认 Docker 存储驱动是否为 overlay2,再确认文件系统是否为带 pquota 的 XFS。
满足条件后,直接用 --storage-opt size 限制容器可写层;
不满足条件,则需要通过数据卷配额或调整 Docker 存储架构来间接实现。
建议你在测试环境完整跑一遍本文的命令,确认输出结果符合预期后,再把这套配置应用到生产容器。