Допустим, у меня есть докер-хост с 50 контейнерами, на каждом из которых запущен сайт, обслуживаемый Apache.
Насколько я понимаю, в каждом контейнере будет запущен экземпляр Apache, и обычно каждый экземпляр Apache использует ~ 250 МБ на оперативную память. Затем Apache требует несколько МБ на каждый дочерний процесс.
Правильно ли я предполагаю, что каждому контейнеру потребуется память полного экземпляра Apache? Например. на 50 сайтов потребуется 50 х ~ 300 мб?
Или Apache может разделять некоторые части памяти между контейнерами для повышения эффективности памяти?
Подходит ли Docker для эффективного «массового» хостинга (например, для большого количества сайтов, каждый из которых требует мало ресурсов), где каждый сайт является контейнером? Или было бы возможно иметь только один контейнер Apache, обслуживающий 50 сайтов?
docker обеспечивает изоляцию между экземплярами apache, что может быть интересно по многим причинам (например, если каждый веб-сайт администрируется другим пользователем), а также позволяет легко перемещать экземпляры на другой сервер. Если вам это не нужно, у вас, вероятно, будет лучшая производительность всего с одним экземпляром Apache.
Изоляция означает, что использование ресурсов будет очень похоже на использование виртуальных машин, за исключением того, что вы не оплачиваете накладные расходы виртуализации, накладные расходы на разделение памяти и накладные расходы операционной системы. При этом использование памяти Apache должно в основном зависеть от загрузки сервера, поэтому не следует ожидать увеличения в десять раз, если вы разделите большой сервер на множество мелких. Кроме того, поскольку существует только одно ядро, дисковые кеши используются совместно между контейнерами, поэтому, если ваш шаблон доступа к диску одинаков для двух экземпляров, вы получите небольшое повышение производительности.
Если я понимаю ваш вопрос и беспокоюсь о том, какая память используется для совместного использования между экземплярами контейнера, то ответ на этот вопрос для общих библиотек заключается в том, что это зависит.
Цитата:
https://groups.google.com/d/msg/docker-user/wCDC_sXzbks/i1gjlgQbxWEJ
Второе преимущество заключается в том, что копирование при записи и совместное использование страниц применяются ко всем процессам на хосте, независимо от контейнеров. Например, 1000 контейнеров, отображающих один и тот же файл в память (например, библиотеку или исполняемый файл), будут использовать пространство памяти только один раз. Если они пишут в память, будут скопированы только те страницы, на которые они пишут. Предостережение для этого второго преимущества заключается в том, что файловая система должна знать, что ваши контейнеры отображают один и тот же файл. В настоящее время это относится к драйверу хранилища aufs (который работает на уровне файловой системы), но не к драйверу lvm / devicemapper (который работает на уровне блоков и поэтому не приносит пользы). Разрабатываемые драйверы zfs и btrfs также выиграют от кэширования страниц. Поэтому я ожидаю, что в сценарии, в котором вы запускаете тысячи контейнеров, и они отображают большие идентичные файлы в память, в настоящее время драйвер aufs обеспечит более эффективное использование памяти. Но мы не тестировали это.