Como usar o comando docker system prune para recuperar espaço em disco

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar efetivamente o comando docker system prune para recuperar espaço em disco, removendo dados Docker não utilizados. Começaremos entendendo o que docker system prune remove por padrão, o que inclui containers finalizados (exited containers), imagens pendentes (dangling images) e redes pendentes (dangling networks), mas não volumes.

Em seguida, você explorará como podar dados Docker não utilizados, excluindo especificamente volumes, e depois aprenderá como remover todos os dados não utilizados, incluindo volumes anônimos. Finalmente, você descobrirá como usar filtros com docker system prune para obter um controle mais granular sobre quais dados são removidos.

Entenda o que o docker system prune remove por padrão

Nesta etapa, exploraremos o comando docker system prune e entenderemos que tipos de dados Docker não utilizados ele remove por padrão. Este comando é útil para limpar espaço em disco, removendo objetos pendentes (dangling) ou não utilizados.

Primeiro, vamos criar alguns objetos Docker não utilizados. Executaremos um container simples e, em seguida, o interromperemos. Isso deixará para trás um container finalizado (exited container) e, potencialmente, uma imagem pendente (dangling image) se a imagem não for usada por nenhum outro container.

Abra o terminal no ambiente LabEx. O diretório padrão é ~/project.

Execute um container hello-world simples:

docker run hello-world

Você deve ver a saída indicando que o daemon Docker puxou a imagem hello-world e executou o container. O container sairá imediatamente após imprimir sua mensagem.

Agora, liste todos os containers, incluindo os finalizados:

docker ps -a

Você verá o container hello-world listado com o status "Exited".

Em seguida, vamos listar as imagens:

docker images

Você deve ver a imagem hello-world.

Agora, vamos executar o comando docker system prune sem nenhuma opção. Isso removerá imagens pendentes, containers pendentes e redes pendentes. Ele não removerá volumes por padrão.

docker system prune -f

Usamos a flag -f para forçar a remoção sem um prompt de confirmação.

Após executar o comando, você verá a saída indicando o que foi removido.

Agora, vamos verificar os containers novamente:

docker ps -a

O container hello-world finalizado deve ter sido removido.

Verifique as imagens novamente:

docker images

A imagem hello-world pode ainda estar presente se não for considerada "pendente" (por exemplo, se foi puxada recentemente). No entanto, se você tivesse outras imagens pendentes, elas teriam sido removidas.

A principal conclusão aqui é que docker system prune por padrão limpa containers finalizados, imagens pendentes e redes pendentes. Ele não remove volumes, a menos que você diga explicitamente para fazê-lo.

Podar dados Docker não utilizados sem remover volumes

Na etapa anterior, vimos que docker system prune por padrão não remove volumes. Volumes são usados para persistir dados gerados e usados por containers Docker. Remover volumes intencionalmente pode levar à perda de dados.

Nesta etapa, demonstraremos como docker system prune funciona sem remover volumes. Criaremos um volume, executaremos um container que o utiliza, interromperemos o container e, em seguida, podaremos o sistema. Observaremos que o volume permanece após a poda.

Primeiro, vamos criar um volume nomeado. Volumes nomeados são explicitamente criados e gerenciados pelo Docker.

docker volume create myvolume

Você deve ver o nome do volume criado como saída.

Agora, vamos executar um container simples que usa este volume. Usaremos a imagem ubuntu. Se você não a tiver localmente, o Docker a puxará.

docker run -d --name mycontainer -v myvolume:/app ubuntu sleep 60

Este comando executa um container ubuntu em modo detached (-d), o nomeia como mycontainer, monta o myvolume no diretório /app dentro do container e mantém o container em execução por 60 segundos usando o comando sleep 60.

Verifique se o container está em execução:

docker ps

Você deve ver mycontainer listado.

Agora, pare o container:

docker stop mycontainer

O container será interrompido, mas ainda existirá em um estado finalizado (exited state).

Verifique se o container foi interrompido:

docker ps -a

Você deve ver mycontainer com o status "Exited".

Agora, vamos listar os volumes:

docker volume ls

Você deve ver myvolume listado.

Agora, execute docker system prune novamente. Lembre-se, por padrão, ele não remove volumes.

docker system prune -f

Observe a saída. Ela deve indicar que o container finalizado foi removido, mas não deve mencionar a remoção do volume.

Verifique se o container foi removido:

docker ps -a

O mycontainer não deve mais estar listado.

Finalmente, verifique se o volume ainda existe:

docker volume ls

Você ainda deve ver myvolume listado. Isso confirma que docker system prune por padrão preserva volumes.

Podar todos os dados Docker não utilizados, incluindo volumes anônimos

Nas etapas anteriores, aprendemos que docker system prune por padrão não remove volumes. No entanto, existem situações em que você pode querer remover todos os dados Docker não utilizados, incluindo volumes que não estão mais associados a nenhum container. Isso é particularmente útil para limpar volumes anônimos, que são criados quando você monta um diretório dentro de um container sem nomear explicitamente um volume.

