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

5
我面临的需求是在Docker容器上设置磁盘配额。具体来说,我想限制的是不在基础映像层中而在差异层中的数据量。通过搜索“Docker 磁盘配额”,建议使用设备映射器或btrfs后端。虽然两个后端都支持配额(具有不同的语义),但它们也存在问题:
  • btrfs并不稳定,不能用于生产环境
  • 设备映射器仅限制包括基础映像的完整容器大小,而不允许限制差异
那么,有什么最好的方法来解决这个问题呢?
2个回答

2

解决这个问题的一种方法是将差异目录/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”命令以考虑挂载。

你有没有一个示例可以让这个脚本工作?在我的情况下,我只想将 ubuntu:14.04 容器大小限制在几 MiB,并创建容器。 - askb
运行cmd后,我得到了以下错误:$ do_enable_quota 91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c 20 - askb
发送 177 字节,接收 50 字节,速度为 454.00 字节/秒 总大小为 0,加速比为 0.00 守护进程的错误响应:没有这样的 ID:91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c 错误:无法启动容器:[91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c] - askb
你完成了工作方法吗?容器特定的磁盘配额可能会限制索引节点。 - Ningappa

1

ZFS也是一个很好的选择:https://docs.docker.com/engine/userguide/storagedriver/zfs-driver/

这样您就可以使用“zpool”命令行管理您的磁盘池。

例如,要创建“just a bunch of vdisk”:

[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的磁盘。现在创建一个单一的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存储池,只需在每个容器的/zpool-mounted-directory内放置作为docker卷附加的文件即可。

希望这可以帮助社区。


请注意,这不是软件RAID,你没有四个磁盘进行分布式I/O写操作,因此性能不会像RAID卷一样丰富。 - Hudson Santos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接