Utilizando o comando Docker Compose Down de forma eficaz

DockerBeginner
Pratique Agora

Introdução

O comando Docker Compose Down é uma ferramenta essencial no gerenciamento de containers Docker. Este laboratório irá guiá-lo sobre como usar o docker-compose down de forma eficaz para encerrar e limpar corretamente containers, redes, volumes e imagens do Docker. Ao dominar este comando, você será capaz de manter um ambiente Docker limpo e otimizar seu fluxo de trabalho de desenvolvimento.

Instalando o Docker Compose e criando um projeto de exemplo

Nesta etapa, garantiremos que o Docker Compose esteja instalado corretamente e criaremos um projeto Docker Compose de exemplo para trabalhar.

Verificando a instalação do Docker Compose

Primeiro, vamos verificar se o Docker Compose foi instalado com sucesso durante a configuração:

docker-compose version

Você deverá ver uma saída semelhante a esta (os detalhes exatos da versão podem variar):

docker-compose version 1.29.2, build unknown

Criando um arquivo Docker Compose simples

Agora, vamos criar um arquivo Docker Compose simples que usaremos ao longo deste laboratório. Criaremos um arquivo chamado docker-compose.yml no diretório atual com um serviço web básico baseado em Nginx.

Use o editor nano para criar o arquivo:

cd ~/project/docker-compose-demo
nano docker-compose.yml

Copie e cole o seguinte conteúdo no editor:

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - web_data:/usr/share/nginx/html

  db:
    image: redis:latest
    volumes:
      - db_data:/data

volumes:
  web_data:
  db_data:

Salve o arquivo pressionando Ctrl+O, depois Enter, e saia com Ctrl+X.

Este arquivo Docker Compose define:

  • Um serviço web usando a imagem Nginx
  • Um serviço de banco de dados usando Redis
  • Dois volumes nomeados para armazenamento persistente de dados

Iniciando os serviços do Docker Compose

Vamos iniciar os serviços definidos em nosso arquivo Docker Compose:

docker-compose up -d

A flag -d executa os containers em modo "detached" (em segundo plano). Você deverá ver uma saída semelhante a:

Creating network "docker-compose-demo_default" with the default driver
Creating volume "docker-compose-demo_web_data" with default driver
Creating volume "docker-compose-demo_db_data" with default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1  ... done

Verificando os containers em execução

Vamos verificar se nossos containers estão em execução:

docker-compose ps

Você deverá ver uma saída mostrando que ambos os serviços estão ativos e em execução:

        Name                       Command               State          Ports
-----------------------------------------------------------------------------------
docker-compose-demo_db_1    docker-entrypoint.sh redis ...   Up      6379/tcp
docker-compose-demo_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8080->80/tcp

Você também pode verificar se o servidor web Nginx está acessível usando curl:

curl http://localhost:8080

Você deverá ver o HTML da página de boas-vindas padrão do Nginx.

Agora que temos nossos serviços ativos e em execução, estamos prontos para aprender sobre o comando docker-compose down na próxima etapa.

Entendendo e usando o Docker Compose Down

Nesta etapa, agora que nossos serviços do Docker Compose estão em execução, aprenderemos sobre o comando docker-compose down e como usá-lo de forma eficaz.

O que é o Docker Compose Down?

O comando docker-compose down é usado para parar e remover containers, redes, volumes e imagens criados pelo docker-compose up. Este comando é essencial para limpar recursos quando você não precisa mais deles ou quando deseja redefinir seu ambiente.

Uso básico do Docker Compose Down

A forma mais simples do comando é:

docker-compose down

Vamos executar este comando e observar o que acontece:

cd ~/project/docker-compose-demo
docker-compose down

Você deverá ver uma saída semelhante a:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default

Observe que o comando:

  • Para todos os containers em execução definidos no seu arquivo Docker Compose
  • Remove todos os containers
  • Remove a rede criada pelo Docker Compose

No entanto, ele não remove os volumes por padrão. Este é um ponto importante a entender: os volumes persistem além do ciclo de vida dos containers para preservar seus dados.

Verificando se os recursos foram removidos

Vamos confirmar que os containers e a rede foram removidos:

docker-compose ps

Você deverá ver uma lista vazia, indicando que não há containers em execução deste projeto Docker Compose.

Vamos verificar se os volumes ainda existem:

docker volume ls | grep docker-compose-demo

Você verá que os volumes ainda existem:

local     docker-compose-demo_db_data
local     docker-compose-demo_web_data

Este comportamento padrão é importante porque preserva seus dados entre reinicializações de containers. Se você quisesse remover esses volumes também, precisaria usar opções adicionais, que abordaremos na próxima etapa.

Iniciando os serviços novamente

Vamos iniciar nossos serviços novamente, pois precisaremos deles para a próxima etapa:

docker-compose up -d

Você deverá ver:

Creating network "docker-compose-demo_default" with the default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1  ... done

Observe que o Docker Compose não precisou recriar os volumes, pois eles já existem.

Agora você entende o uso básico do docker-compose down. Na próxima etapa, exploraremos opções mais avançadas para controlar exatamente quais recursos são removidos.

