Docker Prune: Um Guia Completo com Exemplos Práticos

Se você trabalha com Docker diariamente, sabe o quão rapidamente ele pode consumir espaço em disco.

Ao longo do tempo, seu sistema acumula imagens, containers, volumes e redes não utilizados. Estes geralmente ficam ociosos, ocupando espaço de armazenamento valioso e potencialmente impedindo que você trabalhe em seu projeto atual. Felizmente, o Docker fornece comandos de limpeza embutidos que removem facilmente recursos desnecessários.

Esses comandos de limpeza fazem parte da família docker prune, e hoje você aprenderá tudo sobre eles. Eles rapidamente se tornarão sua solução principal para liberar espaço em disco.

Vamos começar com uma breve visão geral antes de mergulhar em exemplos práticos.  

Você é novo no Docker? Confira nosso guia sobre aprendendo Docker do zero para profissionais de dados para se atualizar rapidamente.  

O que é Docker Prune?  

O termo “Docker Prune” geralmente se refere a um conjunto de comandos projetados para ajudar você a remover recursos Docker não utilizados e desnecessários.  

Com o tempo, especialmente se você trabalhar em vários projetos, você criará inúmeras imagens, executará contêineres e configurará volumes e redes. Todos esses se acumulam no seu sistema, ocupando uma quantidade significativa de espaço em disco. O objetivo do docker prune é limpar essa bagunça e recuperar armazenamento.  

Dito isso, há mais no docker prune do que se imagina.

Não é apenas um único comando que você pode executar. Bem, você poderia, mas às vezes você precisa de controle granular sobre o que será removido. É aí que este artigo entra. Ele mostrará como gerenciar o pruning de forma eficaz, garantindo que você exclua apenas o que pretende e como praticar em um ambiente seguro para evitar remover acidentalmente dados importantes.

Vale ressaltar que os comandos de podaremovem apenas recursos que não estão em uso ativo. Imagens, volumes e redes referenciados por contêineres em execução não serão excluídos. Em outras palavras, a poda não interfere nas cargas de trabalho ativas. 

Na próxima seção, vamos guiá-lo pelos diferentes tipos de comandos de poda e explicar como eles se encaixam em seu fluxo de trabalho. 

Deseja adicionar o Docker ao seu currículo ou portfólio? Estas 10 ideias de projetos Docker vão prepará-lo para o mercado de trabalho.

Todos os Comandos de Poda do Docker com Exemplos Práticos

O Docker fornece vários comandos de prune que permitem limpar recursos não utilizados individualmente ou todos de uma vez. Nesta seção, você aprenderá sobre eles, tanto através da teoria quanto exemplos práticos.  

docker system prune  

Este é o comando mais abrangente para recuperar espaço em disco. Ele remove todos os contêineres, redes, imagens e cache de construção não utilizados em uma única operação.  

Se você está procurando uma maneira rápida de liberar espaço em disco com um único comando, este é o comando a ser utilizado.

Você pode passar opções para o comando docker system prune:

  • -a ou --all remove todas as imagens não utilizadas em vez de apenas as imagens “dangling” (imagens que não possuem tags ou não são referenciadas por nenhum contêiner).
  • --filter permite que você especifique valores de filtro.
  • -f ou --force pula a solicitação de confirmação.
  • --volumes também limpa volumes anônimos juntamente com contêineres, redes, imagens e cache de construção.

Por padrão, docker system prune solicita confirmação, pois é uma operação potencialmente destrutiva:

Imagem 1 – Prompt de confirmação do Docker system prune

Para ignorar o prompt e remover todas as imagens, contêineres, redes e volumes não utilizados com um único comando, execute:

docker system prune -a -f --volumes

Imagem 2 – Remova tudo com um único comando de limpeza do sistema docker

Mas e se você precisar de um controle mais granular? Vamos abordar isso a seguir.

docker container prune

Simplesmente, este comando remove todos os containers parados.

Contêineres parados permanecem em seu sistema até serem removidos manualmente. Eles podem ocupar espaço em disco e ser difíceis de serem identificados a menos que você utilize uma ferramenta como Docker Desktop Dashboard.

