Ограничить размер диска и пропускную способность контейнера Docker

#docker

#docker

Вопрос:

У меня есть физический хост-компьютер с запущенной на нем Ubuntu 14.04. Он имеет диск емкостью 100 ГБ и пропускную способность сети 100 М. Я установил Docker и запустил 10 контейнеров. Я хотел бы ограничить каждый контейнер максимум диском 10G и пропускной способностью сети 10M.

После просмотра официальных документов и поиска в Интернете я все еще не могу найти способ выделить контейнеру диск указанного размера и пропускную способность сети.

Я думаю, что это может быть невозможно напрямую в Docker, возможно, нам нужно обойти Docker. Означает ли это, что мы должны использовать что-то «базовое», такое как LXC или Cgroup? Кто-нибудь может дать какие-нибудь предложения?


Редактировать:

@Mbarthelemy, ваше предложение, похоже, работает, но у меня все еще есть несколько вопросов о диске:

1) Можно ли выделить другой размер (например, 20 г, 30 г и т.д.) Для каждого контейнера? Вы сказали, что это жестко запрограммировано в Docker, так что это кажется невозможным.

2) Я использую приведенную ниже команду для запуска демона Docker и контейнера:

 docker -d -s devicemapper
docker run -i -t training/webapp /bin/bash
 

затем я использую df -h для просмотра использования диска, он выдает следующий вывод:

 Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/docker-longid   9.8G  276M  9.0G   3% /
/dev/mapper/Chris--vg-root   27G  5.5G   20G  22% /etc/hosts
 

исходя из вышесказанного, я думаю, что максимальный диск, который может использовать контейнер, все еще больше, чем 10G, что вы думаете
?

Ответ №1:

Я не думаю, что это возможно прямо сейчас, используя настройки Docker по умолчанию. Вот что я бы попробовал.

  • Об использовании диска: вы можете указать Docker использовать серверную часть хранилища DeviceMapper вместо AuFS. Таким образом, каждый контейнер будет работать на блочном устройстве (Devicemapper dm-thin target), ограниченном 10 ГБ (это значение по умолчанию в Docker, к счастью, оно соответствует вашим требованиям!).

    Согласно этой ссылке, похоже, что последние версии Docker теперь поддерживают расширенные параметры серверной части хранилища. Используя devicemapper серверную часть, теперь вы можете изменить параметр размера rootfs контейнера по умолчанию, используя --storage-opt dm.basesize=20G (который будет применяться к любому вновь созданному контейнеру).

    Чтобы изменить серверную часть хранилища: используйте параметр --storage-driver=devicemapper Docker. Обратите внимание, что ваши предыдущие контейнеры больше не будут отображаться Docker после изменения.

  • О пропускной способности сети: вы можете указать Docker использовать LXC под капотом: используйте -e lxc опцию.

    Затем создайте свои контейнеры с помощью пользовательской директивы LXC, чтобы поместить их в класс трафика :

    docker run --lxc-conf="lxc.cgroup.net_cls.classid = 0x00100001" your/image /bin/stuff

    Ознакомьтесь с официальной документацией о том, как применять ограничения пропускной способности к этому классу. Я никогда не пробовал это сам (моя установка использует пользовательский мост OpenVswitch и VLAN для работы в сети, поэтому ограничение пропускной способности отличается и несколько проще), но я думаю, вам придется создать и настроить другой класс.

Примечание : параметры --storage-driver=devicemapper и -e lxc предназначены для демона Docker, а не для клиента Docker, который вы используете при запуске docker run ....... .

Комментарии:

1. mbarthelemy, я дополняю свой вопрос о диске, можете ли вы помочь разобраться?

2. Ваш корневой том FS является первым ( |9.8G |276M| 9.0G | 3% |/ ). Размер, как и ожидалось, составляет 10 ГБ. Другая строка — это привязка.

3. ваше предложение — хороший способ ограничить размер диска. Но я думаю, что есть другой подход к реализации этого. Я решаю добавить другого пользователя в указанную группу в контейнере, затем я ограничиваю размер диска этой группы, используя «Квоту» в Linux. Что касается пропускной способности, это слишком сложно для меня, я все еще пытаюсь, может быть, спрошу вас о чем-нибудь позже.

4. @mbarthelemy не могли бы вы дать мне некоторые подробности о том, как вы заставляете OpenVswitch bridge и VLAN работать с Docker? Я очень заинтересован в работе Docker с SDN. Большое спасибо!

5. официальная документация была изменена на https://www.kernel.org/doc/Documentation/cgroup-v1/net_cls.txt

Ответ №2:

В новых версиях версии есть --device-read-bps и --device-write-bps .

Вы можете использовать:

 docker run --device-read-bps=/dev/sda:10mb
 

Подробнее здесь:

https://blog.docker.com/2016/02/docker-1-10/

Комментарии:

1. Следует отметить, что это только для блочных устройств. Трафик интерфейса не добавлен. 4763 все еще открыт

Ответ №3:

Если у вас есть доступ к контейнерам, вы можете использовать tc для управления пропускной способностью внутри них.

например: в вашем сценарии точки входа вы можете добавить: tc qdisc add dev eth0 root tbf rate 240kbit burst 300kbit latency 50ms

для пропускной способности 240 Кбит / с, пакетной передачи 300 Кбит / с и задержки 50 мс.

Вам также необходимо передать --cap-add=NET_ADMIN docker run команду to, если вы не запускаете контейнеры от имени root.

Ответ №4:

1) Можно ли выделить другой размер (например, 20 г, 30 г и т.д.) Для каждого контейнера? Вы сказали, что это жестко запрограммировано в Docker, так что это кажется невозможным.

чтобы ответить на этот вопрос, пожалуйста, обратитесь к разделу Изменение размера контейнеров Docker с помощью плагина Device Mapper