Ограничение памяти контейнера по умолчанию в Docker 17.06-ce для ресурсов общего хоста
У меня есть хост с ресурсом 8 ядер / 16 ГБ оперативной памяти. Мы используем cgroup
выделить CPU
а также memory
для нашего пользовательского приложения. Мы попытались создать статический ресурс раздела между нашим пользовательским приложением и докером. Например, мы пытаемся выделить следующее:
4 CPU cores / 8 GB RAM --> docker
3 CPU cores / 6 GB RAM --> custom_app_1
the remaining for OS
Нам удалось выполнить сегрегацию для custom_app_1
, Вопрос в том, как создать ограничение по умолчанию для памяти и процессора в нашем контейнере без использования флага --memory
или же --cpus
для индивидуальной тары. Мне не нужно ограничивать каждый контейнер, но я должен убедиться, что все контейнеры, работающие на хосте, не могут превышать использование 8 ГБ ОЗУ и 4 процессорных ядер, в противном случае он будет бороться с ресурсами с помощью моего custom_app_1
Когда я выполняю docker stats
каждый контейнер видит 16 ГБ ОЗУ, как я могу настроить, чтобы они видели только 8 ГБ ОЗУ и 4 ядра ЦП
1 ответ
Итак, вам нужно создать срез SystemD для памяти.
# /etc/systemd/system/limit-docker-memory.slice
[Unit]
Description=Slice with MemoryLimit=8G for docker
Before=slices.target
[Slice]
MemoryAccounting=true
MemoryLimit=8G
Затем настройте этот фрагмент в /etc/docker/daemon.json
{
"cgroup-parent": "limit-docker-memory.slice"
}
Перезагрузите systemctl и перезапустите докер
systemctl daemon-reload
systemctl restart docker
Смотрите соответствующий раздел в документации
DEFAULT CGROUP PARENT
Опция --cgroup-parent позволяет вам установить родительский элемент cgroup по умолчанию, который будет использоваться для контейнеров. Если эта опция не установлена, по умолчанию используется / docker для драйвера fs cgroup и system.slice для драйвера systemd cgroup.
Если cgroup имеет переднюю косую черту (/), cgroup создается под корневой cgroup, в противном случае cgroup создается под cgroup демона.
Предполагая, что демон работает в демоне cgroup, --cgroup-parent= /foobar создает группу в / sys / fs / cgroup / memory /foobar, тогда как использование --cgroup-parent= foobar создает группу в / sys / fs / контрольная группа / память / daemoncgroup / Foobar
Драйвер systemd cgroup имеет разные правила для --cgroup-parent. Systemd представляет иерархию по слоям, а имя слоя кодирует местоположение в дереве. Так что --cgroup-parent для systemd cgroups должен быть именем среза. Имя может состоять из разделенной тире серии имен, которая описывает путь к срезу от корневого среза. Например, --cgroup-parent= user-ab.slice означает, что cgroup памяти для контейнера создается в /sys/fs/cgroup/memory/user.slice/user-a.slice/user-ab.slice/docker -.объем.
Этот параметр также можно установить для каждого контейнера, используя параметр --cgroup-parent при создании и запуске docker, и имеет приоритет над параметром --cgroup-parent в демоне.