Docker + Apache, ¿cómo funciona el uso de la memoria?

Digamos que tengo un host docker configurado con 50 contenedores, cada uno de los cuales ejecuta un sitio servido por Apache.

Según tengo entendido, cada contenedor tendrá una instancia de Apache en ejecución y, por lo general, cada instancia de Apache usa ~250 mb por ram. Apache requiere unos pocos mb por proceso hijo.

¿Estoy en lo correcto al suponer que cada contenedor requerirá la memoria de una instancia completa de Apache? Eg. los 50 sitios requerirían 50 x ~300mb?

¿O Apache puede compartir algunas porciones de memoria entre contenedores para mejorar la eficiencia de la memoria?

Docker es adecuado para un alojamiento "masivo" eficiente (p. ej. un gran número de sitios, cada uno de los cuales requiere pocos recursos), donde cada sitio es un contenedor? ¿O solo sería factible tener un contenedor Apache que sirva a los 50 sitios?

docker proporciona aislamiento entre instancias de apache, lo que puede ser interesante por muchas razones (por ejemplo, si cada sitio web es administrado por un usuario diferente), también permite una fácil reubicación de instancias en otro servidor. Si no lo necesita, probablemente tendrá un mejor rendimiento con una sola instancia de Apache.

El aislamiento significa que el uso de recursos será bastante similar al uso de máquinas virtuales, excepto que no paga la sobrecarga de virtualización, la sobrecarga de partición de memoria y la sobrecarga del sistema operativo. Dicho esto, el uso de la memoria de Apache debe depender principalmente de la carga del servidor, por lo tanto, no debe esperar aumentar diez veces si divide un servidor grande en muchos pequeños. Además, como solo hay un núcleo, las cachés de disco se comparten entre contenedores, por lo que si su patrón de acceso al disco es similar entre dos instancias, obtiene un pequeño aumento de rendimiento.

Si entiendo su pregunta y la preocupación es qué memoria se puede compartir entre instancias de contenedor, entonces la respuesta a esa pregunta para las bibliotecas compartidas es que depende.

Citar:

https://groups.google.com/d/msg/docker-user/wCDC_sXzbks/i1gjlgQbxWEJ

El segundo beneficio es que la copia en escritura y el uso compartido de páginas se aplican a todos los procesos en el host, independientemente de los contenedores. Por ejemplo, 1000 contenedores que asignan el mismo archivo a la memoria (por ejemplo, una biblioteca o un archivo ejecutable) solo usarán el espacio de memoria una vez. Si escriben en la memoria, solo se copiarán las páginas en las que escriben. La advertencia para este segundo beneficio es que el sistema de archivos debe ser consciente de que sus contenedores están asignando el mismo archivo. Actualmente, ese es el caso para el controlador de almacenamiento aufs (que opera en la capa del sistema de archivos) pero no para el controlador lvm/devicemapper (que opera a nivel de bloque y, por lo tanto, no se beneficia ). Los controladores zfs y btrfs en desarrollo también se beneficiarán del almacenamiento en caché de páginas. Así que espero que en un escenario en el que ejecute miles de contenedores y asignan archivos grandes idénticos a la memoria, por lo que el controlador aufs le brindaría una mejor utilización de la memoria. Pero no hemos comparado esto.