如何定义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目录中即可。

希望这个帮助社区。