6.1 Por que limitar os recursos dos containers
O Docker manda muito bem na hora de gerenciar os recursos dos containers, permitindo distribuir a potência do sistema de forma eficiente e evitar conflitos desnecessários entre eles. Isso é especialmente importante pra garantir que um app em um container não "acabe" com todos os recursos, deixando os outros serviços lentos. Limitar recursos como CPU e memória ajuda a evitar sobrecargas, manter a estabilidade do sistema e garantir que todos os apps funcionem de forma previsível. Nessa aula, vamos aprender como definir limites de uso de CPU e memória pra que o sistema continue produtivo mesmo em situações de alta carga.
Por que é importante limitar os recursos dos containers:
- estabilidade: evitar que um container consuma todos os recursos, fazendo com que outros containers ou até o próprio sistema fiquem lentos.
- eficiência: distribuir melhor os recursos entre os containers pra usar a potência do sistema de forma mais produtiva.
- proteção: limitar os recursos ajuda a prevenir problemas com containers que podem, acidentalmente ou intencionalmente, sobrecarregar o sistema.
6.2 Limites no uso de CPU
Docker oferece várias maneiras de limitar o uso de CPU
pelos containers.
Importante!
Aqui, CPU
significa um núcleo do processador, não o processador inteiro. Um processador quad-core terá 4 CPU
.
1. Limite de compartilhamento de CPU (--cpu-shares)
O parâmetro --cpu-shares
define o valor relativo de prioridade de uso de CPU pelo container. O valor padrão é 1024. Isso é um valor relativo, o que significa que um container com --cpu-shares=512
terá metade da prioridade de um container com --cpu-shares=1024
.
Exemplo de uso:
Neste exemplo, o container high_priority_container
terá uma prioridade maior na distribuição de CPU
em comparação com o low_priority_container
.
docker run -d --name low_priority_container --cpu-shares=512 nginx
docker run -d --name high_priority_container --cpu-shares=2048 nginx
2. Limite da quantidade de CPU (--cpus)
O parâmetro --cpus
define a quantidade exata de CPU
disponível para o container. Por exemplo, o valor 1.5 significa que o container pode usar 1.5 CPU
.
Exemplo de uso:
Este exemplo limita o container limited_cpu_container
a usar no máximo 1.5 CPU
.
docker run -d --name limited_cpu_container --cpus="1.5" nginx
3. Limite de uso de tempo de CPU
(--cpu-quota
e --cpu-period
)
Os parâmetros --cpu-quota
e --cpu-period
permitem configurar de forma mais precisa o uso de CPU
. --cpu-period
define o intervalo de tempo em microssegundos (padrão 100000), e --cpu-quota
define o tempo máximo permitido de uso de CPU
para esse período.
Exemplo de uso:
Neste exemplo, o container custom_cpu_quota_container
usará no máximo 50% de CPU
(25000/50000).
docker run -d --name custom_cpu_quota_container --cpu-period=50000 --cpu-quota=25000 nginx
6.3 Limites de uso de memória
Limitar a memória ajuda a controlar quanto de memória RAM um container pode usar. Isso ajuda a evitar situações em que um único container começa a consumir toda a memória, afetando outros processos e containers.
1. Limitação do volume máximo de memória (--memory)
O parâmetro --memory
define um limite superior de memória que o container pode usar. Se o container ultrapassar esse limite, o sistema vai finalizá-lo.
Exemplo de uso:
Este exemplo limita o container limited_memory_container
ao uso de no máximo 512 MB de memória RAM.
docker run -d --name limited_memory_container --memory="512m" nginx
2. Limitação do volume de swap de memória (--memory-swap)
O parâmetro --memory-swap
define um limite total para o uso de memória RAM e swap. Por exemplo, se --memory
estiver configurado em 512 MB e --memory-swap
em 1 GB, o container pode usar até 512 MB de RAM e mais 512 MB de swap.
Exemplo de uso:
Este exemplo limita o container swap_limited_container
ao uso de 512 MB de RAM e 512 MB de swap.
docker run -d --name swap_limited_container --memory="512m" --memory-swap="1g" nginx
3. Limitação de uso de memória sem swap (--memory-swap=-1)
Para proibir o uso de swap, configure o parâmetro --memory-swap
com o valor -1.
Exemplo de uso:
Este exemplo limita o container no_swap_container
a 512 MB de memória RAM sem a possibilidade de usar swap.
docker run -d --name no_swap_container --memory="512m" --memory-swap="-1" nginx
6.4 Cenários práticos
1. Executando tarefas de alta e baixa prioridade
Se em um servidor estão sendo executadas tanto tarefas críticas quanto secundárias, o parâmetro --cpu-shares
ajuda a distribuir os recursos de forma que as tarefas críticas recebam mais CPU
.
docker run -d --name high_priority_task --cpu-shares=2048 my_high_priority_image
docker run -d --name low_priority_task --cpu-shares=512 my_low_priority_image
2. Limitação de recursos para testes
Para testar aplicativos em condições de recursos limitados, você pode definir limites rígidos para CPU
e memória. Isso ajuda a entender como o aplicativo vai se comportar nessas condições.
docker run -d --name test_container --cpus="1" --memory="256m" my_test_image
3. Proteção contra esgotamento de recursos
Para evitar uma situação onde um container utilize todos os recursos disponíveis do sistema, você pode configurar limites de memória e CPU
para todos os containers.
docker run -d --name isolated_container --cpus="2" --memory="1g" my_app_image
GO TO FULL VERSION