Programa
Interromper os contêineres um a um pode tornar o fluxo de trabalho de desenvolvimento mais lento e levar a erros ao fazer malabarismos com microsserviços ou aplicativos com vários contêineres.
Neste guia, abordarei vários métodos para ajudar você a encerrar todos os contêineres em execução.
Ao final deste tutorial, você será capaz de:
- Entenda como o Docker lida com sinais e períodos de carência
- Pare todos os contêineres usando técnicas e filtros simples da CLI
- Aproveite o Docker Compose e os aliases personalizados para simplificar os fluxos de trabalho
Entendendo o encerramento de contêineres do Docker
Antes de interromper os contêineres em massa, é útil entendercomo o Docker orquestra os desligamentos nos bastidores.
Gerenciamento de processos baseado em sinais
O Docker usa os sinais do Unix para solicitar desligamentos graciosos antes de forçar o encerramento. O comportamento padrão do comando docker stop
é:
- Envie
SIGTERM
para o processo principal do contêiner. - Aguarde até 10 segundos (configurável com
-t
/--time
). - Envie
SIGKILL
se o processo não tiver sido encerrado.
- SIGTERM: Solicite educadamente que o processo seja limpo e saia.
- Período de carência: Dá aos aplicativos tempo para limpar os registros, fechar conexões ou salvar o estado.
- SIGKILL: Força o encerramento imediato de qualquer processo que não esteja respondendo.
Mecânica da interface de linha de comando (CLI)
Por padrão, o site docker stop
lida com um contêiner de cada vez. Você pode estendê-lo para interromper vários contêineres usando os recursos do shell.
# Stop a single container named my_container
docker stop my_container
Isso envia SIGTERM para my_container
e aguarda os 10 segundos padrão antes de emitir SIGKILL, se necessário.
# Stop all running containers at once
docker stop $(docker ps -q)
Aqui, docker ps -q
lista os IDs de todos os contêineres em execução; esses IDs são passados para docker stop
, que encerra os contêineres sequencialmente.
Captura de tela de um terminal mostrando a saída docker ps -q
canalizada para docker stop
Para obter uma compreensão mais detalhada desses conceitos, considere explorar os conceitos de contêineres e virtualização.
Comparando o docker stop e o docker kill
Escolher entre uma rescisão graciosa e forçada ajuda você a evitar consequências indesejadas.
Rescisão graciosa vs. imediata
Comando |
Sinal(is) |
Comportamento |
Caso de uso |
parada da doca |
SIGTERM → SIGKILL após o tempo limite |
Encerramento gracioso com tempo de limpeza |
Manutenção ou atualizações de rotina |
docker kill |
SIGKILL |
Rescisão imediata |
Remediação de emergência de contêineres suspensos |
Personalização do sinal
Ambos os comandos suportam um sinalizador --signal
para substituir os padrões:
# Send SIGINT instead of SIGTERM
docker stop --signal=SIGINT my_container
O acima exposto permite que os processos façam o rastreamento de SIGINT
para limpeza personalizada.
# Kill all containers with SIGUSR1
docker kill --signal=SIGUSR1 $(docker ps -q)
Como visto acima, você pode usar sinais personalizados quando seu aplicativo implementar ganchos de desligamento específicos.
Estratégias avançadas de parada de contêineres
A filtragem e a automação da parada de contêineres permitem fluxos de trabalho de DevOps mais precisos, especialmente em ambientes de grande escala.
Depois de entender os conceitos básicos, você pode ajustar quais contêineres você interrompe e como automatiza o processo.
Terminação do contêiner filtrado
Os filtros permitem que você direcione os contêineres por atributos como nome da imagem, status ou rótulos:
# Stop containers running the my_image:latest image
docker stop $(docker ps --filter "ancestor=my_image:latest" -q)
O comando acima interrompe apenas os contêineres com base em my_image:latest
, fornecendo controle direcionado em projetos de vários serviços.
Casos de uso:
- Interromper os contêineres de teste por tag de imagem (
--filter "ancestor=test:latest"
) - Pare os contêineres por rótulo (
--filter "label=env=dev"
)
Captura de tela do terminal do uso do docker ps --filter
Limpeza automatizada com o Docker Compose
Se os seus serviços forem definidos em um arquivo docker-compose.yml
, um único comando interromperá todos os contêineres relacionados:
docker-compose stop
Isso respeita suas dependências de serviço e os tempos limite configurados para um desligamento limpo.
Para obter técnicas mais avançadas, você pode considerar o curso Intermediate Docker.
Otimização do fluxo de trabalho orientada por alias
Para tarefas repetitivas, os aliases de shell reduzem a digitação e a troca de contexto:
# Add this to ~/.bashrc or ~/.zshrc
alias ds='docker stop $(docker ps -q)'
Quando você recarregar o shell, a execução do ds
interrompe todos os contêineres com um único toque de tecla - ideal para uma limpeza rápida.
Usando o alias 'ds' para interromper todos os contêineres em execução no Ubuntu WSL
Práticas recomendadas operacionais
Implemente rotinas de desligamento seguro e limpeza regular para manter seu ambiente estável e com bom desempenho.
- Implemente manipuladores de sinal no código do aplicativo para fechar conexões e liberar registros.
- Reserve o site
docker kill
para intervenções emergenciais; evite inconsistências de dados. - Ajuste os períodos de carência (
-t
/--time
) com base nas necessidades de limpeza do seu aplicativo. - Automatize a limpeza pós-desligamento com comandos como
docker system prune
, conforme detalhado em Docker Prune: Um guia completo com exemplos práticos. - Registre eventos de desligamento (carimbos de data e hora e códigos de saída) para diagnosticar problemas de encerramento.
Solução de problemas comuns
Até mesmo os comandos simples podem apresentar problemas - veja aqui como resolvê-los.
Processos zumbis e volumes órfãos
O encerramento forçado pode deixar para trás processos obsoletos ou volumes órfãos, consumindo recursos do host e espaço em disco. Para limpar:
# Remove dangling volumes
docker volume prune
Isso exclui todos os volumes não referenciados por nenhum contêiner.
Verifique se há processos persistentes do daemon do Docker:
ps aux | grep dockerd
Elimine manualmente todos os processos filhos perdidos do dockerd
se eles persistirem.
Caso do mundo real: Em um projeto, usei o docker kill
em um contêiner de banco de dados quando uma migração foi interrompida. A eliminação abrupta impediu que o banco de dados liberasse os logs de transação, corrompendo as tabelas do InnoDB. Tivemos que restaurar a partir de backups e reproduzir binlogs, o que custou mais de 30 minutos de tempo de inatividade. Para evitar isso, prefira o site docker stop
com um tempo limite estendido ou adicione manipuladores SIGTERM
adequados em seu aplicativo.
Erros de permissão negada
A execução de comandos do Docker sem os privilégios adequados geralmente gera erros:
- Prefixe os comandos com
sudo
ou execute-os como um usuário do grupodocker
. - Adicione seu usuário ao grupo
docker
e faça o login novamente:
sudo usermod -aG docker $USER
Depois de fazer logout e login novamente, você pode executar comandos do Docker sem sudo
. Em um ambiente de CI, certifique-se de que o usuário executor seja membro do grupo Docker para evitar falhas no pipeline.
Considerações específicas do Windows
No Windows PowerShell, coloque os subcomandos entre parênteses e execute como Administrador:
docker stop (docker ps -q)
Iniciar o PowerShell com direitos elevados evita problemas de firewall ou de controle de acesso. Se você vir erros de handshake TLS, verifique se a configuração do daemon do Docker Desktop corresponde ao seu ambiente do PowerShell.
Conclusão
Ao interromper todos os contêineres do Docker de forma eficiente, você economiza tempo, conserva recursos e minimiza o erro humano no fluxo de trabalho de desenvolvimento. Você pode manter um ambiente limpo e previsível compreendendo o tratamento de sinais do Docker, aproveitando os filtros da CLI, usando o Docker Compose e criando aliases simples.
Explore o programa Containerization and Virtualization with Docker and Kubernetes ou o curso Intermediate Docker para aprofundar sua experiência em conteinerização.
Feliz conteinerização - e um brinde aos fluxos de trabalho limpos e eficientes do Docker!
Domine o Docker e o Kubernetes
Perguntas frequentes
Qual é o código de saída que o docker stop retorna?
Em caso de sucesso, docker stop
retorna 0. Um código de saída diferente de zero indica que um ou mais contêineres não conseguiram parar.
Posso visualizar quais contêineres serão interrompidos antes de executar o comando?
Yes-run docker ps
ou docker ps -q
para listar os contêineres em execução e verificar IDs ou nomes antes de executá-los docker stop
.
Como as políticas de reinicialização afetam os contêineres parados?
Os contêineres com uma política de reinicialização, como always
, serão reiniciados automaticamente após a parada. Remova ou modifique a política com docker update --restart=no
se você quiser que eles permaneçam parados.
Existe uma maneira de interromper os contêineres por rede ou volume?
Embora o Docker não filtre diretamente por rede ou volume em docker stop
você pode combinar docker ps --filter "network="
ou docker ps --filter "volume="
com a substituição de comandos.
Como posso integrar o docker stop em um pipeline de CI/CD?
Incorpore o comando stop em seus scripts de compilação ou trabalhos de CI - use sinalizadores como --signal
e filtros para desligamentos direcionados e, em seguida, faça o acompanhamento com comandos de limpeza (docker system prune
) no mesmo pipeline.
Posso reiniciar todos os contêineres parados depois disso?
Sim, use docker start $(docker ps -a -q)
para reiniciar todos os contêineres, inclusive os que estavam parados anteriormente.
Você conseguirá remover todos os contêineres?
Não, interromper os contêineres não os exclui. Eles permanecem em seu sistema até que você os remova com docker rm
.
Como posso automatizar a parada diária dos contêineres?
Use um trabalho cron com o comando docker stop $(docker ps -q)
para agendar a interrupção automática.
A parada da plataforma afeta volumes ou redes?
Não, a interrupção de um contêiner não afeta os volumes ou redes anexados - eles permanecem intactos.
Posso impedir que alguns contêineres sejam interrompidos?
Você pode parar os contêineres seletivamente usando docker ps
com filtros ou excluindo IDs de contêineres específicos do comando.
Engenheiro de dados com experiência em tecnologias de nuvem Python e Azure, especializado na criação de pipelines de dados escaláveis e processos de ETL. Atualmente está cursando Bacharelado em Ciência da Computação na Universidade de Tanta. Engenheiro de dados certificado pela DataCamp com experiência comprovada em gerenciamento e programação de dados. Ex-estagiário de engenharia de dados da Microsoft na Digital Egypt Pioneers Initiative e Microsoft Beta Student Ambassador, liderando workshops técnicos e organizando hackathons.