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.
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
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 imagemsimulador-caos
, publicada no repositório demarcelodpbarbieri
.
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 porta3000
.
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:
deploy:
resources:
limits:
cpus: "0.5"
memory: 512M
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:
$ docker compose up -d
[+] Running 15/15
✔ web Pulled 37.9s
✔ 90e5e7d8b87a Pull complete 19.7s
✔ 27e1a8ca91d3 Pull complete 20.6s
✔ d3a767d1d12e Pull complete 23.8s
✔ 711be5dc5044 Pull complete 31.6s
✔ 22956530cc64 Pull complete 31.7s
✔ 8120d733fe37 Pull complete 34.4s
✔ 29e2cea0cf4c Pull complete 34.5s
✔ 2e099399c08b Pull complete 34.5s
✔ d2326862f18a Pull complete 34.5s
✔ 4a2fcba3cfd3 Pull complete 34.6s
✔ c4982a7d5cd5 Pull complete 35.7s
✔ 8f6c95ba1d1b Pull complete 35.9s
✔ b8ed20694ad9 Pull complete 35.9s
✔ 8152f71c04d1 Pull complete 35.9s
[+] Running 2/2
✔ Network marcelo_default Created 0.2s
✔ Container marcelo-web-1 Started 0.9s
Container em execução:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
393cd02545a7 marcelodpbarbieri/simulador-caos:v2 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->3000/tcp, :::8080->3000/tcp marcelo-web-1
Monitoramento:
$ htop
Alto Consumo de CPU e Memória:
Last updated