Существует ли максимальное количество контейнеров на хосте Docker?

В принципе, заголовок говорит все: существует ли ограничение в количестве контейнеров, запущенных одновременно на одном хосте Docker?

Ответы

Ответ 1

Существует ряд системных ограничений, с которыми вы можете столкнуться (и работать вокруг), но там есть значительное количество серой области в зависимости от

  • Как вы настраиваете контейнеры докеров.
  • Что вы используете в своих контейнерах.
  • В каком ядре, дистрибутиве и докерной версии вы находитесь.

Ниже приведено изображение boot2docker 1.11.1 vm, основанное на Tiny Core Linux 7. Ядро - 4.4.8

Docker

Docker создает или использует несколько ресурсов для запуска контейнера, поверх того, что вы запускаете внутри контейнера.

  • Прикрепляет виртуальный адаптер ethernet к мосту docker0 (максимум 1023 на мост)
  • Подключает файловую систему AUFS и shm (1048576 монтирует максимум для типа fs)
  • Создайте слой AUFS поверх изображения (максимум 127 слоев)
  • Процесс управления Forks 1 extra docker-containerd-shim (~ 3 МБ на контейнер на avg и sysctl kernel.pid_max)
  • Внутренние данные Docker API/daemon для управления контейнером. (~ 400 тыс. На контейнер)
  • Создает ядро ​​ cgroup и пространства имен
  • Открывает дескрипторы файлов (~ 15 + 1 за каждый запущенный контейнер при запуске. ulimit -n и sysctl fs.file-max)

Параметры докеров

  • Отображение портов -p будет запускать дополнительный процесс на номер порта на хосте (~ 4,5 МБ на порт в avg pre 1.12, ~ 300k на порт > 1.12, а также sysctl kernel.pid_max)
  • --net=none и --net=host удалят сетевые накладные расходы.

Контейнерные услуги

Общие ограничения обычно определяются тем, что вы запускаете внутри контейнеров, а не накладными доками (если вы не делаете что-то эзотерическое, например, как тестировать, сколько контейнеров вы можете запустить:)

Если вы используете приложения на виртуальной машине (node, ruby, python, java) использование памяти, скорее всего, станет вашей главной проблемой.

IO через 1000 процессов может привести к большому количеству конкурентов.

1000 процессов, пытающихся работать в одно и то же время, вызвали бы много переключение контекста (см. приложения vm выше для сбора мусора)

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

Он не сильно отличается от настройки хоста linux для запуска 1000 процессов, а также некоторых дополнительных накладных расходов Docker для включения.

Пример

1023 В файлах загруженных загрузочных файлов Docker nc -l -p 80 -e echo host используется примерно 1 ГБ памяти ядра и 3,5 ГБ системной памяти.

1023 plain nc -l -p 80 -e echo host Процессы, выполняемые на хосте, используют около 75 МБ памяти ядра и 125 МБ системной памяти

Начиная с 1023 контейнеров в течение примерно 8 минут.

Убийство 1023 контейнеров поочередно заняло ~ 6 минут

Ответ 2

Практический предел - это количество разрешенных PID в системе, которое контролируется в /proc/sys/kernel/pid_max. Накладные расходы одного контейнера очень низки. В зависимости от системных ресурсов теоретически можно запускать тысячи контейнеров на одном хосте.

Ответ 3

Из сообщения в списке рассылки около 1000 контейнеров вы запускаете проблемы с сетью Linux.

Причина такова:

Это ядро, в частности net/bridge/br_private.h. BR_PORT_BITS не может быть расширен из-за требований к привязке дерева.