Docker-alocação de memória da máquina

Temos um aplicativo Rails bastante complexo que está prestes a ser implantado em um único host físico. O host possui 8 núcleos e 128 GB de ram.

O aplicativo é dockerised, com 4 tipos de contêineres

  • Rails inc. servidor
  • Postgres DB
  • Redis DB
  • Recipiente do trabalhador (Resque)

Espera - se que os trilhos e contêineres de trabalho sejam dimensionados trazendo mais contêineres dentro da docker-machine.

No ambiente de desenvolvimento, a memória é alocada para toda a docker-machine:

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

É possível controlar a quantidade de memória a que os contêineres individuais estão limitados?

Por exemplo, aloque 16GB para Postgres, mas limite os contêineres Rails para 4GB. Que tipo de memória mínima deve ser alocada para o host do servidor executando o docker-machine,e isso é possível?

EDITAR

Perguntas relacionadas:

Como lidar com o gerenciamento de memória do Docker?

Docker + Apache, como funciona o uso de memória?

Editar 2

Resposta https://serverfault.com/a/645888/210752 indica que os contêineres alocarão memória conforme necessário. Esta não foi minha experiência no ambiente de desenvolvimento (por padrão, o docker-machine foi alocado 2GB).

Como mencionado na resposta à pergunta em sua 2ª edição, os contêineres não são como VMs, pois você geralmente não reserva memória para eles como faria com máquinas virtuais. Como todos eles são executados no mesmo sistema operacional, ele pode despachar a memória conforme necessário para processos diferentes, como se não estivessem sendo executados em um contêiner. Ou seja, a memória é agrupada para todos os processos, independentemente dos contêineres.

O que você definiu no exemplo acima com docker-machine foi o pool de memória total do host' virtual'. No seu caso de produção, serão 128 GB (a menos que você planeje também usar docker-machine ou VMs para segmentá-lo).

No entanto, os contêineres também são uma ótima maneira de fazer uso do kernel cgroups (grupos de Controle) recursos, que permite configurar o gerenciamento de recursos para um sistema de contêiner inteiro. Isso não permite que você' reserve ' a memória em um contêiner, mas, em vez disso, você pode definir limites superiores para toda a memória de seus contêineres para que não consuma memória que possa ser usada para outras pessoas (no caso de um vazamento ou bug, por exemplo).

Com o Docker, dependendo do back-end do contêiner usado, você pode definir limites básicos de memória da seguinte forma:

  • Ao executar o libcontainer padrão do docker, executando os contêineres com o -m ou -memoria Opcao
  • Ao executar o provedor LXC legado, executando os contêineres com a opção LXC lxc.cgroup.cpuset.memoria= quantidade usando -- lxc-conf

Você pode encontrar mais informações sobre o uso do cgroups no Docker aqui:https://www.cloudsigma.com/manage-docker-resources-with-cgroups/

O artigo também contém slides de uma introdução às funcionalidades do cgroups.

@ ardochhigh bem, não posso retirar meu voto próximo, ou responder sua pergunta, então… Sinto muito por isso. Espero que outra pessoa possa.

@ HopelessN00b não há problema … Acho que a questão não foi formulada tão bem no início. Eu trabalhei muito com infraestrutura, mas o Docker é novo para mim. Fiz uma recompensa … tenha um ótimo dia!