Como usar o comando docker volume prune para remover volumes não utilizados

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como gerenciar efetivamente volumes Docker, com foco no comando docker volume prune. Começaremos criando e inspecionando vários tipos de volumes, incluindo volumes nomeados e volumes com rótulos (labels), para entender suas propriedades e como o Docker os gerencia.

Em seguida, demonstraremos como os volumes são usados com contêineres, criando e removendo um contêiner que utiliza um volume. Isso destacará a persistência dos dados armazenados em volumes. Finalmente, o laboratório irá guiá-lo através do uso do comando docker volume prune para remover volumes não utilizados, cobrindo a remoção de volumes anônimos, todos os volumes não utilizados (incluindo volumes nomeados) e o uso de filtros de rótulos para podar seletivamente volumes.

Criar e inspecionar alguns volumes

Nesta etapa, aprenderemos como criar e inspecionar volumes Docker. Volumes são a maneira preferida de persistir dados gerados e usados por contêineres Docker. Enquanto as montagens de ligação (bind mounts) dependem da estrutura de diretórios da máquina host, os volumes são completamente gerenciados pelo Docker.

Primeiro, vamos criar um volume nomeado usando o comando docker volume create. Vamos nomear este volume myvolume.

docker volume create myvolume

Você deve ver o nome do volume impresso no console, confirmando sua criação.

Agora, vamos inspecionar o volume que acabamos de criar usando o comando docker volume inspect. Este comando fornece informações detalhadas sobre o volume, como seu nome, driver e ponto de montagem (mountpoint) na máquina host.

docker volume inspect myvolume

A saída será um array JSON contendo informações sobre o volume. Procure o campo "Mountpoint", que mostra a localização no host onde os dados do volume são armazenados. O Docker gerencia esta localização, e você geralmente deve evitar modificar arquivos diretamente neste diretório.

Em seguida, vamos criar outro volume, desta vez com um rótulo (label). Rótulos são úteis para organizar e filtrar objetos Docker. Criaremos um volume chamado labeled_volume e adicionaremos um rótulo app=web.

docker volume create --label app=web labeled_volume

Novamente, o nome do volume será impresso após a criação bem-sucedida.

Finalmente, vamos inspecionar o labeled_volume para ver o rótulo que adicionamos.

docker volume inspect labeled_volume

Na saída JSON, você deve encontrar um campo "Labels" contendo o rótulo app=web.

Criar e remover um contêiner usando um volume

Nesta etapa, criaremos um contêiner Docker e anexaremos o myvolume que criamos na etapa anterior a ele. Isso demonstrará como os dados podem persistir mesmo após a remoção do contêiner.

Primeiro, vamos baixar a imagem ubuntu, que usaremos para nosso contêiner.

docker pull ubuntu

Este comando baixa a imagem ubuntu do Docker Hub.

Agora, executaremos um contêiner baseado na imagem ubuntu e montaremos myvolume no diretório /app dentro do contêiner. Também executaremos um comando que grava alguns dados em um arquivo dentro do volume montado.

docker run -d --name mycontainer -v myvolume:/app ubuntu /bin/bash -c "echo 'Hello from the container!' > /app/data.txt; sleep 30"

Vamos detalhar este comando:

  • docker run: Este comando é usado para executar um novo contêiner.
  • -d: Esta flag executa o contêiner em modo detached, o que significa que ele é executado em segundo plano.
  • --name mycontainer: Isso atribui o nome mycontainer ao contêiner, tornando mais fácil referenciá-lo.
  • -v myvolume:/app: Esta é a parte crucial para usar o volume. Ele monta o volume nomeado myvolume no diretório /app dentro do contêiner.
  • ubuntu: Isso especifica a imagem a ser usada para o contêiner.
  • /bin/bash -c "echo 'Hello from the container!' > /app/data.txt; sleep 30": Este é o comando executado dentro do contêiner. Ele usa bash para executar dois comandos: primeiro, ele grava a string "Hello from the container!" em um arquivo chamado data.txt dentro do diretório /app (que é o volume montado), e então ele faz o contêiner dormir por 30 segundos para mantê-lo em execução por um curto período.

Você pode verificar se o contêiner está em execução usando o comando docker ps.

docker ps

Você deve ver mycontainer listado na saída com o status "Up".

Agora, vamos remover o contêiner. Mesmo que removamos o contêiner, os dados gravados no volume devem persistir.

docker rm -f mycontainer

A flag -f força a remoção do contêiner, mesmo que ele ainda esteja em execução.

Para verificar se os dados persistem no volume, podemos executar um novo contêiner e montar o mesmo volume, e então verificar o conteúdo do arquivo.

docker run --rm -v myvolume:/app ubuntu cat /app/data.txt

Vamos detalhar este comando:

  • docker run: Executa um novo contêiner.
  • --rm: Esta flag remove automaticamente o contêiner quando ele sai.
  • -v myvolume:/app: Monta o myvolume em /app neste novo contêiner.
  • ubuntu: Usa a imagem ubuntu.
  • cat /app/data.txt: Este é o comando executado dentro do contêiner. Ele usa cat para exibir o conteúdo do arquivo data.txt localizado no diretório /app.

Você deve ver "Hello from the container!" impresso no console, confirmando que os dados persistiram no volume mesmo após a remoção do contêiner original.

Podar volumes anônimos não utilizados

Nesta etapa, aprenderemos como remover volumes anônimos não utilizados. Volumes anônimos são criados quando você não nomeia explicitamente um volume ao montá-lo em um contêiner. Eles são tipicamente removidos quando o contêiner que os criou é removido, mas às vezes eles podem persistir. A poda (pruning) ajuda a limpar esses volumes não utilizados.

