Como usar o comando docker image prune para remover imagens não utilizadas

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como gerenciar efetivamente o espaço em disco removendo imagens Docker não utilizadas usando o comando docker image prune. Começaremos entendendo o propósito deste comando e os diferentes tipos de imagens não utilizadas que ele visa, especificamente as imagens dangling (penduradas) e todas as imagens não utilizadas.

Através de exercícios práticos, você praticará a remoção de imagens dangling e, em seguida, estenderá isso para remover todas as imagens não utilizadas. Além disso, você explorará como usar opções de filtragem com docker image prune para remover seletivamente imagens com base em critérios como tempo de criação e labels (rótulos), fornecendo controle granular sobre o seu processo de limpeza de imagens.

Entenda o propósito do docker image prune

Nesta etapa, entenderemos o propósito do comando docker image prune. Ao trabalhar com Docker, você inevitavelmente acumulará imagens não utilizadas em seu sistema. Essas imagens podem ocupar um espaço significativo em disco. O comando docker image prune é usado para remover essas imagens não utilizadas, ajudando você a liberar espaço em disco.

Existem dois tipos principais de imagens não utilizadas que o docker image prune visa:

  1. Imagens dangling (penduradas): São imagens que não estão marcadas (tagged) e não são referenciadas por nenhum contêiner. Elas são essencialmente camadas intermediárias que não são mais necessárias.
  2. Todas as imagens não utilizadas: Isso inclui imagens dangling, bem como imagens que não são referenciadas por nenhum contêiner, mesmo que tenham uma tag (marca).

Vamos começar criando algumas imagens dangling para ver como o docker image prune funciona. Vamos baixar algumas versões diferentes da imagem ubuntu e, em seguida, construir uma nova imagem com base em uma delas. Esse processo geralmente deixa para trás imagens dangling.

Primeiro, baixe as imagens ubuntu:latest e ubuntu:18.04.

docker pull ubuntu:latest
docker pull ubuntu:18.04

Você deve ver a saída indicando que as imagens estão sendo baixadas.

Agora, vamos construir uma imagem simples com base em ubuntu:latest. Crie um arquivo chamado Dockerfile em seu diretório ~/project com o seguinte conteúdo:

FROM ubuntu:latest
RUN echo "Hello, Docker!" >/app/hello.txt

Este Dockerfile simplesmente começa com a imagem ubuntu:latest e adiciona um arquivo chamado hello.txt ao diretório /app.

Agora, construa a imagem usando o comando docker build. Não vamos marcar (tag) esta imagem, o que ajudará a criar uma imagem dangling.

docker build -t my-ubuntu-app ~/project

Você deve ver a saída indicando o processo de construção. Após a conclusão da construção, vamos listar todas as imagens, incluindo as intermediárias, para ver se temos alguma imagem dangling.

docker images -a

Procure imagens com <none> nas colunas REPOSITORY e TAG. Essas são imagens dangling.

O comando docker image prune é projetado para remover essas imagens dangling por padrão. Na próxima etapa, usaremos este comando para limpar as imagens dangling que acabamos de criar.

Remova imagens dangling usando docker image prune

Na etapa anterior, criamos algumas imagens dangling construindo uma imagem sem uma tag específica. Nesta etapa, usaremos o comando docker image prune para remover essas imagens dangling.

Por padrão, docker image prune remove apenas imagens dangling. Esta é a maneira mais segura de limpar as camadas de imagem não utilizadas sem remover acidentalmente imagens que você ainda pode precisar, mesmo que elas não estejam atualmente associadas a um contêiner em execução.

Para remover imagens dangling, basta executar o comando docker image prune:

docker image prune

Quando você executa este comando, o Docker mostrará uma lista das imagens dangling que ele removerá e pedirá confirmação.

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

Digite y e pressione Enter para prosseguir com a remoção.

Após a conclusão do comando, ele relatará a quantidade total de espaço recuperado.

