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:
- Instalou o Docker Compose e criou um ambiente Docker Compose simples
- Aprendeu o básico do
docker-compose downe como ele remove containers e redes por padrão - Explorou opções avançadas como
--volumes,--rmie--remove-orphanspara controlar exatamente quais recursos são removidos - 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 downremove containers 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 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.