Usando o Docker Compose Down com opções avançadas

O comando básico docker-compose down é útil, mas o Docker Compose oferece opções adicionais para lhe dar mais controle sobre quais recursos são removidos. Nesta etapa, exploraremos essas opções.

Removendo volumes

Como observamos na etapa anterior, o docker-compose down não remove volumes por padrão. Este é um recurso de segurança para evitar a perda acidental de dados. No entanto, há momentos em que você deseja remover volumes também, como quando está fazendo uma limpeza completa ou quando deseja redefinir os dados da sua aplicação.

Para remover volumes juntamente com containers e redes, use a flag --volumes:

docker-compose down --volumes

Vamos testar:

cd ~/project/docker-compose-demo
docker-compose down --volumes

Você deverá ver uma saída semelhante a:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default
Removing volume docker-compose-demo_web_data
Removing volume docker-compose-demo_db_data

Observe que, desta vez, os volumes também são removidos.

Vamos verificar se os volumes foram removidos:

docker volume ls | grep docker-compose-demo

Você não deverá ver nenhuma saída, confirmando que os volumes foram removidos.

Removendo imagens

Outra opção útil é remover imagens ao encerrar seu ambiente Docker Compose. Isso pode ser feito com a flag --rmi, que aceita diferentes valores:

  • --rmi all: Remove todas as imagens usadas por qualquer serviço
  • --rmi local: Remove apenas imagens que não possuem uma tag personalizada

Vamos iniciar nossos serviços novamente e, em seguida, usar a flag --rmi:

docker-compose up -d

Aguarde os serviços iniciarem e, em seguida, encerre-os com a flag --rmi:

docker-compose down --rmi local

Você deverá ver uma saída semelhante a:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default
Removing image redis:latest
Removing image nginx:latest

Desta vez, as imagens também são removidas.

Removendo containers órfãos

Às vezes, você pode ter containers que foram criados pelo Docker Compose, mas que não estão mais definidos no seu arquivo docker-compose.yml atual. Eles são chamados de "containers órfãos".

Para demonstrar isso, vamos modificar nosso arquivo Docker Compose para remover o serviço db:

nano docker-compose.yml

Edite o arquivo para remover o serviço db e seu volume:

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - web_data:/usr/share/nginx/html

volumes:
  web_data:

Salve e saia do editor (Ctrl+O, Enter, Ctrl+X).

Agora, vamos iniciar nossos serviços novamente com o arquivo atualizado:

docker-compose up -d

Se tivéssemos um container anterior em execução para o serviço db que não foi parado corretamente, ele agora seria considerado um órfão. Podemos remover tais órfãos usando a flag --remove-orphans:

docker-compose down --remove-orphans

Isso garante que quaisquer containers criados por uma versão anterior do seu arquivo Docker Compose, mas que não estão mais definidos, também sejam removidos.

Combinando opções

Você também pode combinar essas opções para uma limpeza completa:

docker-compose down --volumes --rmi all --remove-orphans

Este comando irá:

  • Parar e remover todos os containers
  • Remover todos os volumes nomeados
  • Remover todas as imagens usadas por qualquer serviço
  • Remover quaisquer containers órfãos

Isso é particularmente útil quando você deseja redefinir completamente seu ambiente ou quando está se preparando para fazer alterações significativas na sua configuração do Docker Compose.

Explorando opções adicionais

Você pode ver todas as opções disponíveis para o comando docker-compose down usando a flag de ajuda:

docker-compose down --help

Reserve um momento para revisar as opções disponíveis e suas descrições.

Agora você tem um bom entendimento de como usar o docker-compose down com várias opções para controlar quais recursos são removidos ao encerrar seu ambiente Docker Compose.

Melhores práticas e cenários do mundo real

Nesta etapa, agora que você entende o comando docker-compose down e suas opções, exploraremos as melhores práticas e cenários do mundo real para usar este comando de forma eficaz.

Criando um ambiente Docker Compose mais complexo

Para demonstrar melhor o uso no mundo real, vamos criar um ambiente Docker Compose mais complexo. Configuraremos uma aplicação web simples com um frontend, um backend e um banco de dados.

cd ~/project/docker-compose-demo
nano docker-compose.yml

Substitua o conteúdo por:

version: "3"

services:
  frontend:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - frontend_data:/usr/share/nginx/html
    networks:
      - app_network

  backend:
    image: node:14-alpine
    command: sh -c "echo 'Backend service running' && sleep infinity"
    volumes:
      - backend_data:/app
    networks:
      - app_network
      - db_network

  database:
    image: postgres:13-alpine
    environment:
      POSTGRES_PASSWORD: example
      POSTGRES_USER: user
      POSTGRES_DB: appdb
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - db_network

networks:
  app_network:
  db_network:

volumes:
  frontend_data:
  backend_data:
  db_data:

Salve e saia do editor.

Vamos iniciar este ambiente mais complexo:

docker-compose up -d

Você deverá ver uma saída mostrando a criação de redes, volumes e containers para todos os três serviços.

Melhor prática: Usando ambientes

