Docker Compose - Limites de memória

Docker Compose - Limites de memória
Docker Compose é um utilitário poderoso. Economiza tempo e reduz erros ao implantar seu aplicativo dockerizado. Geralmente, não é uma ótima idéia executar toda a pilha, incluindo o front -end, o servidor de banco de dados, etc. de dentro de um único contêiner um único.

Giramos diferentes contêineres para lidar com diferentes cargas de trabalho de um aplicativo e usamos o Docker compor para fazer isso facilmente. Cada carga de trabalho logicamente diferente é listada como um diferente serviço. Por exemplo, seu servidor HTTP de front -end será listado como um serviço de front -end, executando um apache ou uma imagem nginx como um contêiner.

Todos os serviços, suas necessidades de rede, requisitos de armazenamento etc. podem ser especificados em um Docker-Compose.Arquivo YML. Estaremos focados em especificar a utilização da memória aqui.

Pré -requisitos

Você precisaria das seguintes ferramentas em seu arsenal para acompanhar:

  1. Entendimento básico do Docker
  2. Docker para Windows ou Mac ou se você estiver executando Linux, Dockerce for Linux
  3. Docker compor binário (os usuários do Windows e Mac já terão isso instalado)

Estaremos aderindo à versão 2.4 para o nosso Docker-Compose.Arquivos YML como isso suporta a versão 17.12 e superior do motor do dock e superior. Poderíamos ter ido com a versão 3, o que é mais recente, mas não suporta a sintaxe da limitação de memória antiga. Se você tentar usar a sintaxe mais recente, ele insiste em usar o Docker no modo enxame, em vez disso. Então, para simplificar a matéria para usuários regulares do Docker, seguirei na versão 2.4

A maior parte do código funcionaria da mesma forma para a versão 3 e, onde haverá uma diferença, mencionarei a sintaxe mais recente para usuários do Swarm Docker.

Aplicação de amostra

Vamos tentar executar um serviço nginx simples na porta 80, usando primeiro a CLI e depois um simples docker-composição.yml. Na próxima seção, exploraremos suas limitações de memória e utilização e modificará nosso Docker-Compose.YML para ver como as limitações personalizadas são impostas.

Vamos iniciar um servidor nginx simples usando o Docker-cli:

$ Docker Run -D -Nome My -Nginx -p 80:80 nginx: mais recente

Você pode ver o servidor nginx funcionando visitando http: // localhost ou substituir lcoaLHost

Com o endereço IP do seu host do Docker. Este contêiner pode potencialmente utilizar toda a memória disponível no host do Docker (no nosso caso, é de cerca de 2 GB). Para verificar a utilização da memória, entre outras coisas, podemos usar o comando:

$ docker estatísticas my-nginx
Nome do ID do contêiner CPU % MEM Uso/Limite MEM % líquido E/S E/S PIDS
6EB0091C0CF2 My-Nginx 0.00% 2.133mib / 1.934GIB 0.11% 3.14kb / 2.13kb 0b / 0b 2

O uso/limite do MEM é em 2.133mib fora do total 1.934GIB. Vamos remover este contêiner e começar a escrever scripts do Docker-Compose.

$ docker pare my-nginx
$ docker rm my-nginx

Arquivo YML equivalente

O contêiner exato como acima pode ser criado se seguirmos estas etapas:

$ mkdir my-compose
$ cd my-compose
$ vim Docker-Compose.yml

Criamos um novo diretório vazio e criamos um arquivo docker-composição.YML nele. Quando executarmos o Docker-Compose Up deste diretório, ele procurará este arquivo específico (ignorando todo o resto) e criará nossa implantação de acordo. Adicione o seguinte conteúdo dentro disso .Arquivo YML.

Versão: '3'
Serviços:
my-nginx:
Imagem: Nginx: mais recente
Portas:
- "80:80"
$ Docker -Compõe Up -d

A bandeira -d é adicionada para que os recipientes recém -criados sejam executados em segundo plano. Caso contrário, o terminal se prenderá aos contêineres e começará a imprimir relatórios dele. Agora podemos ver as estatísticas dos recipientes recém -criados:

$ Docker Stats -Al
Nome do ID do contêiner CPU% MEM Uso/Limite MEM% líquido E/S E/S PIDS
5F8A1E2C08AC MY-COMPOSE_MY-NGINX_1 0.00% 2.25mib/1.934GIB 0.11% 1.65kb/0b 7.35MB/0B 2

