Ограничить размер диска и пропускную способность контейнера Docker
У меня есть физическая хост-машина, на которой работает Ubuntu 14.04. Он имеет пропускную способность 100 ГБ и 100 Мбит сети. Я установил Docker и запустил 10 контейнеров. Я хотел бы ограничить каждый контейнер максимальным диском 10G и пропускной способностью 10M.
После прохождения официальных документов и поиска в Интернете я до сих пор не могу найти способ выделения указанного размера диска и пропускной способности сети в контейнер.
Я думаю, что это может быть невозможно в Docker напрямую, возможно, нам нужно обойти Docker. Означает ли это, что мы должны использовать что-то "базовое", такое как LXC или Cgroup? Кто-нибудь может дать какие-то предложения?
Edit:
@Mbarthelemy, ваше предложение, похоже, работает, но у меня все еще есть некоторые вопросы о диске:
1) Можно ли разместить в каждом контейнере другой размер (например, 20G, 30G и т.д.)? Вы сказали, что он жестко закодирован в 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
, , вы можете изменить параметр размера корневых файлов по умолчанию, используя --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 для работы в сети, поэтому ограничение пропускной способности отличается и несколько проще), но я думаю, вам придется создавать и настраивать другой класс.
/li >
Примечание. Параметры --storage-driver=devicemapper
и -e lxc
для Docker daemon, а не для клиента Docker, который вы используете при запуске docker run .......
.
Ответ 2
Новая версия релизов имеет --device-read-bps
и --device-write-bps
.
Вы можете использовать:
docker run --device-read-bps=/dev/sda:10mb
Больше информации здесь:
https://blog.docker.com/2016/02/docker-1-10/
Ответ 3
Если у вас есть доступ к контейнерам, вы можете использовать tc для контроля пропускной способности внутри них.
Например: в вашем сценарии точки входа вы можете добавить:
tc qdisc add dev eth0 root tbf rate 240kbit burst 300kbit latency 50ms
иметь полосу пропускания 240 кбит/с, пакетную передачу 300 кбит/с и задержку 50 мс.
Вам также нужно передать команду --cap-add=NET_ADMIN
команде docker run
, если вы не запускаете контейнеры как root.
Ответ 4
1) Можно ли разместить в каждом контейнере другой размер (например, 20G, 30G и т.д.)? Вы сказали, что он жестко закодирован в Docker, поэтому кажется невозможным.
чтобы ответить на этот вопрос, обратитесь к Изменение размеров контейнеров Docker с плагином адаптера устройств