如何定义docker集装箱的磁盘配额?
我遇到了在Docker容器上有磁盘配额的要求。 具体而言,我想限制不在基础图像层中的数据量,而是在差异中。 谷歌search“docker磁盘配额”build议使用设备映射程序或btrfs后端。 虽然能够在两个后端(具有不同的语义)有配额都有他们的问题:
- btrfs对于生产使用不够稳定
- 设备映射程序仅限制包含基本映像的完整容器大小,但不允许限制差异
什么是解决这个问题的最好方法?
解决这个问题的一个方法是将diff目录/var/lib/docker/aufs/diff/$CONTAINER_ID
放到一个稀疏的回送装载的ext4目录中。 这有效地限制了用户可以在容器中存储/修改的数据量。 这是我使用的bash代码:
do_enable_quota() { local ID=$1 local QUOTA_MB=$2 local LOOPBACK=/var/lib/docker/aufs/diff/$ID-loopback local LOOPBACK_MOUNT=/var/lib/docker/aufs/diff/$ID-loopback-mount local DIFF=/var/lib/docker/aufs/diff/$ID docker stop -t=0 $ID sudo dd of=$LOOPBACK bs=1M seek=$QUOTA_MB count=0 sudo mkfs.ext4 -F $LOOPBACK sudo mkdir -p $LOOPBACK_MOUNT sudo mount -t ext4 -n -o loop,rw $LOOPBACK $LOOPBACK_MOUNT sudo rsync -rtv $DIFF/ $LOOPBACK_MOUNT/ sudo rm -rf $DIFF sudo mkdir -p $DIFF sudo umount $LOOPBACK_MOUNT sudo rm -rf $LOOPBACK_MOUNT sudo mount -t ext4 -n -o loop,rw $LOOPBACK $DIFF docker start $ID }
这种方法对我来说是完美的,但缺点是我需要包装“start”,“stop”和“rm”命令来考虑安装。
ZFS也是一个很好的select: https : //docs.docker.com/engine/userguide/storagedriver/zfs-driver/
这样你就可以用'zpool'命令行pipe理你的磁盘池了。
例如,创build“ 只是一堆虚拟磁盘 ”:
[root@localhost /]# mkdir /dsk [root@localhost /]# dd if=/dev/zero of=/dsk/disk1 bs=1M count=750 [root@localhost /]# dd if=/dev/zero of=/dsk/disk2 bs=1M count=750 [root@localhost /]# dd if=/dev/zero of=/dsk/disk3 bs=1M count=750 [root@localhost /]# dd if=/dev/zero of=/dsk/disk4 bs=1M count=750
好的,我们有四个750M的磁盘。 现在创build一个ZFS池:
[root@localhost /]# zpool create CIALINUX /dsk/disk{1,2,3,4}
现在我们有一个名为CIALINUX的卷,在我们的/目录下自动安装了大约3GB的卷:
[root@localhost /]# df -h |grep CIALINUX CIALINUX 2,9G 18K 2,9G 1% /CIALINUX
你可以自己探索的其他命令是:
# zpool list # zpool status # zpool status -x # zpool destroy CIALINUX
重要提示:最后一个“破坏”你的游泳池。 请注意它。
一旦拥有了zfs池,只需将每个容器的附加文件作为docker卷放在/ zpool-mounted-directory目录中即可。
希望这个帮助社区。