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:
- Para todos os contêineres em execução definidos em seu arquivo Docker Compose
- Remove todos os contêineres
- 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á:
- Parar e remover todos os contêineres
- Remover todos os volumes nomeados
- Remover todas as imagens usadas por qualquer serviço
- 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:
Remover apenas contêineres e redes (preservar volumes e imagens):
docker-compose downRemover contêineres, redes e imagens (preservar volumes):
docker-compose down --rmi allRemover contêineres, redes e volumes (preservar imagens):
docker-compose down --volumesRemover 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:
Listar todos os contêineres (incluindo os parados):
docker ps -aListar todas as redes:
docker network lsListar todos os volumes:
docker volume lsListar todas as imagens:
docker image lsObter 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:
- Instalou o Docker Compose e criou um ambiente Docker Compose simples
- Aprendeu os conceitos básicos de
docker-compose downe como ele remove contêineres e redes por padrão - Explorou opções avançadas como
--volumes,--rmie--remove-orphanspara controlar exatamente quais recursos são removidos - 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 downremove contêineres e redes, mas mantém os volumes - Use
--volumespara remover volumes quando quiser redefinir seus dados - Use
--rmipara remover imagens quando precisar liberar espaço em disco - Use
--remove-orphanspara 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.



