Docker + Apache, как работает использование памяти?

Допустим, у меня есть хост docker, настроенный на 50 контейнеров, в каждом из которых запущен сайт, обслуживаемый Apache.

Насколько я понимаю, в каждом контейнере будет запущен экземпляр Apache, и обычно каждый экземпляр Apache использует ~ 250 Мб оперативной памяти. Затем Apache требует несколько мбайт на дочерний процесс.

Правильно ли я предполагаю, что для каждого контейнера потребуется память полного экземпляра Apache? Напр.. для 50 сайтов потребуется 50 x ~ 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 обеспечит вам лучшее использование памяти. Но мы не проводили сравнительный анализ этого.