docker-asignación de memoria de máquina

Tenemos una aplicación Rails bastante compleja que está a punto de implementarse en un único host físico. El host tiene 8 núcleos y 128 GB de RAM.

La aplicación está dockerizada, con 4 tipos de contenedores

  • Rails inc. servidor web
  • Postgres DB
  • Base de DATOS Redis
  • Contenedor de trabajadores (Resque)

Se espera que los contenedores Rails y Worker se escalen al incorporar más contenedores dentro de la máquina acoplable.

En el entorno de desarrollo, la memoria se asigna a toda la máquina acoplable:

docker-machine create -d virtualbox --virtualbox-memory 8192 default

¿Es posible controlar la cantidad de memoria a la que están limitados los contenedores individuales?

Por ejemplo, asigne 16 GB a Postgres, pero limite los contenedores de Rails a 4 GB. ¿Qué tipo de memoria mínima se debe asignar al host del servidor que ejecuta docker-machine, y es esto incluso posible?

EDITAR

Preguntas relacionadas:

¿Cómo manejar la administración de memoria de Docker?

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

EDICIÓN 2

Esta respuesta https://serverfault.com/a/645888/210752 indica que los contenedores asignarán memoria según sea necesario. Esta no ha sido mi experiencia en el entorno de desarrollo (por defecto, la máquina acoplable tenía asignados 2 GB).

Como se mencionó en la respuesta a la pregunta en su 2da Edición, los contenedores no son como las máquinas virtuales, ya que generalmente no reserva memoria para ellos como lo haría con las máquinas virtuales. Debido a que todos se ejecutan en el mismo sistema operativo, puede enviar memoria según sea necesario a diferentes procesos, como si no se estuvieran ejecutando en un contenedor. Es decir, la memoria se agrupa para todos los procesos, independientemente de los contenedores.

Lo que configuró en el ejemplo anterior con docker-machine fue el grupo de memoria total del host 'virtual'. En su caso de producción, serán los 128 GB completos (a menos que planee usar también docker-machine o VMs para segmentarlo).

Sin embargo, los contenedores también son una excelente manera de hacer uso de la cgroups funciones (grupos de control), que le permiten configurar la administración de recursos para todo un sistema de contenedores. Esto no le permite "reservar" memoria para un contenedor, sino que puede establecer límites superiores para toda la memoria de sus contenedores para que uno no consuma memoria que podría usarse para otros (en caso de una fuga o error, por ejemplo).

Con Docker, dependiendo del backend del contenedor utilizado, puede establecer límites de memoria básicos de la siguiente manera:

  • Al ejecutar el libcontainer predeterminado de docker, ejecutando los contenedores con el - m o -memoria opcion
  • Al ejecutar el proveedor LXC heredado, ejecute los contenedores con la opción LXC lxc.cgroup.cpuset.memoria=cantidad utilizada -- lxc-conf

Puede encontrar más información sobre el uso de cgroups en Docker aquí:https://www.cloudsigma.com/manage-docker-resources-with-cgroups/

El artículo también contiene diapositivas de una introducción a las funcionalidades de cgroups.

@ardochhigh Bueno, no puedo retractarme de mi voto cercano, o responder a tu pregunta, entonces… Disculpame por eso. Espero que alguien más pueda.

@HopelessN00b no hay problema … Creo que la pregunta no estaba redactada tan bien al principio. He trabajado mucho con infraestructura, pero Docker es nuevo para mí. He ofrecido una recompensa … que tengáis un gran día!