Você notará que um contêiner semelhante como antes foi criado com limites de memória semelhantes e até utilização. Do mesmo diretório que contém o arquivo YML. Execute o seguinte comando para excluir o recém -criado contêiner, juntamente com a rede de pontes do cliente que foi criada.

$ docker-compor para baixo

Isso retornará o Docker a um estado limpo, com exceção de quaisquer volumes que foram criados (não criamos nenhum para que isso não seja uma preocupação.)

Limites de memória e reservas de memória

Limites de memória e reservas de memória são dois aspectos diferentes para garantir um bom funcionamento de seus aplicativos e o host do Docker que você está executando no topo.

Em termos gerais, o limite de memória impõe um limite superior à quantidade de memória que pode ser potencialmente usada por um contêiner do Docker. Por padrão, um contêiner do docker, como qualquer outro processo do sistema, pode usar toda a memória disponível do host do Docker. Isso pode causar a exceção fora da memória e seu sistema pode muito bem travar. Mesmo que nunca chegue a isso, ainda pode passar fome de outro processo (incluindo outros contêineres) de recursos valiosos, novamente prejudicando o desempenho. Os limites de memória garantem que os recipientes com fome de recursos não superem um certo limite. Isso limita o raio de explosão de um aplicativo mal escrito a alguns recipientes, não o host inteiro.

As reservas de memória, por outro lado, são menos rígidas. Quando o sistema está com pouca memória e tenta recuperar algumas delas. Ele tenta trazer o consumo de memória do contêiner no ou abaixo do limite de reserva. Se houver uma abundância de memória, no entanto, o aplicativo pode se expandir até o limite de memória de conjunto duro.

Para resumir:

  1. Limite de memória: um limite superior rigoroso para a quantidade de memória disponibilizada para um contêiner.
  2. Reserva de memória: isso deve ser definido como a quantidade mínima de memória que um aplicativo precisa para executar corretamente. Portanto, não trava nem se comporta quando o sistema está tentando recuperar parte da memória.

Se a reserva de memória for maior que o limite de memória, o limite de memória terá precedência.

Especificando limites de memória e reserva

Versão 2

Vamos voltar para o Docker-Compose.YML nós escrevemos anteriormente e adicionamos um limite de memória a ele. Altere a versão para 2.4 por razões discutidas na seção Pré -requisitos.

versão 2.4 '
Serviços:
my-nginx:
Imagem: Nginx: mais recente
Portas:
- "80:80"
Mem_limit: 300m

A última linha define o limite para o serviço my-nginx para 300mib. Você pode usar k para kib e g para gib e b para apenas bytes. No entanto, o número antes deve ser um número inteiro. Você não pode usar valores como 2.4m, você teria que usar 2400k em vez disso. Agora, se você corre:

$ Docker Stat -All
Nome do ID do contêiner CPU % MEM Uso/Limite MEM % líquido E/S E/S PIDS
44114D785D0A My-Compose_my-Nginx_1 0.00% 2.141mib/300mib 0.71% 1.16kb/0b 0b/0b 2

Você notará que o limite de memória está definido como 300 MIB. Definir a reserva de memória é igualmente fácil, basta adicionar uma linha mem_reservation: xxx no final.

versão 2.4 '
Serviços:
my-nginx:
Imagem: Nginx: mais recente
Portas:
- "80:80"
Mem_limit: 300m
MEM_RESERVATION: 100M

Versão 3 (opcional)

Para usar a versão três, você precisa executar o Docker no modo enxame. Para Windows e Mac, você pode ativá -lo usando o menu Docker Settings. Os usuários do Linux precisariam executar o Docker Swarm init. Mais informações sobre isso podem ser encontradas aqui. Não é um passo necessário e, se você não o habilitou, tudo bem também. Esta seção é para as pessoas executando no modo enxame e pode usar a versão mais recente.

Versão: '3'
Serviços:
my-nginx:
Imagem: Nginx: mais recente
Portas:
- "80:80"
implantar:
recursos:
limites:
Memória: 300m
Reservas:
Memória: 100m

Definimos tudo isso sob a opção de recursos. Limites e reservas tornam -se as principais chaves próprias e a memória é apenas um dos muitos recursos que estão sendo gerenciados aqui. CPU sendo mais um parâmetro importante.

Outras informações

Você pode aprender mais sobre o Docker-Compose a partir da documentação oficial vinculada aqui. Depois de obter a essência de como escrever um arquivo de composição, a documentação pode ajudá -lo com os específicos vários parâmetros.

Você não precisa saber tudo, basta procurar o que seu aplicativo exige e a referência o guiaria na implementação disso.