Ответ 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 минут