Agora, vamos listar todas as imagens novamente, incluindo as intermediárias, para confirmar que as imagens dangling foram removidas.

docker images -a

Você não deverá mais ver imagens com <none> nas colunas REPOSITORY e TAG que estavam presentes antes de executar docker image prune. As imagens ubuntu:latest, ubuntu:18.04 e my-ubuntu-app ainda devem estar presentes, pois não são dangling.

Isso demonstra o uso básico de docker image prune para remover imagens dangling. Esta é uma boa prática para realizar periodicamente para liberar espaço em disco no seu host Docker.

Remova todas as imagens não utilizadas com docker image prune -a

Na etapa anterior, aprendemos como remover imagens dangling usando docker image prune. Embora a remoção de imagens dangling seja útil, pode haver outras imagens em seu sistema que não estão sendo usadas atualmente por nenhum contêiner, mas não são dangling (ou seja, elas têm uma tag). Para remover essas imagens também, você pode usar a flag -a (ou --all) com docker image prune.

O comando docker image prune -a remove todas as imagens não utilizadas, não apenas as dangling. Esta é uma limpeza mais agressiva e deve ser usada com cautela, pois removerá qualquer imagem que não esteja atualmente associada a um contêiner em execução.

Vamos ver como isso funciona. Primeiro, vamos listar as imagens que temos atualmente.

docker images

Você deve ver ubuntu:latest, ubuntu:18.04 e my-ubuntu-app. Essas imagens não estão sendo usadas atualmente por nenhum contêiner em execução, mas não são dangling porque têm tags.

Agora, execute o comando docker image prune -a:

docker image prune -a

Semelhante à etapa anterior, o Docker mostrará uma lista de imagens que ele removerá e pedirá confirmação.

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]

Digite y e pressione Enter para prosseguir.

Após a conclusão do comando, ele relatará a quantidade total de espaço recuperado.

Agora, liste as imagens novamente para ver quais permanecem.

docker images

Você deve ver que todas as imagens que não estavam associadas a um contêiner em execução foram removidas. Se você tivesse algum contêiner em execução, as imagens usadas por esses contêineres não seriam removidas.

Usar docker image prune -a é uma maneira poderosa de liberar uma quantidade significativa de espaço em disco, mas lembre-se de que ele remove todas as imagens que não estão em uso atualmente.

Filtrar imagens para prune com base no tempo de criação

Além de remover todas as imagens não utilizadas, docker image prune permite que você filtre quais imagens são consideradas para pruning com base em vários critérios. Um filtro útil é baseado no tempo de criação da imagem. Isso permite que você remova imagens que foram criadas antes de um ponto específico no tempo.

A flag --filter é usada para aplicar filtros. Para filtrar por tempo de criação, você usa o filtro until. O filtro until recebe um timestamp ou uma duração como seu valor. As imagens criadas após o tempo especificado serão mantidas, enquanto aquelas criadas antes ou no tempo especificado serão consideradas para pruning.

Vamos primeiro pull algumas imagens com diferentes tempos de criação. Vamos fazer o pull de alpine:latest e centos:latest.

docker pull alpine:latest
docker pull centos:latest

Agora, vamos listar as imagens e observar seus tempos de criação.

docker images

Observe a coluna CREATED para cada imagem.

Para demonstrar a filtragem por tempo, precisamos de um ponto de referência. Digamos que queremos remover imagens criadas há mais de 5 minutos. Podemos especificar o filtro until com uma duração como 5m.

docker image prune -a --filter "until=5m"

Este comando considerará a remoção de todas as imagens não utilizadas que foram criadas há mais de 5 minutos. O Docker pedirá novamente confirmação antes de prosseguir.

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]

Digite y e pressione Enter para confirmar.

Após o pruning, liste as imagens novamente:

docker images

Dependendo de quanto tempo atrás você fez o pull das imagens e executou o comando prune, algumas imagens podem ter sido removidas. As imagens criadas nos últimos 5 minutos devem permanecer.