Assim como docker system prune, este comando suporta opções:

  • --filter permite que você especifique pares de chave-valor para controlar quais contêineres serão removidos.
  • -f ou --force ignora a solicitação de confirmação.

Aqui está uma lista de containers não em execução:

Imagem 3 – Lista de containers não em execução

Para remover code-server (e qualquer outro container parado), execute:

docker container prune -f

Isso não solicitará confirmação e, em questão de segundos, você verá uma saída como esta:

Imagem 4 – Mensagem de saída da limpeza do container

E assim, não há mais containers parados:

Imagem 5 – Lista de contêineres não em execução (2)

Agora, vamos cuidar das imagens não utilizadas.

docker image prune

Semelhante ao comando anterior, docker image prune remove imagens não utilizadas.

Por padrão, ele remove apenas imagens penduradas – imagens sem tag e não associadas a um contêiner. Você pode usar uma bandeira opcional para remover todas as imagens não utilizadas, não apenas as penduradas.

Aqui está uma lista de opções disponíveis

  • -a ou --all remove todas as imagens não utilizadas em vez de apenas as penduradas.
  • --filter permite que você especifique pares de chave-valor para controlar quais imagens serão removidas.
  • -f ou --force ignora a solicitação de confirmação.

Agora, vamos ver isso em ação!

Aqui está uma lista de imagens atualmente no sistema:

Imagem 6 – Lista de imagens do Docker

Para removê-las todas com um único comando, execute:

docker image prune -a -f

Você verá uma saída como esta no terminal:

Imagem 7 – Mensagem de saída da poda de imagem

Depois, nenhuma imagem permanece no Docker Desktop:

Imagem 8 – Lista de imagens Docker (2)

Em seguida, vamos lidar com os volumes não utilizados.

docker volume prune

Como o nome sugere, o comando docker volume prune remove todos os volumes locais não utilizados. Em outras palavras, ele exclui volumes que não são referenciados por nenhum contêiner.

Por padrão, o comando remove apenas volumes anônimos – volumes sem nome criados pelo Docker quando um contêiner é iniciado. Para remover volumes explicitamente nomeados, é necessário passar uma opção adicional.

Estas são as opções disponíveis:

  • -a ou --all remove todos os volumes não utilizados em vez de apenas os anônimos.
  • --filter permite que você especifique pares de chave-valor para controlar quais volumes serão removidos.
  • -f ou --force ignora o prompt de confirmação.

Em nosso sistema, temos um único volume criado pelo usuário a partir de um arquivo docker-compose.yml:

Imagem 9 – Lista de volumes do Docker

O comando a seguir remove todos os volumes locais:

docker volume prune -a -f

Após executá-lo, você verá uma saída semelhante a esta:

Imagem 10 – Mensagem de saída da poda de volume

Agora, nenhum volume permanece:

Imagem 11 – Lista de volumes do Docker (2)

Por fim, vamos ver como excluir redes não utilizadas.

docker network prune

Quando os contêineres do Docker se comunicam entre si, geralmente usam redes definidas pelo usuário. No entanto, suas redes costumam permanecer em seu sistema mesmo após a remoção desses contêineres.

O comando docker network prune remove redes que não estão mais em uso por nenhum contêiner.

Assim como os outros comandos de poda, ele inclui algumas opções:

  • --filter permite que você especifique pares de chave-valor para controlar quais redes serão removidas.
  • -f ou --force ignora o prompt de confirmação.

Ao contrário de imagens, contêineres ou volumes, você não pode inspecionar visualmente redes através do Docker Desktop, então você precisará trabalhar a partir da linha de comando. Aqui está uma lista de redes disponíveis:

Imagem 12 – Lista de redes do Docker

Para remover todas as redes não associadas à instalação padrão do Docker, execute:

docker network prune -a -f

Após executar o comando, você verá uma saída como esta:

Imagem 13 – Mensagem de saída da poda de rede

Todas as redes associadas a contêineres anteriormente em execução agora foram removidas:

Imagem 14 – Lista de redes do Docker

No entanto, observe que as três redes restantes são essenciais para o Docker funcionar corretamente e não podem ser removidas.