Em cenários do mundo real, você pode ter ambientes diferentes como desenvolvimento, teste e produção. O Docker Compose permite que você use arquivos de configuração diferentes para ambientes diferentes.

Crie um arquivo para o ambiente de desenvolvimento:

nano docker-compose.dev.yml

Adicione o seguinte conteúdo:

version: "3"

services:
  frontend:
    ports:
      - "8081:80"
    environment:
      NODE_ENV: development

  backend:
    environment:
      NODE_ENV: development
      DEBUG: "true"

  database:
    ports:
      - "5432:5432"

Salve e saia do editor.

Para usar este arquivo em combinação com o arquivo base, você pode usar a flag -f:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

Isso mesclará as configurações, aplicando as definições específicas de desenvolvimento.

Para encerrar este ambiente, você usaria:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml down

Melhor prática: Usando um script de limpeza

Em pipelines de integração/implantação contínua (CI/CD) ou fluxos de trabalho de desenvolvimento, é frequentemente útil ter um script de limpeza que remove todos os recursos do Docker. Vamos criar um script de limpeza simples:

nano cleanup.sh

Adicione o seguinte conteúdo:

#!/bin/bash

echo "Limpando o ambiente Docker..."

## Parar e remover containers, redes, volumes e imagens
docker-compose down --volumes --rmi all --remove-orphans

## Remover volumes órfãos (dangling)
echo "Removendo volumes órfãos..."
docker volume prune -f

## Remover imagens órfãs (dangling)
echo "Removendo imagens órfãs..."
docker image prune -f

echo "Limpeza concluída!"

Salve e saia do editor.

Torne o script executável:

chmod +x cleanup.sh

Agora você pode executar este script sempre que precisar fazer uma limpeza completa:

./cleanup.sh

Melhor prática: Remoção seletiva de recursos

Às vezes, você pode querer remover apenas recursos específicos. Por exemplo, você pode querer manter seus volumes (para preservar dados), mas remover containers, redes e imagens.

Veja como você abordaria diferentes cenários:

Remover apenas containers e redes (preservar volumes e imagens):

docker-compose down

Remover containers, redes e imagens (preservar volumes):

docker-compose down --rmi all

Remover containers, redes e volumes (preservar imagens):

docker-compose down --volumes

Remover apenas imagens locais (não baixadas de um registro):

docker-compose down --rmi local

Ao remover recursos seletivamente, você pode otimizar seu fluxo de trabalho com base em suas necessidades específicas.

Melhor prática: Monitorando o uso de recursos

Antes e depois de executar o docker-compose down, é frequentemente útil monitorar o uso de recursos do Docker. Isso pode ajudá-lo a identificar quaisquer recursos que não estão sendo limpos corretamente.

Aqui estão alguns comandos úteis:

Listar todos os containers (incluindo os parados):

docker ps -a

Listar todas as redes:

docker network ls

Listar todos os volumes:

docker volume ls

Listar todas as imagens:

docker image ls

Obter informações de todo o sistema:

docker system df

Vamos testar o último comando para ver nosso uso atual de recursos:

docker system df

Você verá um resumo do uso de recursos do Docker, incluindo o número de containers, imagens, volumes e a quantidade total de espaço utilizado.

Encerrando nosso ambiente complexo

Agora, vamos encerrar nosso ambiente complexo e remover todos os recursos associados:

docker-compose down --volumes --rmi all --remove-orphans

Isso irá parar e remover todos os containers, redes, volumes e imagens associados ao nosso projeto Docker Compose.

Seguindo essas melhores práticas, você pode gerenciar seus ambientes Docker de forma eficaz e garantir o uso ideal dos recursos.

Resumo

Neste laboratório, você aprendeu como usar efetivamente o comando docker-compose down para gerenciar seus containers e recursos Docker. Aqui está um resumo do que você realizou:

  1. Instalou o Docker Compose e criou um ambiente Docker Compose simples
  2. Aprendeu o básico do docker-compose down e como ele remove containers e redes por padrão
  3. Explorou opções avançadas como --volumes, --rmi e --remove-orphans para controlar exatamente quais recursos são removidos
  4. Implementou melhores práticas para usar o Docker Compose em cenários do mundo real, incluindo:
    • Uso de arquivos de configuração específicos para cada ambiente
    • Criação de scripts de limpeza
    • Remoção seletiva de recursos
    • Monitoramento do uso de recursos

Ao dominar o comando docker-compose down, você agora tem o conhecimento para manter um ambiente Docker limpo, evitar vazamentos de recursos e otimizar seu fluxo de trabalho de desenvolvimento.

Lembre-se destes pontos-chave:

  • O comando básico docker-compose down remove containers e redes, mas mantém os volumes
  • Use --volumes para remover volumes quando quiser redefinir seus dados
  • Use --rmi para remover imagens quando precisar liberar espaço em disco
  • Use --remove-orphans para limpar containers que não estão mais definidos no seu arquivo Compose
  • Combine essas opções para uma limpeza completa quando necessário

Com essas habilidades, você está agora mais bem equipado para gerenciar ambientes Docker Compose de forma eficiente em seus projetos.