Существует ли максимальное количество контейнеров, работающих на хосте Docker?
По сути, заголовок говорит сам за себя: есть ли ограничения на количество одновременно работающих контейнеров на одном хосте Docker?
3 ответа
Существует ряд системных ограничений, с которыми вы можете столкнуться (и обойти), но существует значительная часть серой области в зависимости от
- Как вы настраиваете свои док-контейнеры.
- Что вы запускаете в своих контейнерах.
- На каком ядре, дистрибутиве и версии докера вы находитесь.
Приведенные ниже рисунки взяты из образа boot2docker 1.11.1 vm, который основан на Tiny Core Linux 7. Ядро 4.4.8
докер
Docker создает или использует ряд ресурсов для запуска контейнера поверх того, что вы запускаете внутри контейнера.
- Присоединяет виртуальный адаптер Ethernet к
docker0
мост (1023 макс на мост) - Монтирует AUFS и
shm
файловая система (1048576 монтируется макс. для каждого типа fs) - Создайте слой AUFS поверх изображения (максимум 127 слоев)
- Вилы 1 экстра
docker-containerd-shim
процесс управления (~3 МБ на контейнер в среднем иsysctl kernel.pid_max
) - Docker API / демон внутренние данные для управления контейнером. (~400 тыс. На контейнер)
- Создает ядро
cgroup
с и пространства имен - Открывает дескрипторы файлов (~15 + 1 на работающий контейнер при запуске.
ulimit -n
а такжеsysctl fs.file-max
)
Опции докера
- Отображение портов
-p
будет запускать дополнительный процесс для каждого номера порта на хосте (~ 4,5 МБ на порт в среднем до 1,12, ~300 К на порт> 1,12, а такжеsysctl kernel.pid_max
) --net=none
а также--net=host
удалит сетевые накладные расходы.
Контейнерные услуги
Общие ограничения обычно определяются тем, что вы запускаете внутри контейнеров, а не докерами (если вы не делаете что-то эзотерическое, например, тестирование количества контейнеров, которые вы можете запустить:)
Если вы запускаете приложения на виртуальной машине (node,ruby,python,java), использование памяти может стать вашей основной проблемой.
IO через 1000 процессов вызовет много конфликтов ввода-вывода.
1000 одновременных попыток запуска процессов вызовут много переключений контекста (см. Выше vm apps для сбора мусора)
Если вы создадите сетевые соединения из 1000 контейнеров, сетевой уровень хостов получит тренировку.
Это не сильно отличается от настройки хоста linux для запуска 1000 процессов, только некоторые дополнительные издержки Docker для включения.
пример
Работает 1023 образа занятого Docker nc -l -p 80 -e echo host
использует около 1 ГБ памяти ядра и 3,5 ГБ системной памяти.
1023 равнины nc -l -p 80 -e echo host
процессы, выполняющиеся на хосте, используют около 75 МБ памяти ядра и 125 МБ системной памяти
Запуск 1023 контейнеров поочередно занял ~8 минут.
Уничтожение 1023 контейнеров поочередно заняло ~6 минут
Начиная с сообщения в списке рассылки, около 1000 контейнеров вы начинаете сталкиваться с сетевыми проблемами Linux.
Причина в том, что:
Это ядро, а именно net/bridge/br_private.h BR_PORT_BITS не может быть расширен из-за требований связующего дерева.
С помощью Docker-compose я могу запускать более 6 тыс. Контейнеров на одном хосте (с памятью 190 ГБ). образ контейнера меньше 10 МБ. Но из-за ограничений моста я разделил контейнеры на группы с несколькими службами, каждая служба имеет 1k контейнеров и отдельную сеть подсети.
docker-compose -f docker-compose.yml up --scale servicename=1000 -d
Но после достижения 6 КБ, хотя памяти все еще доступно около 60 ГБ, масштабирование прекращается, и объем памяти внезапно увеличивается. Чтобы помочь, команда докеров должна опубликовать контрольные цифры, но, к сожалению, они недоступны. Kubernetes, с другой стороны, четко публикует контрольную статистику о количестве модулей, рекомендованных для каждого узла.