E é isso para o uso básico dos comandos docker prune! Em seguida, abordaremos tópicos avançados, como usar esses comandos com segurança e as melhores práticas para ambientes de produção e sensíveis.

Usando o Docker Prune com Segurança

Os comandos docker prune ajudam a recuperar rapidamente espaço em disco, mas devem serusados com cautela, especialmente em ambientes de produção.

Excluir acidentalmente contêineres, imagens ou volumes importantes pode resultar em perda de dados e interromper fluxos de trabalho críticos. Para evitar isso, é melhor entender o que será removido antes de executar qualquer comando de limpeza.

Esta seção explica as principais precauções a serem tomadas ao executar docker prune com segurança.

Entendendo o que será removido

Os comandos de prune são projetados para remover apenas recursos que não estão em uso ativo.

Por exemplo, docker image prune exclui apenas imagens penduradas, e docker volume prune remove apenas volumes não anexados a nenhum contêiner. No entanto, adicionar opções como -a -f removerá todas imagens ou volumes sem solicitar confirmação.  

Além disso, em ambientes complexos, as dependências podem ser fáceis de serem ignoradas, então sempre é uma boa prática verificar novamente antes de podar.  

Antes de executar qualquer comando prune, você deve inspecionar seu sistema para ver quais recursos estão atualmente em uso. Existem várias maneiras de fazer isso, e exploraremos as mais comuns nesta seção.  

Use este comando para visualizar todos os contêineres, incluindo os interrompidos:  

docker ps -a

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

Imagem 15 – Lista de todos os contêineres Docker

Da mesma forma, use este comando para listar todas as imagens, incluindo as não utilizadas:  

docker images

A saída será estruturada de forma semelhante à acima:  

Imagem 16 – Lista de todas as imagens Docker

Para verificar os volumes, execute este comando para listar todos os volumes:

docker volume ls

Imagem 17 – Lista de todos os volumes do Docker

Revise essas saídas cuidadosamente para garantir que nenhum recurso crítico seja excluído por engano.

Execução a seco para segurança

Infelizmente, o Docker ainda não possui uma opção integrada para uma execução a seco do comando de limpeza, mesmo que tenha sido solicitada há anos.

Por causa disso, você deve inspecionar manualmente os recursos usando os comandos listados na seção anterior antes de executar um comando de poda.

Se você estiver trabalhando em um ambiente sensível onde a persistência de dados é crítica, você sempre deve criar um backup antes de executar comandos de poda que afetam os volumes.

É claro que essas são apenas medidas de precaução, mas esperamos ver em breve a opção de simulação implementada.

Melhores Práticas para o Docker Prune

Para manter seu ambiente Docker livre de bagunça desnecessária, é importante executar regularmente comandos de prune – talvez até mesmo automatizá-los.

Esta seção apresenta as melhores práticas para executar comandos docker prune em ambientes de produção.

Use o docker prune regularmente

Ao longo do tempo, o Docker acumula imagens não utilizadas, containers parados e volumes desnecessários – todos consomem espaço significativo no disco.

Executar comandos de poda regularmente mantém seu ambiente limpo e previne o uso excessivo de disco. Você deve incluí-los como parte de sua programação de manutenção.  

A cada algumas semanas é um bom ponto de partida, mas se sua configuração envolve criação e remoção frequente de containers, considere uma programação mais frequente.  

Tenha cautela em produção  

Qualquer trabalho em um ambiente de produção requer cuidado adicional, e a poda do Docker não é exceção.  

Um momento de desatenção pode levar a tempo de inatividade ou perda de dados, e você não quer ser responsável por isso. Antes de executar comandos docker prune em um ambiente de produção, sempre inspecione os recursos do sistema usando docker ps -a, docker images e docker volume ls, conforme explicado na seção anterior.

Além disso, é uma boa ideia usar comandos de poda específicos em vez do abrangente docker system prune, pois pode ser mais fácil se recuperar de exclusões não intencionais.

Automatize a poda do docker

Outra boa prática é otimizar os esforços de limpeza automatizando os comandos docker prune usando tarefas agendadas.

