Docker容器规格Quota¶
通常 /var/lib/docker
文件系统采用一个独立的分区比较合适,可以通过文件系统的Quota来限制Docker容器规格。Docker size Quota建议使用XFS的quota属性实现。
根据Docker官方文档 Set storage driver options per container :
docker run
参数 --storage-opt size=120G
可以在容器创建时设置容器rootfs大小。这个选项 --storage-opt
只在以下 Docker存储驱动 有效:
devicemapper
btrfs
overlay2
windowsfilter
zfs
对于上述存储驱动 devicemapper, btrfs, windowsfilter, zfs ,用户不能设置比默认BaseFS更小的容器大小。对于 overlay2
存储驱动,这个 size
选项只对 xfs
后端文件系统有效,并且 xfs
必须使用 pquota
挂载选项。只有这些条件满足,用户才能传递比后端文件系统小的容器rootfs大小。
备注
上述Docker官方文档指出只有底层文件系统是 xfs
情况(使用了 pquota
选项挂载),才能在上层 overlay2
存储驱动中使用 --storage-opt size=XXX
来限制容器rootfs大小。(感谢 michaelyu0906 指正 Docker目前不支持ext4的quota #5 )
目前根据资料和相关信息,官方Docker不支持EXT4文件系统作为OverlayFS后端文件系统来实现容器rootfs quota,不过国内互联网大厂出于稳定性和持续性,通过修改Docker实现了EXT4文件系统作为底层文件系统的OverlayFS quota。
本文后续会根据实践做修订补充...
XFS实现prjquota¶
格式化XFS:
mkfs.xfs /dev/sdb
挂载配置
/etc/fstab
/dev/sdb /var/lib/docker xfs defaults,quota,prjquota,pquota,gquota 0 0
修订
/etc/systemd/system/docker.service.d/override.conf
ExecStart=/usr/bin/dockerd --storage-driver=overlay2 --exec-opt native.cgroupdriver=systemd --log-driver=journald --storage-opt overlay2.override_kernel_check=true --storage-opt overlay2.size=10G
参数解读:
--storage-opt overlay2.override_kernel_check=true
是激活磁盘quota校验,是size quota生效的关键
--storage-opt overlay2.size=10G
是可选默认配置,在容器启动时可以覆盖这个配置。
EXT4实现prjquota¶
现在ext4文件系统也扩展成能够支持quota,国内互联网大厂通常传统上使用EXT4文件系统(稳定性),由于现代的EXT4文件系统通过扩展属性也能支持quota,所以通过定制Docker也可以使用EXT4文件系统作为后端FS, overlayfs
作为存储引擎来限制容器规格。
在 EXT4文件系统之上使用 Docker OverlayFS存储引擎 实现容器的文件系统quota:这个功能是通过EXT4文件系统的 project quota
功能实现的。如果内核支持这个功能,需要使用 SYS_IOCTL
syscall 来设置目录的project ID,然后使用 SYS_QUOTACTL
对对应的 project ID
设置hard limit和soft limit。
确保文件系统支持
Project ID
和Project Quota
属性的环境要求:内核需要
4.19
或更高版本e2fsprogs
需要1.43.4-2
或更高版本
在挂载overlayfs到容器前,首先需要不同容器的上一级目录和自身工作目录使用不同的
Project ID
并设置inheritance
选项。一旦overlayfs被挂载到容器,这个Project ID
和继承属性不能修改在容器外使用特权用户账号身份设置quota
在启动docker服务时使用以下配置参数:
-s overlay2 --storage-opt overlay2.override_kernel_check=true
Docker服务支持以下选项来设置容器的默认quota:
–storage-opt overlay2.basesize=128M
如果 -storage-opt size
也传递了参数,则该参数优先级更高(生效)。如果Docker服务没有设置默认quota,并且运行容器时也没有传递 -storage-opt size
参数,则容器quota没有限制。
格式化EXT4文件系统则需要传递参数来激活prjquota:
mkfs.ext4 -O quota,project /dev/sdb mount -o prjquota /dev/sdb /var/lib/docker
或者修改
/etc/fstab
配置:/dev/sdb /var/lib/docker ext4 defaults,quota,prjquota,pquota,gquota 0 0
参考¶
Docker: Use overlay2 with an xfs backing filesystem to limit rootfs size
Restricting the Rootfs Storage Space of a Container 华为的OpenEuler系统提供了EXT4文件系统作为后端文件系统,实现 overlay2 上quota功能