Primeiro, vamos criar um contêiner com um volume anônimo. Executaremos um contêiner simples que sai imediatamente.

docker run --rm -v /data ubuntu ls /data

Vamos detalhar este comando:

  • docker run: Executa um novo contêiner.
  • --rm: Esta flag remove automaticamente o contêiner quando ele sai.
  • -v /data: Isso cria um volume anônimo e o monta no diretório /data dentro do contêiner. Como não fornecemos um nome antes dos dois pontos, o Docker gera um nome aleatório para o volume.
  • ubuntu: Usa a imagem ubuntu.
  • ls /data: O comando executado dentro do contêiner, que lista o conteúdo do diretório /data.

Mesmo que o contêiner seja removido devido à flag --rm, o volume anônimo ainda pode existir se não foi explicitamente limpo pelo Docker.

Para ver todos os volumes, incluindo os anônimos, você pode usar o comando docker volume ls.

docker volume ls

Você deve ver myvolume e labeled_volume das etapas anteriores, e potencialmente um ou mais volumes com nomes longos e aleatórios. Estes são os volumes anônimos.

Agora, vamos podar os volumes anônimos não utilizados usando o comando docker volume prune. Por padrão, este comando remove apenas volumes anônimos que não estão sendo usados atualmente por nenhum contêiner.

docker volume prune

O Docker pedirá confirmação antes de prosseguir. Digite y e pressione Enter.

A saída mostrará quais volumes foram removidos. Você deve ver os volumes anônimos que não estavam em uso sendo removidos.

Vamos listar os volumes novamente para confirmar que os volumes anônimos foram removidos.

docker volume ls

Você agora deve ver apenas os volumes nomeados (myvolume e labeled_volume) na lista.

Podar todos os volumes não utilizados, incluindo volumes nomeados

Na etapa anterior, podamos volumes anônimos não utilizados. Nesta etapa, aprenderemos como podar todos os volumes não utilizados, incluindo volumes nomeados que não estão atualmente anexados a nenhum contêiner.

Primeiro, vamos listar os volumes existentes para ver o que temos.

docker volume ls

Você deve ver myvolume e labeled_volume listados. Estes são volumes nomeados e não foram removidos pelo comando docker volume prune padrão porque são nomeados.

Para podar todos os volumes não utilizados, incluindo os nomeados, precisamos usar a flag --all ou -a com o comando docker volume prune.

docker volume prune --all

O Docker pedirá novamente confirmação. Digite y e pressione Enter.

A saída mostrará quais volumes estão sendo removidos. Como myvolume e labeled_volume não estão sendo usados atualmente por nenhum contêiner, eles serão removidos.

Vamos listar os volumes novamente para confirmar que todos os volumes não utilizados foram removidos.

docker volume ls

Você agora deve ver uma lista vazia, indicando que todos os volumes não utilizados, tanto anônimos quanto nomeados, foram removidos.

Podar volumes usando filtro de rótulo

Nesta etapa final, aprenderemos como podar volumes com base em rótulos. Esta é uma maneira poderosa de remover seletivamente volumes que correspondem a critérios específicos, sem afetar outros volumes.

Primeiro, vamos criar alguns novos volumes com rótulos diferentes para termos algo para filtrar.

docker volume create --label env=dev dev_volume
docker volume create --label env=prod prod_volume
docker volume create --label type=data data_volume

Criamos três novos volumes: dev_volume com o rótulo env=dev, prod_volume com o rótulo env=prod e data_volume com o rótulo type=data.

Vamos listar os volumes para ver os recém-criados.

docker volume ls

Você deve ver dev_volume, prod_volume e data_volume na lista.

Agora, vamos podar apenas os volumes que possuem o rótulo env=dev. Podemos usar a flag --filter com a chave label.

docker volume prune --filter label=env=dev

O Docker pedirá confirmação. Digite y e pressione Enter.

A saída mostrará que dev_volume foi removido.

Vamos listar os volumes novamente para confirmar que apenas dev_volume foi removido.

docker volume ls

Você agora deve ver prod_volume e data_volume restantes.

Também podemos filtrar por rótulos que não estão presentes. Por exemplo, vamos podar volumes que não possuem o rótulo type=data.

docker volume prune --filter label!=type=data

O Docker pedirá confirmação. Digite y e pressione Enter.

A saída mostrará que prod_volume foi removido.

Vamos listar os volumes mais uma vez para ver o que sobrou.

docker volume ls

Você agora deve ver apenas data_volume restante.

Isso demonstra como você pode usar filtros de rótulo para podar seletivamente volumes com base em suas necessidades.

Resumo

Neste laboratório, aprendemos como gerenciar volumes do Docker, que são o método preferido para persistir dados de contêineres. Começamos criando e inspecionando volumes nomeados e volumes com rótulos usando docker volume create e docker volume inspect. Isso nos permitiu entender como os volumes são criados e visualizar seus detalhes, incluindo seus pontos de montagem (mountpoints) e rótulos associados.

Posteriormente, demonstramos a persistência de dados criando um contêiner que utilizava um volume nomeado e, em seguida, removendo o contêiner. Isso destacou que o volume e seus dados permaneceram intactos após a remoção do contêiner. Finalmente, exploramos o comando docker volume prune, aprendendo como remover volumes anônimos não utilizados por padrão, como remover todos os volumes não utilizados (incluindo volumes nomeados) usando a flag --all e como podar seletivamente volumes com base em rótulos usando a opção --filter. Essas etapas forneceram experiência prática na limpeza de volumes não utilizados para liberar espaço em disco.