No Linux, você pode configurar um trabalho cron para executar os comandos em intervalos regulares, enquanto no Windows, você pode usar Agendador de Tarefas para automação semelhante. Isso ajuda a manter um sistema organizado sem a necessidade de intervenção manual. No entanto, em um ambiente de produção, certifique-se de que a poda automatizada não interfira nas cargas de trabalho críticas.

Por exemplo, esse trabalho cron no Linux executa um comando de poda abrangente todo domingo à meia-noite:

0 0 * * 0 docker system prune -a -f

Solução de Problemas com Problemas de Poda do Docker

Os comandos docker prune são uma solução padrão para recuperar espaço em disco, mas nem sempre são suficientes para garantir espaço suficiente para baixar novas imagens ou executar novos contêineres.

Além disso, você pode remover acidentalmente recursos importantes, então é crucial discutir estratégias de recuperação.

Ambos os tópicos serão abordados nesta seção.

Problemas de espaço em disco são comuns

As imagens do Docker podem ser grandes—recentemente tivemos uma com mais de 13GB—e temos certeza de que existem imagens ainda maiores por aí. Portanto, mesmo depois de executar docker prune, você pode descobrir que seu sistema ainda está com pouco espaço em disco.

Para ver exatamente quanto espaço está sendo usado por imagens, contêineres e volumes, execute este comando:

docker system df

Imagem 18 – Espaço utilizado pelo Docker

Ao recuperar espaço em disco com comandos docker prune, adicione a flag -a para remover todas as imagens, volumes ou contêineres – não apenas os pendurados ou anônimos. Claro, tenha em mente as possíveis desvantagens dessa abordagem.

Se o problema de espaço em disco persistir, sua única opção é aumentar o espaço em disco disponível.

Recuperando remoções acidentais

A recuperação é mais fácil dita do que feita, por isso recomendamos entender o que será removido por poda antes de executar o comando real.

No entanto, se você se encontrar em uma situação em que removeu acidentalmente contêineres, imagens ou volumes importantes, comece verificando os logs para identificar o que foi removido.

No macOS, isso pode ser feito executando os seguintes dois comandos (opções para Windows e Linux):

pred='process matches ".*(ocker|vpnkit).*" || (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")' /usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred" /usr/bin/log show --debug --info --style syslog --last 30m --predicate "$pred" >/tmp/logs.txt

A execução desses comandos salvará os últimos 30 minutos de logs relacionados ao Docker em /tmp/logs.txt. Você deve inspecionar esses logs para determinar quais contêineres ou imagens foram deletados.

Para imagens deletadas, você provavelmente pode baixá-las novamente de um registro como Docker Hub. Um comando como este deve resolver:

docker pull <image_name>

E para recipientes excluídos, você sempre pode recriá-los se forem baseados em imagens persistentes:

docker run --name <container_name> <image_name>

Alternativamente, você pode restaurar a partir de backups se estiverem disponíveis, o que pode ser usado para recuperar tanto dados de volume quanto de contêiner. No futuro, considere usar ferramentas para instantâneos de volume para prevenir perda de dados.

No entanto, a melhor estratégia é inspecionar os recursos que serão excluídos antes de executar um comando de poda e prosseguir somente se você tiver absoluta certeza de que não afetará seu fluxo de trabalho.

Resumindo a Poda do Docker

Para concluir, a família de comandos docker prune é uma maneira poderosa de recuperar espaço em disco, mas vem com o risco de excluir acidentalmente recursos necessários, levando à perda de dados. Esse risco é ainda maior ao usar as flags opcionais -a -f, que removerão tudo de forma forçada.

No entanto, a poda continua sendo um método essencial para manter seu sistema limpo e organizado.

Você só precisa ser cauteloso, especialmente em ambientes de produção. Use comandos como docker ps -a, docker images e docker volume ls antes de podar para listar todos os contêineres, imagens e volumes. Execute o comando de poda apenas depois de ter certeza de que está tudo bem excluir os recursos listados (assumindo que eles não estão sendo usados por um contêiner em execução).

Se você deseja aprender mais sobre Docker, containerização e orquestração de contêineres, confira estes cursos na DataCamp:

Source:
https://www.datacamp.com/tutorial/docker-prune