Docker Compose

Ambiente limpo:

$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
$ docker image ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

Edição do arquivo compose.yaml:

$ vim compose.yaml
services:
  web:
    image: marcelodpbarbieri/simulador-caos:v2
    ports:
      - 8080:3000
    restart: always
    healthcheck:
      disable: true
    cpuset: "0"
    memswap_limit: 512M
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: 512M
Explicação do comando

O trecho a seguir refere-se à definição de um serviço chamado web em um arquivo docker-compose.yaml. Vamos analisar cada parte em detalhes, explicando seu propósito e o impacto que as opções configuradas têm sobre a execução do container.

1. services

A chave services define os serviços que serão executados pelo docker-compose. Cada serviço é um container que será executado de acordo com a configuração definida no arquivo. No caso, o serviço web será baseado na imagem marcelodpbarbieri/simulador-caos:v2.

2. image: marcelodpbarbieri/simulador-caos:v2

A opção image especifica a imagem Docker que será usada para criar o container. No exemplo, a imagem marcelodpbarbieri/simulador-caos:v2 será baixada do Docker Hub (ou de um registro privado, se configurado) e usada para o serviço web. A tag v2 indica uma versão específica da imagem.

Exemplo de execução:

  • O container usará a versão v2 da imagem simulador-caos, publicada no repositório de marcelodpbarbieri.

3. ports: - 8080:3000

Aqui, a opção ports define o mapeamento de portas entre o host e o container. A sintaxe 8080:3000 significa que a porta 3000 do container será mapeada para a porta 8080 no host.

  • Entrada:

    • 8080:3000

  • Comportamento:

    • O serviço estará acessível na porta 8080 do host, mas dentro do container ele rodará na porta 3000.

Uso comum: Esse mapeamento permite que você exponha a aplicação dentro do container para o mundo externo via a porta 8080 do host.

4. restart: always

A política de reinício restart: always define que o container será reiniciado automaticamente se ele parar, independentemente da razão. Isso inclui falhas inesperadas e paradas manuais.

  • Comportamento:

    • O container será reiniciado sempre que for parado ou se houver falha, garantindo que ele permaneça ativo.

Uso comum: Esse comportamento é importante em ambientes de produção para garantir alta disponibilidade de serviços.

5. healthcheck: disable: true

A chave healthcheck normalmente é usada para verificar o estado de saúde do container, executando periodicamente comandos que determinam se o serviço está funcionando corretamente. No entanto, disable: true desativa essa verificação.

  • Comportamento:

    • O Docker não realizará nenhuma verificação de saúde do container, o que pode ser útil quando a aplicação tem seu próprio mecanismo de verificação ou não precisa de monitoramento constante.

Uso comum: Essa configuração é útil quando se quer evitar a sobrecarga de health checks, especialmente se o container já possui outras formas de monitoramento.

6. cpuset: "0"

O parâmetro cpuset (equivalente a cpuset-cpus na linha de comando Docker) define em quais CPUs o container pode ser executado. No exemplo, cpu-set: "0" limita a execução do container ao primeiro núcleo de CPU (núcleo 0).

  • Entrada:

    • cpuset: "0"

  • Comportamento:

    • O container só poderá utilizar o núcleo de CPU 0, o que isola sua carga de processamento para um núcleo específico.

Uso comum: Esse recurso é usado em ambientes onde se deseja controlar quais CPUs estão alocadas para determinados containers, evitando que eles interfiram com outros processos ou containers.

7. memswap_limit: 512M

Este parâmetro define o limite combinado de memória física (RAM) e swap que o container pode usar. O valor 512M significa que o container poderá usar até 512MB de RAM mais swap, se necessário.

  • Entrada:

    • memswap_limit: 512M

  • Comportamento:

    • O container terá um limite de 512MB de memória e swap combinados, o que ajuda a evitar que ele consuma muita memória do sistema.

Uso comum: Limitar o uso de memória é útil em sistemas com recursos limitados ou onde é necessário evitar que um único container cause esgotamento de memória no host.

8. deploy: resources: limits: cpus: "0.5" memory: 512M

A seção deploy é usada para definir configurações de deploy, particularmente no Docker Swarm, mas também pode ser aplicada localmente para limitar o uso de recursos de um container.

  • cpus: "0.5":

    • Define o limite de uso de CPU do container. Nesse exemplo, cpus: "0.5" limita o container a usar até 50% de uma CPU.

  • memory: 512M:

    • Define que o container pode usar no máximo 512MB de RAM.

Exemplo:

  • Entrada:

    • cpus: "0.5"

    • memory: 512M

  • Comportamento:

    • O container só poderá usar 50% de uma CPU e terá seu uso de memória limitado a 512MB.

Uso comum: Definir limites de recursos é fundamental em ambientes com múltiplos containers, garantindo que nenhum container utilize mais do que sua cota de CPU e memória, preservando a estabilidade do sistema como um todo.


Considerações Gerais

Este arquivo docker-compose.yaml configura um serviço com limites de CPU e memória cuidadosamente definidos, além de uma política de reinício para garantir alta disponibilidade. Os parâmetros de CPU e memória são usados para controlar o impacto que esse serviço terá no sistema host, garantindo que ele não consuma mais recursos do que o alocado.

Esse tipo de configuração é ideal em ambientes onde:

  • O uso de recursos precisa ser controlado rigidamente.

  • A aplicação precisa estar disponível continuamente, sem interrupções.

  • O monitoramento de saúde é desativado por motivos de otimização ou simplicidade, e outros mecanismos de monitoramento são usados.

Em resumo, essa configuração garante que o serviço web esteja isolado em termos de CPU e memória, com um comportamento previsível e controlado.

Subida do Docker Compose:

Container em execução:

Monitoramento:

Alto Consumo de CPU e Memória:

Last updated