2015-03-13 2 views
5

Я столкнулся с требованием иметь дисковые квоты на контейнерах докеров. В частности, я хочу ограничить объем данных, которые не находятся в слоях базового изображения, но в diff. Googling для «док-дисковой дисковой квоты» предлагает использовать либо device mapper, либо бэнд-серверы btrfs. Будучи в состоянии иметь квоты в обоих движков (с различной семантикой) и имеют свои проблемы:Как определить дисковый квот для контейнеров-докеров?

  • Btrfs не достаточно стабильна для использования в производстве
  • устройство картографа только ограничивает полный размер контейнера, включая базовое изображение, но не позволяет ограничивать разницу

Каков наилучший способ решить эту проблему?

ответ

2

Один из способов решения этой проблемы - поместить каталог diff /var/lib/docker/aufs/diff/$CONTAINER_ID в разреженный каталог с ext4. Это эффективно ограничивает объем данных, которые пользователь может хранить/изменять в контейнере. Это код Баш я использую:

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  
} 

Этот подход отлично работает для меня, но недостатком является то, что мне нужно обернуть «старт», «стоп» и «тт» команды взять монтировку во внимание.

+0

у вас есть пример, как заставить этот скрипт работать. В моем случае, только хотите ограничить размер контейнера ubuntu: 14: 04 на несколько MiB и создать контейнер. – askb

+0

Я получаю эту ошибку после запуска cmd: $ do_enable_quota 91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c 20 – askb

+0

отправлено 177 полученных байтов 50 байт 454,00 байт/с общий размер 0 speedup равен 0.00 ответ ошибки от демона: нет такого ID: 91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c Ошибка: не удалось запустить контейнеры: [91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c] – askb

1

ZFS также много: https://docs.docker.com/engine/userguide/storagedriver/zfs-driver/

Таким образом, вы можете управлять пулами дисков с командной строкой «zpool».

Например, чтобы создать 'просто куча VDISK':

[[email protected] /]# mkdir /dsk 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk1 bs=1M count=750 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk2 bs=1M count=750 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk3 bs=1M count=750 
[[email protected] /]# dd if=/dev/zero of=/dsk/disk4 bs=1M count=750 

Ok, мы имеем четыре диски 750M каждый. Теперь создать один единый ZFS пул:

[[email protected] /]# zpool create CIALINUX /dsk/disk{1,2,3,4} 

Теперь у нас есть объем названный CIALINUX, с почти 3GB автоматически монтируется в нашем каталоге /:

[[email protected] /]# df -h |grep CIALINUX 

CIALINUX 2,9G 18K 2,9G 1% /CIALINUX 

Другие команды, которые вы можете изучить самостоятельно являются:

# zpool list 
# zpool status 
# zpool status -x 
# zpool destroy CIALINUX 

Важно: этот последний «разрушает» ваш бассейн. Пожалуйста, обратите внимание на это.

Как только у вас есть пулы zfs, просто поместите ваши файлы в виде томов докеров в/zpool-installed-directory для каждого контейнера.

Надеюсь, что эта помощь сообщества.

+0

Обратите внимание, что это не своего рода программный RAID, у вас нет четырех дисков, которые пишут распределенные операции ввода-вывода, поэтому ваша производительность будет не такой богатой, как объем RAID. –

Смежные вопросы