Docker: como limitar a memória de containers com Cgroups v2
Aprenda a controlar o consumo de memória RAM em containers Docker usando Cgroups v2. Evite que processos filhos derrubem o host com configurações de hard limits.
Resumo
- O Cgroups v2 é a interface moderna do kernel Linux para gerenciar recursos de grupos de processos.
- Definir limites rígidos impede que containers com vazamento de memória travem o sistema operacional principal.
- O Docker utiliza a flag memory para restringir a quantidade máxima de RAM que um container pode alocar.
- O monitoramento contínuo é essencial para garantir que as restrições impostas não degradem a performance da aplicação.
- Configurar limites de memória garante maior previsibilidade e estabilidade em ambientes de produção compartilhados.
Por que limitar o consumo de memória no Docker?
Quando rodamos containers, é muito comum esquecermos que, por padrão, eles possuem acesso a toda a memória RAM disponível no sistema operacional host. Se um processo dentro do container sofrer um estouro de memória — o famoso Out of Memory (OOM) — ele pode começar a consumir os recursos do host, causando travamentos generalizados. Na prática, isso significa que uma aplicação mal configurada pode derrubar todo o seu servidor, afetando outros containers e processos críticos. Para evitar esse cenário, precisamos definir limites rígidos.
O papel do Cgroups v2 no gerenciamento de recursos
O Cgroups (Control Groups) é uma funcionalidade do kernel Linux que permite organizar processos em hierarquias e limitar o uso de recursos como CPU, memória e IO. A versão 2, ou Cgroups v2, é a evolução unificada dessa tecnologia, oferecendo uma forma mais organizada e eficiente de gerenciar esses limites. Quando você define um limite no Docker, por baixo do capô, ele está instruindo o kernel através do Cgroups v2 para que esse grupo específico de processos não ultrapasse o teto definido, mantendo a saúde do sistema preservada.
Como definir hard limits no Docker
A forma mais direta de limitar o uso de RAM é utilizando a flag --memory (ou -m) durante a inicialização do container. Ao definir um valor, como 512MB, você está criando um teto intransponível para a aplicação. Se o processo tentar consumir além disso, o kernel intervirá imediatamente. É uma estratégia de contenção fundamental para manter a estabilidade, algo que complementa bem o monitoramento básico que aprendemos ao monitorar memória RAM no Linux pelo terminal com free e top.
Configuração prática passo a passo
Para limitar um container manualmente ou via Docker Compose, basta especificar o limite desejado seguindo os padrões de bytes ou unidades como 'm' (megabytes) ou 'g' (gigabytes). Veja como implementar na prática:
- Verifique se o seu host utiliza Cgroups v2 rodando o comando:
cat /sys/fs/cgroup/cgroup.controllers - Ao iniciar um container via linha de comando, adicione o parâmetro de memória:
docker run -d --name app-limitado --memory='512m' nginx - No Docker Compose, a configuração deve ficar dentro da seção de deploy ou na definição direta do serviço:
services: app: image: nginx deploy: resources: limits: memory: 512M
Considerações sobre performance e trade-offs
Ao limitar estritamente a memória, é importante entender que o container pode sofrer um encerramento forçado caso atinja o limite. Diferente de um ambiente sem restrições, aqui a aplicação precisa ser resiliente. O teste de carga é o seu melhor aliado para descobrir qual o consumo real necessário. Lembre-se também de que isolamento excessivo pode gerar gargalos se não houver um bom planejamento de rede e permissões, como discutido em nosso guia sobre permissões no Linux para corrigir erros com chmod e chown. O equilíbrio entre restrição e performance é a chave para um ambiente de produção robusto. Para aprofundar esses conceitos na prática em produção, confira também nossa análise técnica sobre Container travando? Como diagnosticar erro OOMKill no Kubernetes.
Conclusão
Limitar o consumo de memória de containers não é apenas uma boa prática, é um requisito de segurança para qualquer servidor. Ao utilizar o Cgroups v2, você ganha controle granular sobre o comportamento de suas aplicações, garantindo que um erro em um container não afete a estabilidade global do seu sistema Linux.
Invista tempo em configurar esses limites e realizar testes constantes. Um servidor bem gerenciado é aquele onde cada recurso é alocado de forma consciente, evitando surpresas em momentos de alta carga.