Para remover todos os dados Docker não utilizados, incluindo volumes, você pode usar a flag -a com docker system prune. A flag -a significa "all" (todos) e inclui volumes no processo de poda.

Vamos criar um volume anônimo executando um container e montando um diretório sem especificar um nome de volume.

docker run -d --name anothercontainer -v /data ubuntu sleep 60

Este comando executa um container ubuntu chamado anothercontainer e monta um volume anônimo no diretório /data dentro do container.

Verifique se o container está em execução:

docker ps

Você deve ver anothercontainer listado.

Agora, pare o container:

docker stop anothercontainer

O container será interrompido e se tornará um container finalizado (exited container).

Verifique se o container foi interrompido:

docker ps -a

Você deve ver anothercontainer com o status "Exited".

Agora, liste os volumes:

docker volume ls

Você verá o myvolume da etapa anterior e um novo volume com um nome longo e gerado aleatoriamente. Este é o volume anônimo.

Agora, execute docker system prune com a flag -a para remover todos os dados não utilizados, incluindo volumes.

docker system prune -a -f

Usamos -a para incluir volumes e -f para forçar a remoção sem um prompt de confirmação.

Observe a saída cuidadosamente. Ela deve indicar que o container finalizado foi removido e também deve listar o volume anônimo que foi removido. O volume nomeado myvolume da etapa anterior também deve ser removido porque não é mais usado por nenhum container.

Verifique se todos os containers foram removidos:

docker ps -a

Não deve haver nenhum container listado.

Finalmente, verifique se todos os volumes foram removidos:

docker volume ls

Não deve haver nenhum volume listado. Isso confirma que docker system prune -a remove todos os dados Docker não utilizados, incluindo volumes nomeados e anônimos.

Podar dados Docker usando filtros

Além de remover todos os dados não utilizados, docker system prune permite que você use filtros para remover seletivamente objetos Docker. Isso oferece um controle mais granular sobre o que é podado.

Filtros podem ser aplicados a diferentes tipos de objetos. Para docker system prune, você pode filtrar com base em critérios como a idade dos objetos.

Vamos criar mais alguns objetos Docker para demonstrar a filtragem. Executaremos alguns containers e, em seguida, os interromperemos.

Execute o primeiro container:

docker run -d --name oldcontainer ubuntu sleep 10

Este container será executado por 10 segundos e, em seguida, sairá.

Execute o segundo container:

docker run -d --name newcontainer ubuntu sleep 20

Este container será executado por 20 segundos e, em seguida, sairá.

Aguarde ambos os containers saírem. Você pode verificar o status deles com docker ps -a.

docker ps -a

Você deve ver oldcontainer e newcontainer com o status "Exited".

Agora, vamos usar um filtro para remover apenas objetos que são mais antigos que um determinado tempo. Podemos usar o filtro until com uma duração. Por exemplo, para remover objetos com mais de 5 segundos, você pode usar until=5s.

Vamos tentar podar objetos com mais de 15 segundos. Isso deve remover oldcontainer, mas manter newcontainer (assumindo que você esperou tempo suficiente para oldcontainer sair, mas não newcontainer).

docker system prune -f --filter "until=15s"

Observe a saída. Ela deve indicar que oldcontainer foi removido, mas newcontainer deve permanecer.

Verifique os containers:

docker ps -a

Você deve ver newcontainer listado, mas oldcontainer deve ter sido removido.

Agora, vamos podar novamente, desta vez removendo objetos com mais de 30 segundos. Isso deve remover newcontainer também.

docker system prune -f --filter "until=30s"

Observe a saída. Ela deve indicar que newcontainer foi removido.

Verifique os containers novamente:

docker ps -a

Não deve haver nenhum container listado.

Filtros fornecem uma maneira poderosa de personalizar o processo de poda. Você pode usar diferentes chaves de filtro dependendo do tipo de objeto que você está podando (containers, imagens, volumes, redes). O filtro until é comumente usado para limpar objetos que não foram usados por uma duração específica.

Resumo

Neste laboratório, aprendemos como usar o comando docker system prune para recuperar espaço em disco, removendo dados Docker não utilizados. Começamos entendendo o comportamento padrão de docker system prune, que remove containers finalizados (exited containers), imagens pendentes (dangling images) e redes pendentes (dangling networks). Demonstramos isso criando e, em seguida, removendo, um container finalizado.

Em seguida, exploramos como usar docker system prune com opções para controlar quais dados são removidos. Aprendemos como podar dados não utilizados sem remover volumes e como incluir volumes anônimos no processo de poda. Finalmente, abordamos o uso de filtros para podar seletivamente dados Docker com base em critérios específicos. Este laboratório forneceu experiência prática no uso de docker system prune para gerenciar efetivamente o espaço em disco em um ambiente Docker.