Usando o Comando Docker Compose Down de Forma Eficaz

DockerBeginner
Pratique Agora

Introdução

O comando docker-compose down é uma ferramenta essencial no gerenciamento de contêineres Docker. Este laboratório irá guiá-lo através do uso eficaz de docker-compose down para desligar e limpar adequadamente contêineres, redes, volumes e imagens 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

Antes de podermos usar o comando docker-compose down, precisamos garantir que o Docker Compose esteja devidamente instalado e criar um projeto de exemplo do Docker Compose para trabalhar.

Verificando a Instalação do Docker Compose

Vamos primeiro verificar se o Docker Compose foi instalado com sucesso durante a configuração:

docker-compose version

Você deve ver uma saída semelhante a esta:

Docker Compose version v2.18.1

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 Docker Compose

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

docker-compose up -d

A flag -d executa os contêineres em modo detached (em segundo plano). Você deve 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 Contêineres em Execução

Vamos verificar se nossos contêineres estão em execução:

docker-compose ps

Você deve 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ê deve ver a saída 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 no próximo passo.

Entendendo e Usando o Docker Compose Down

Agora que nossos serviços Docker Compose estão em execução, vamos aprender sobre o comando docker-compose down e como usá-lo de forma eficaz.

O que é Docker Compose Down?

O comando docker-compose down é usado para parar e remover contêineres, redes, volumes e imagens criados por 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ê deve 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:

  1. Para todos os contêineres em execução definidos em seu arquivo Docker Compose
  2. Remove todos os contêineres
  3. Remove a rede criada pelo Docker Compose

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

Verificando se os Recursos Foram Removidos

Vamos confirmar que os contêineres e a rede foram removidos:

docker-compose ps

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

Vamos verificar se os volumes ainda existem:

docker volume ls | grep docker-compose-demo

Você deve 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 em reinicializações de contêineres. Se você quisesse remover esses volumes também, precisaria usar opções adicionais, que abordaremos no próximo passo.

Iniciando os Serviços Novamente

Vamos iniciar nossos serviços novamente, pois precisaremos deles para o próximo passo:

docker-compose up -d

Você deve 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 de docker-compose down. No próximo passo, 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 dar a você mais controle sobre quais recursos são removidos. Neste passo, exploraremos essas opções.

Removendo Volumes

Como observamos no passo anterior, 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ê também deseja remover volumes, como ao fazer uma limpeza completa ou quando deseja redefinir os dados do seu aplicativo.

Para remover volumes junto com contêineres e redes, use a flag --volumes:

docker-compose down --volumes

Vamos tentar:

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

Você deve 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 deve ver nenhuma saída, confirmando que os volumes foram removidos.

Removendo Imagens

Outra opção útil é remover imagens ao derrubar 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 o início dos serviços e, em seguida, derrube-os com a flag --rmi:

docker-compose down --rmi local

Você deve 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 Contêineres Órfãos

Às vezes, você pode ter contêineres que foram criados pelo Docker Compose, mas não estão mais definidos em seu arquivo docker-compose.yml atual. Estes são chamados de "contêineres ó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 contêiner anterior em execução para o serviço db que não foi parado corretamente, ele agora seria considerado um órfão. Podemos remover esses órfãos usando a flag --remove-orphans:

docker-compose down --remove-orphans

Isso garante que quaisquer contêineres que foram criados por uma versão anterior do seu arquivo Docker Compose, mas 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á:

  1. Parar e remover todos os contêineres
  2. Remover todos os volumes nomeados
  3. Remover todas as imagens usadas por qualquer serviço
  4. Remover quaisquer contêineres órfãos

Isso é particularmente útil quando você deseja redefinir completamente seu ambiente ou quando está se preparando para fazer alterações significativas em 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 uma boa compreensão de como usar docker-compose down com várias opções para controlar quais recursos são removidos ao desligar seu ambiente Docker Compose.

Melhores Práticas e Cenários do Mundo Real

Agora que você entende o comando docker-compose down e suas opções, vamos explorar algumas 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. Vamos configurar um aplicativo web simples com um frontend, backend e 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ê deve ver a saída mostrando a criação de redes, volumes e contêineres para todos os três serviços.

Melhor Prática: Usando Ambientes

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

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 irá mesclar as configurações, aplicando as configurações específicas do desenvolvimento.

Para derrubar 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 contínua/implantação (CI/CD) ou fluxos de trabalho de desenvolvimento, é frequentemente útil ter um script de limpeza que remova 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 contêineres, redes, volumes e imagens
docker-compose down --volumes --rmi all --remove-orphans

## Remover volumes pendentes
echo "Removendo volumes pendentes..."
docker volume prune -f

## Remover imagens pendentes
echo "Removendo imagens pendentes..."
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 contêineres, redes e imagens.

Veja como você abordaria diferentes cenários:

  1. Remover apenas contêineres e redes (preservar volumes e imagens):

    docker-compose down
  2. Remover contêineres, redes e imagens (preservar volumes):

    docker-compose down --rmi all
  3. Remover contêineres, redes e volumes (preservar imagens):

    docker-compose down --volumes
  4. Remover apenas imagens locais (não puxadas de um registro):

    docker-compose down --rmi local

Ao remover seletivamente os recursos, 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 docker-compose down, é frequentemente útil monitorar o uso de recursos do Docker. Isso pode ajudá-lo a identificar quaisquer recursos que não estejam sendo limpos corretamente.

Aqui estão alguns comandos úteis:

  1. Listar todos os contêineres (incluindo os parados):

    docker ps -a
  2. Listar todas as redes:

    docker network ls
  3. Listar todos os volumes:

    docker volume ls
  4. Listar todas as imagens:

    docker image ls
  5. Obter informações em todo o sistema:

    docker system df

Vamos tentar 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 contêineres, imagens, volumes e a quantidade total de espaço usado.

Derrubando Nosso Ambiente Complexo

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

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

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

Ao seguir essas melhores práticas, você pode gerenciar efetivamente seus ambientes Docker e garantir o uso ideal de recursos.

Resumo

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

  1. Instalou o Docker Compose e criou um ambiente Docker Compose simples
  2. Aprendeu os conceitos básicos de docker-compose down e como ele remove contêineres 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 as melhores práticas para usar o Docker Compose em cenários do mundo real, incluindo:
    • Usar arquivos de configuração específicos do ambiente
    • Criar scripts de limpeza
    • Remover seletivamente recursos
    • Monitorar o 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 contêineres 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 contêineres que não estão mais definidos em 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.