如何为docker容器定义磁盘配额?

Fab*_*obs 5 disk quota docker

我面临着在docker容器上拥有磁盘配额的要求.具体来说,我想限制不在基本图像层中但在差异中的数据量.谷歌搜索"docker disk quota"建议使用设备映射器或btrfs后端.虽然能够在两个后端(具有不同的语义)中具有配额,但两者都存在问题:

  • btrfs不够稳定,不适合生产使用
  • device mapper仅限制包括基本图像在内的完整容器大小,但不允许限制diff

解决这个问题的最佳方法是什么?

Fab*_*obs 2

解决此问题的一种方法是将 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    
}
Run Code Online (Sandbox Code Playgroud)

这种方法非常适合我,但缺点是我需要包装“start”、“stop”和“rm”命令来考虑挂载。