Docker
  • Introdução a Containeres e Docker
    • Introdução
    • O que é um container e suas vantanges
    • VM versus Container
    • Como funcionam os containers
    • Linux
    • Container sem Docker
      • cgroup
      • cpu.max
    • LxC
    • LxD
    • Containers versus Imagens
    • Arquitetura do Docker
    • Arquitetura do Docker mais a fundo
    • Projetos Open Source
  • Instalação do Docker
    • Linux
    • Windows
      • Docker Desktop
      • Rancher Desktop
      • WSL
    • Mac
    • Visual Studio Code
  • Primeiros Passos com Docker
    • Criação e listagem básica de um container
    • Interagindo com o container
    • Executando containers continuamente
      • nginx
      • docker container run
      • docker container run nginx
      • docker container run -d nginx
      • docker container exec
    • Como usar publish de porta
      • docker container stop
      • docker container start
      • docker container rm
      • docker container rm -f $(docker container ls -qa)
    • Containers e variáveis de ambiente
      • docker container run -e
  • Desafio
    • Desafio 01 - Banco de Dados Postgresql
    • Desafio 02 - Banco de Dados MySQL
    • Desafio 03 - Banco de Dados MongoDB
  • Executando a sua primeira aplicação em containers
    • Introdução
    • Preparando o container para a aplicação
    • Executando a aplicação
      • docker container cp
  • Primeiros Passos com Docker Images
    • Introdução
    • OverlayFS na Prática
    • Copy-on-Write
    • Formas de criar uma imagem Docker
    • Como funciona o Docker Commit
    • Docker Commit na Prática
      • docker commit
    • Entendendo melhor a sua imagem
      • docker image history
      • docker image inspect
    • Entrando mais a fundo na imagem
    • Como usar a imagem Docker no modo raiz
  • Avançando em imagens Docker com Dockerfile
    • O que é Dockerfile
    • Primeira Imagem com Dockerfile
      • docker image build
    • Como funciona a construção com Dockerfile
    • Possibilidades com Dockerfile
    • FROM
    • RUN
    • WORKDIR
    • COPY
    • ADD
    • LABEL
    • ENV
    • VOLUME
    • ARG
    • EXPOSE
    • USER
    • ENTRYPOINT
    • CMD
    • ENTRYPOINT versus CMD
    • Principais comandos com imagem
    • Imagem da aplicação com Dockerfile
    • Comparando Docker Commit com Dockerfile
  • Docker Registry
    • Introdução
    • Docker Hub
    • Sua imagem com o nome certo
    • Renomear imagens com Docker Tag
      • docker image tag
    • Enviando a sua primeira imagem para o Docker Hub
      • docker image push
      • docker image pull
  • Algumas boas práticas para construção de imagem
    • Um processo por container
    • Usar imagens confiáveis
    • Otimizar sempre a sua imagem
    • Uso inteligente das camadas
    • Dockerignore
  • Multistage Build
    • Introdução
    • Multistage build na prática
    • Target para fazer o build
      • docker image build --target
    • Imagem externa no Multistage build
    • Usar um estágio de build como base
  • Docker Volume
    • Introdução
      • docker volume
    • Bind Mount
    • Particularidades do Bind Mount
    • Bind Mount no Windows
    • Exemplo com Bind Mount
    • Docker Volume
      • docker volume create
      • docker volume inspect
      • docker volume ls
      • docker volume prune
      • docker volume rm
    • Onde ficam os arquivos do Docker volume?
    • Usando o volume no Dockerfile
    • Como fazer backup de um Docker Volume
    • Exemplo com Docker Volume
    • Storage tmpfs
    • Como criar algo funcional com o que aprendemos
  • Network
    • Introdução
    • Componentes do Docker Network
    • Rede Bridge na prática
      • docker network
      • docker network create
      • docker network inspect
      • docker network ls
      • docker network prune
      • docker network rm
    • Criando a sua rede bridge
      • docker network connect
      • docker network disconnect
    • Como funciona a rede bridge por dentro
    • Rede Host na prática
    • Rede none da prática
    • Como adicionar domínios no seu container
  • Aplicação 100% no Docker
    • Introdução
    • Criação da Imagem e Envio para o Docker Hub
    • Criação do Docker Network
    • Container do PostgreSQL
    • Container da Aplicação Web
    • Atualização da aplicação
  • Docker Compose
    • Introdução
      • docker compose
    • A evolução do docker compose
    • Criação básica de um Docker Compose
      • docker compose attach
      • docker compose build
      • docker compose config
      • docker compose cp
      • docker compose create
      • docker compose down
      • docker compose events
      • docker compose exec
      • docker compose images
      • docker compose kill
      • docker compose logs
      • docker compose ls
      • docker compose pause
      • docker compose port
      • docker compose ps
      • docker compose pull
      • docker compose push
      • docker compose restart
      • docker compose rm
      • docker compose run
      • docker compose scale
      • docker compose start
      • docker compose stats
      • docker compose stop
      • docker compose top
      • docker compose unpause
      • docker compose up
      • docker compose version
      • docker compose wait
      • docker compose watch
    • Variáveis de Ambiente
    • Volume Bind Mount
    • Docker Volume
    • Docker Network - Bridge
    • Docker Network - Host Driver e Add Host
    • Ordenando a execução dos containers
    • Compose com build de imagem
    • Como Parametrizar o Compose com Variáveis de Ambiente
    • Múltiplos Composes
    • Extends
    • Merge
    • Include
    • Profiles
    • Comandos importantes do Docker Compose
  • Troubleshooting
    • Introdução
    • Docker Info
    • Docker Events
    • Docker Logs
    • Docker Inspect
    • Docker Top
    • Docker Stats
    • Docker Exec
  • Resiliência e Gerenciamento de Recursos
    • Introdução
    • Docker Restart
      • Introdução
      • on-failure
      • unless-stopped
      • always
      • Docker Compose
    • Healthcheck
      • Introdução
      • Linha de Comando
      • Docker Compose
      • Direto na Imagem
    • Gerenciamento de Recurso
      • CPU
        • Como Gerenciar CPU
        • Prática
      • Memória
        • Como Gerenciar Memória
        • Prática
      • Docker Compose
  • Fazendo um ambiente mais seguro
    • Introdução
    • Docker Scout
      • Introdução
      • Verificação Simples de Imagem
      • Como adicionar um repositório
      • Primeira melhoria na imagem
  • BUSCA RÁPIDA
    • Referências
    • Comandos
      • docker commit
      • docker compose
      • docker container
      • docker image
      • docker network
      • docker volume
    • Dockerfile