Você também pode especificar um timestamp específico em vários formatos. Por exemplo, para remover imagens criadas antes de uma data e hora específicas, você pode usar um formato como "2023-10-27T10:00:00".

A filtragem por tempo de criação é útil para automatizar tarefas de limpeza, garantindo que apenas imagens relativamente recentes sejam mantidas em seu sistema.

Filtrar imagens para prune com base em labels

Nesta etapa final, exploraremos outra opção de filtragem poderosa para docker image prune: a filtragem com base em labels. Labels são pares chave-valor que você pode anexar a objetos Docker, incluindo imagens, para adicionar metadados. Você pode então usar esses labels para filtrar e gerenciar seus recursos Docker.

A flag --filter com a chave label permite que você especifique quais imagens incluir ou excluir do processo de pruning com base em seus labels.

Primeiro, vamos criar algumas imagens com labels diferentes. Usaremos um Dockerfile simples e construiremos duas imagens com labels diferentes.

Crie um arquivo chamado Dockerfile.labeled em seu diretório ~/project com o seguinte conteúdo:

FROM alpine:latest
LABEL environment="development"
LABEL version="1.0"
RUN echo "This is a labeled image" >/app/info.txt

Agora, construa duas imagens a partir deste Dockerfile, aplicando labels diferentes durante o processo de construção usando a flag --label.

docker build -t my-labeled-app:dev --label project=myapp --label stage=dev ~/project -f Dockerfile.labeled
docker build -t my-labeled-app:prod --label project=myapp --label stage=prod ~/project -f Dockerfile.labeled

Agora construímos duas imagens, my-labeled-app:dev e my-labeled-app:prod, ambas baseadas no mesmo Dockerfile, mas com labels stage diferentes.

Vamos listar as imagens e inspecionar seus labels.

docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"

Você deve ver a saída mostrando as imagens e seus labels associados.

Agora, vamos usar docker image prune para remover imagens com base em seus labels. Suponha que queremos remover todas as imagens não utilizadas que possuem o label stage=dev. Podemos usar a flag --filter com label=stage=dev. Também usaremos a flag -a para considerar todas as imagens não utilizadas, não apenas as dangling.

docker image prune -a --filter "label=stage=dev"

O Docker mostrará as imagens que correspondem ao filtro e serão removidas. Confirme digitando y.

Após o pruning, liste as imagens novamente:

docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"

Você deve ver que a imagem my-labeled-app:dev foi removida, enquanto my-labeled-app:prod permanece porque não correspondeu ao filtro.

Você também pode usar a sintaxe label!=key=value para remover imagens que não possuem um label ou valor de label específico. Por exemplo, para remover todas as imagens não utilizadas que não possuem o label stage=prod:

docker image prune -a --filter "label!=stage=prod"

Este comando removeria my-labeled-app:dev (se ainda existisse) e quaisquer outras imagens não utilizadas que não tivessem o label stage=prod.

A filtragem por labels fornece uma maneira flexível de gerenciar e limpar suas imagens com base em seus próprios metadados definidos.

Resumo

Neste laboratório, aprendemos como usar o comando docker image prune para gerenciar o espaço em disco, removendo imagens Docker não utilizadas. Começamos entendendo o propósito do comando e os tipos de imagens não utilizadas que ele visa: imagens dangling (sem tag e sem referência) e todas as imagens não utilizadas (incluindo imagens com tag, mas sem referência). Em seguida, praticamos a identificação e remoção de imagens dangling usando o comando básico docker image prune.

Exploramos ainda mais os recursos do docker image prune, aprendendo como remover todas as imagens não utilizadas usando a flag -a. Finalmente, descobrimos como usar opções de filtragem para prune seletivamente imagens com base em critérios como tempo de criação e labels, fornecendo um controle mais granular sobre a limpeza de imagens.