Os contêineres Docker permitem executar aplicações em um ambiente isolado, mas sem um gerenciamento adequado de recursos, um único contêiner pode consumir CPU, memória ou outros recursos do host em excesso. Neste artigo, vamos abordar como limitar e controlar o uso de recursos pelos contêineres para garantir um funcionamento estável e previsível dos seus serviços.
Por que é importante limitar os recursos?
Por padrão, um contêiner pode utilizar todos os recursos disponíveis do host. Isso pode causar:
- Lentidão em outros processos;
- Funcionamento incorreto de múltiplos contêineres;
- Comportamento imprevisível do sistema.
O Docker permite definir limites para CPU, memória, disco e I/O, evitando esses problemas.
1. Limite de memória
Exemplo de comando:
docker run -m 512m --memory-swap 1g nginx
Explicação:
- -m 512m: limita a memória disponível ao contêiner para 512 megabytes.
- --memory-swap 1g: define o limite total de RAM + swap como 1 gigabyte. Se o contêiner usar mais de 512MB de RAM, ele poderá usar até 512MB adicionais de swap.
Importante: Um contêiner que exceder o limite de memória será encerrado com erro de “Out of Memory”.
2. Limite de CPU
Exemplo de comando:
docker run --cpus="1.5" nginx
Explicação:
- --cpus="1.5": o contêiner pode usar até 1,5 núcleos de CPU, útil em sistemas com múltiplos núcleos.
Método alternativo:
docker run --cpu-shares=512 nginx
- --cpu-shares: define a prioridade relativa da CPU. O valor padrão é 1024. Valores menores indicam menor prioridade.
3. Limite de I/O (operações de disco)
Exemplo de comando:
docker run --device-read-bps /dev/sda:1mb nginx
Explicação:
- --device-read-bps: limita a taxa de leitura do dispositivo /dev/sda para 1 megabyte por segundo.
Outras opções disponíveis:
- --device-write-bps
- >--device-read-iops
- --device-write-iops
4. Limite de processos (PIDs)
Essa opção ajuda a prevenir fork bombs e sobrecarga de processos:
docker run --pids-limit=100 nginx
O contêiner não poderá criar mais de 100 processos.
5. Usando limites no docker-compose.yml
É possível definir limites de recursos no docker-compose usando a diretiva deploy.resources.limits, por exemplo:
version: "3.9"
services:
web:
image: nginx
deploy:
resources:
limits:
cpus: '0.50'
memory: 256M
6. Monitoramento de recursos
Ferramentas úteis para monitorar o uso de recursos dos contêineres incluem:
- docker stats
- Prometheus
- Grafana
- cAdvisor
Conclusão
Limitar os recursos de contêineres é essencial para construir uma infraestrutura confiável e escalável. Utilize esses mecanismos para garantir que os contêineres não interfiram entre si e não sobrecarreguem o host. Isso é especialmente importante em ambientes de produção, onde previsibilidade e isolamento são fundamentais para a operação estável dos serviços.