Powered by GitBook
On this page
  • Monitoramento de Memória no Docker
  • 1. --memory
  • 2. --memory-swap
  • 3. --memory-swappiness
  • 4. --oom-kill-disable
  • 5. --oom-score-adj
  • 6. --kernel-memory
  • Considerações Gerais e Usos Comuns
  • Exemplo Completo de Comando
  1. Resiliência e Gerenciamento de Recursos
  2. Gerenciamento de Recurso
  3. Memória

Como Gerenciar Memória

PreviousMemóriaNextPrática

Last updated 8 months ago

Monitoramento de Memória no Docker

O Docker oferece uma série de opções para limitar e monitorar o uso de memória dos containers, garantindo que eles não consumam mais recursos do que o necessário. Isso é crucial em ambientes de produção e multi-tenant, onde o gerenciamento eficiente de recursos é uma prioridade. Abaixo estão detalhadas as principais opções relacionadas ao monitoramento de memória no Docker, com exemplos de entrada e saída e cenários comuns de uso.

1. --memory

O parâmetro --memory define o limite máximo de memória física (RAM) que o container pode utilizar. Se o container tentar usar mais do que esse limite, o kernel do Linux poderá encerrar os processos do container com um erro "out of memory" (OOM).

Exemplo:

docker run --memory="512m" <imagem>

Neste exemplo, o container está limitado a usar 512MB de memória RAM.

  • Entrada:

    • --memory="512m"

  • Saída:

    • O container só poderá usar até 512MB de memória. Se tentar ultrapassar esse valor, ele poderá ser finalizado pelo sistema.

Uso comum: Esse parâmetro é usado para garantir que um container não consuma memória excessiva em um host, especialmente em ambientes com muitos containers em execução.

2. --memory-swap

O parâmetro --memory-swap define o limite combinado de memória física (RAM) e swap que o container pode utilizar. O swap é uma área de disco usada para expandir a memória virtual, permitindo que o sistema armazene temporariamente partes da memória que não estão sendo ativamente usadas.

Exemplo:

docker run --memory="512m" --memory-swap="1g" <imagem>

Neste exemplo, o container pode usar até 512MB de RAM e até 1GB no total (RAM + swap).

  • Entrada:

    • --memory="512m"

    • --memory-swap="1g"

  • Saída:

    • O container poderá usar até 512MB de RAM e até 1GB de RAM + swap. O swap pode ser utilizado se a memória física se esgotar.

Uso comum: Em sistemas onde a memória RAM é limitada, mas o swap está disponível, esse parâmetro permite que o container use swap para evitar ser finalizado por falta de memória, embora o uso excessivo de swap possa afetar o desempenho.

3. --memory-swappiness

