我面临着在docker容器上拥有磁盘配额的要求。具体来说,我想限制不在基本图像层中但在差异中的数据量。谷歌搜索"码头磁盘配额"建议使用device mapper或btrfs后端。虽然能够在两个后端(具有不同的语义)中具有配额,但两者都存在问题:
解决这个问题的最佳方法是什么?
答案 0 :(得分: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
}
这种方法对我来说非常有效,但缺点是我需要包装"开始","停止"和" rm"命令将安装考虑在内。
答案 1 :(得分:1)
ZFS也很棒:https://docs.docker.com/engine/userguide/storagedriver/zfs-driver/
通过这种方式,您可以使用&#z; zpool'来管理您的磁盘池。命令行。
例如,要创建' 只是一堆虚拟磁盘 ':
[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池之后,只需将文件作为docker卷附加到/ zpool-mounted-directory中,用于每个容器。
希望这个帮助社区。 p>