如何为 docker 个容器定义磁盘配额?
How to define a disk quota for docker containers?
我遇到了在 docker 容器上设置磁盘配额的要求。具体来说,我想限制不在基本图像层中但在差异中的数据量。谷歌搜索 "docker disk quota" 建议使用 device mapper 或 btrfs 后端。虽然能够在两个后端(具有不同的语义)都有配额,但都有它们的问题:
- btrfs 不够稳定,无法用于生产环境
- device mapper 仅限制完整的容器大小,包括基本图像,但不允许限制 diff
解决这个问题的最佳方法是什么?
解决此问题的一种方法是将 diff 目录 /var/lib/docker/aufs/diff/$CONTAINER_ID
放入稀疏环回安装的 ext4 目录中。这有效地限制了用户可以在容器中 store/modify 的数据量。这是我使用的 bash 代码:
do_enable_quota() {
local ID=
local QUOTA_MB=
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 也很划算:https://docs.docker.com/engine/userguide/storagedriver/zfs-driver/
这样您就可以使用 'zpool' 命令行管理您的磁盘池。
例如,创建'只是一堆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
重要提示:最后一个 'destroys' 你的池。敬请关注
拥有 zfs 池后,只需将文件作为 docker 卷附加到每个容器的 /zpool-mounted-directory 中。
希望这对社区有所帮助。
我遇到了在 docker 容器上设置磁盘配额的要求。具体来说,我想限制不在基本图像层中但在差异中的数据量。谷歌搜索 "docker disk quota" 建议使用 device mapper 或 btrfs 后端。虽然能够在两个后端(具有不同的语义)都有配额,但都有它们的问题:
- btrfs 不够稳定,无法用于生产环境
- device mapper 仅限制完整的容器大小,包括基本图像,但不允许限制 diff
解决这个问题的最佳方法是什么?
解决此问题的一种方法是将 diff 目录 /var/lib/docker/aufs/diff/$CONTAINER_ID
放入稀疏环回安装的 ext4 目录中。这有效地限制了用户可以在容器中 store/modify 的数据量。这是我使用的 bash 代码:
do_enable_quota() {
local ID=
local QUOTA_MB=
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 也很划算:https://docs.docker.com/engine/userguide/storagedriver/zfs-driver/
这样您就可以使用 'zpool' 命令行管理您的磁盘池。
例如,创建'只是一堆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
重要提示:最后一个 'destroys' 你的池。敬请关注
拥有 zfs 池后,只需将文件作为 docker 卷附加到每个容器的 /zpool-mounted-directory 中。
希望这对社区有所帮助。