O parâmetro --memory-swappiness ajusta a propensão do kernel do Linux a trocar a memória de um container para o espaço de swap. Ele aceita um valor entre 0 e 100. Um valor de 0 desativa a troca para swap (priorizando o uso de RAM), enquanto 100 permite que o kernel troque o máximo possível de dados para o swap.

Exemplo:

docker run --memory="512m" --memory-swap="1g" --memory-swappiness="10" <imagem>

Aqui, o Docker ajusta o nível de swappiness para 10, o que significa que o kernel será bastante conservador em mover páginas de memória para o swap, priorizando o uso de RAM.

  • Entrada:

    • --memory="512m"

    • --memory-swap="1g"

    • --memory-swappiness="10"

  • Saída:

    • O container terá 512MB de RAM e 1GB de swap, com um baixo nível de swappiness, o que minimizará a troca de páginas de memória para o swap.

Uso comum: O ajuste de swappiness é útil em containers que executam workloads sensíveis à latência, onde o uso de swap pode prejudicar o desempenho da aplicação.

4. --oom-kill-disable

Esse parâmetro desativa o mecanismo de Out of Memory (OOM) do kernel, que finaliza processos do container quando ele ultrapassa seu limite de memória. No entanto, mesmo com essa opção ativada, o container não poderá usar mais memória do que o limite definido.

Exemplo:

docker run --memory="512m" --oom-kill-disable <imagem>

Neste exemplo, o OOM killer é desativado, o que significa que o container não será finalizado automaticamente ao atingir o limite de memória. No entanto, ele não poderá usar mais do que 512MB de memória.

  • Entrada:

    • --memory="512m"

    • --oom-kill-disable

  • Saída:

    • O container continuará funcionando, mas poderá ter suas operações bloqueadas ou degradadas caso atinja o limite de memória.

Uso comum: Esta opção é útil em cenários onde você prefere gerenciar manualmente o comportamento de falhas de memória, evitando o encerramento automático do container.

5. --oom-score-adj

O parâmetro --oom-score-adj ajusta a pontuação de um processo para o OOM killer, que decide quais processos serão finalizados quando o sistema estiver com pouca memória. Esse valor pode variar entre -1000 (imune ao OOM) e 1000 (alta probabilidade de ser finalizado).

Exemplo:

docker run --memory="512m" --oom-score-adj=500 <imagem>

Aqui, o container tem uma pontuação de 500, aumentando a chance de ser finalizado pelo OOM killer se o sistema estiver com pouca memória.

  • Entrada:

    • --oom-score-adj=500

  • Saída:

    • O container terá uma alta chance de ser finalizado pelo OOM killer se o sistema estiver em uma situação de pouca memória.

Uso comum: Essa opção é usada para ajustar a prioridade de finalização de containers em sistemas que rodam várias aplicações e onde o impacto da falta de memória precisa ser gerenciado.

6. --kernel-memory

Esse parâmetro define o limite de memória de kernel (memória usada pelo próprio kernel do sistema operacional para gerenciar recursos) que um container pode utilizar.

Exemplo:

docker run --memory="512m" --kernel-memory="50m" <imagem>

Nesse caso, o container está limitado a usar 512MB de RAM e 50MB de memória do kernel.

  • Entrada:

    • --kernel-memory="50m"

  • Saída:

    • O container só poderá utilizar até 50MB da memória do kernel. Caso ultrapasse esse valor, ele poderá ser finalizado.

Uso comum: Esse parâmetro é mais avançado e utilizado em cenários onde há uma preocupação com a memória do kernel sendo consumida excessivamente por um container, o que pode impactar a estabilidade do sistema.


Considerações Gerais e Usos Comuns

Esses parâmetros de controle de memória são cruciais em ambientes de produção, onde os recursos de memória precisam ser distribuídos com eficiência entre os containers para evitar esgotamentos de memória e maximizar o desempenho. Eles são especialmente úteis nos seguintes cenários:

  • Ambientes multi-tenant: onde vários containers compartilham os mesmos recursos de hardware, e é necessário garantir que nenhum container monopolize a memória.

  • Garantia de qualidade de serviço (QoS): onde diferentes containers têm diferentes necessidades de desempenho e sensibilidade a falta de memória.

  • Sistemas com restrições de memória: onde a quantidade total de memória RAM é limitada, mas o swap está disponível para uso temporário.

Exemplo Completo de Comando

docker run --memory="1g" \
           --memory-swap="2g" \
           --memory-swappiness="15" \
           --oom-kill-disable \
           <imagem>

Neste exemplo, o container pode usar até 1GB de RAM e até 2GB no total, com uma política conservadora de uso de swap (swappiness de 15) e o OOM killer desativado para evitar encerramentos automáticos.


Esses parâmetros permitem controlar o uso de memória de containers de forma granular, oferecendo flexibilidade e previsibilidade na execução das workloads.