Como usar o comando docker container prune para remover containers parados

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como gerenciar efetivamente seu ambiente Docker removendo containers parados usando o comando docker container prune. Começaremos criando e parando vários containers para simular um cenário do mundo real. Em seguida, você explorará diferentes maneiras de podar (prune) esses containers parados, incluindo a remoção de todos eles, a remoção daqueles criados antes de um horário específico e a remoção seletiva de containers com base em rótulos (labels). Essa experiência prática o equipará com as habilidades necessárias para manter seu sistema Docker limpo e otimizado.

Criar e parar alguns containers

Nesta etapa, aprenderemos como criar e parar containers Docker. Containers Docker são unidades leves, portáteis e autossuficientes que contêm tudo o que é necessário para executar uma aplicação.

Primeiro, vamos baixar uma imagem Docker que usaremos para criar containers. Usaremos a imagem ubuntu, que é um sistema operacional Ubuntu minimalista.

docker pull ubuntu

Você deve ver uma saída indicando que a imagem está sendo baixada.

Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Agora que temos a imagem, vamos criar e executar um container a partir dela. Usaremos o comando docker run. A flag -d executa o container em modo detached (em segundo plano), e a flag --name atribui um nome ao container.

docker run -d --name my-ubuntu-container ubuntu sleep infinity

Este comando cria um container chamado my-ubuntu-container a partir da imagem ubuntu e executa o comando sleep infinity dentro dele. O comando sleep infinity mantém o container em execução indefinidamente.

Você deve ver uma longa sequência de caracteres como saída, que é o ID do container.

<container_id>

Para verificar se o container está em execução, podemos usar o comando docker ps.

docker ps

Este comando lista todos os containers em execução. Você deve ver seu my-ubuntu-container listado.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             my-ubuntu-container

Agora, vamos criar outro container, mas desta vez não daremos a ele um nome específico. O Docker gerará automaticamente um nome para ele.

docker run -d ubuntu sleep infinity

Novamente, você verá o ID do container como saída.

<container_id>

Execute docker ps novamente para ver ambos os containers em execução.

docker ps

Você deve ver agora dois containers listados.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             <random_name>

Agora, vamos parar o container chamado my-ubuntu-container. Podemos usar o comando docker stop seguido pelo nome ou ID do container.

docker stop my-ubuntu-container

Você deve ver o nome do container como saída, indicando que ele foi parado.

my-ubuntu-container

Execute docker ps novamente. Você verá que my-ubuntu-container não está mais listado, pois docker ps mostra apenas containers em execução.

docker ps

Para ver todos os containers, incluindo os parados, use o comando docker ps -a.

docker ps -a

Você deve ver agora ambos os containers, com my-ubuntu-container tendo o status Exited.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Up X minutes                          <random_name>

Finalmente, vamos parar o segundo container usando seu ID. Você pode obter o ID da saída de docker ps -a. Substitua <container_id> pelo ID real do segundo container.

docker stop <container_id>

Você deve ver o ID do container como saída.

<container_id>

Execute docker ps -a mais uma vez para confirmar que ambos os containers foram parados.

docker ps -a

Ambos os containers devem agora ter o status Exited.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              <random_name>

Podar todos os containers parados

Na etapa anterior, criamos e paramos dois containers. Containers parados ainda consomem espaço em disco e recursos. Nesta etapa, aprenderemos como remover todos os containers parados usando o comando docker container prune.

Primeiro, vamos listar todos os containers, incluindo os parados, para ver os containers que removeremos.

docker ps -a

Você deve ver os dois containers que paramos na etapa anterior.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X minutes ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X minutes ago              <random_name>

Agora, vamos podar (prune) todos os containers parados. O comando docker container prune remove todos os containers parados.

docker container prune

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

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

Você deve ver a saída indicando os containers que foram removidos e o espaço total recuperado.

Deleted Containers:
<container_id>
<container_id>

Total reclaimed space: XMB

Para verificar se os containers parados foram removidos, liste todos os containers novamente.

docker ps -a

Desta vez, você não deve ver nenhuma saída, indicando que não há containers (em execução ou parados) restantes.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES

Podar containers parados criados antes de um horário específico

Na etapa anterior, aprendemos como podar (prune) todos os containers parados. Às vezes, você pode querer remover apenas containers parados que foram criados antes de um determinado tempo. Isso pode ser útil para limpar containers antigos, mantendo os mais recentes. Nesta etapa, aprenderemos como podar containers parados criados antes de um tempo específico usando a flag --filter com o filtro until.

Primeiro, vamos criar alguns containers e pará-los para que tenhamos algo para podar.

docker run -d --name container-old-1 ubuntu sleep infinity
docker run -d --name container-old-2 ubuntu sleep infinity

Aguarde alguns segundos e, em seguida, crie outro container. Este será nosso container "mais recente".

sleep 5
docker run -d --name container-new-1 ubuntu sleep infinity

Agora, pare todos os containers.

docker stop container-old-1 container-old-2 container-new-1

Liste todos os containers para ver seu status e tempo de criação.

docker ps -a --format "{{.Names}}\t{{.Status}}\t{{.CreatedAt}}"

Você deve ver uma saída semelhante a esta, com diferentes tempos de criação:

container-old-1 Exited (0) X seconds ago YYYY-MM-DD HH:MM:SS +0000 UTC
container-old-2 Exited (0) X seconds ago YYYY-MM-DD HH:MM:SS +0000 UTC
container-new-1 Exited (0) X seconds ago YYYY-MM-DD HH:MM:SS +0000 UTC

Agora, vamos podar os containers parados que foram criados antes de um tempo específico. Usaremos o filtro until com o comando docker container prune. O filtro until aceita um timestamp ou uma duração. Para este exemplo, usaremos uma duração, especificando que queremos remover containers criados há mais de 10 segundos.

docker container prune --filter "until=10s"

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

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

Você deve ver a saída indicando que os containers mais antigos foram removidos. O container mais recente não deve ser listado como excluído.

Deleted Containers:
<container_id_old_1>
<container_id_old_2>

Total reclaimed space: XMB

Para verificar se apenas os containers mais antigos foram removidos, liste todos os containers novamente.

docker ps -a --format "{{.Names}}\t{{.Status}}"

Você deve ver apenas o container-new-1 listado com o status Exited.

container-new-1 Exited (0) X seconds ago

Podar containers parados com um rótulo específico

Nas etapas anteriores, aprendemos como podar (prune) todos os containers parados e containers parados com base em seu tempo de criação. Nesta etapa, exploraremos outra maneira útil de filtrar containers para poda: usando rótulos (labels). Rótulos são pares chave-valor que você pode anexar a objetos Docker, incluindo containers, para organizá-los e gerenciá-los.

Primeiro, vamos criar alguns containers com rótulos diferentes.

docker run -d --name container-label-app --label app=frontend ubuntu sleep infinity
docker run -d --name container-label-env --label env=development ubuntu sleep infinity
docker run -d --name container-no-label ubuntu sleep infinity

Agora, pare todos os containers.

docker stop container-label-app container-label-env container-no-label

Liste todos os containers e seus rótulos para ver os rótulos que aplicamos.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

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

container-label-app app=frontend
container-label-env env=development
container-no-label

Agora, vamos podar apenas os containers parados que possuem o rótulo app=frontend. Usaremos a flag --filter com o filtro label.

docker container prune --filter "label=app=frontend"

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

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

Você deve ver a saída indicando que o container com o rótulo app=frontend foi removido.

Deleted Containers:
<container_id_app_frontend>

Total reclaimed space: XMB

Para verificar se apenas o container com o rótulo app=frontend foi removido, liste todos os containers novamente.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

Você agora deve ver apenas os containers com o rótulo env=development e sem rótulo.

container-label-env env=development
container-no-label

Você também pode podar containers que não possuem um rótulo específico usando o prefixo ! com o filtro de rótulo. Vamos podar o container que não possui o rótulo env=development.

docker container prune --filter "label!=env=development"

Confirme a remoção digitando y e pressionando Enter.

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

Você deve ver a saída indicando que o container sem o rótulo env=development foi removido.

Deleted Containers:
<container_id_no_label>

Total reclaimed space: XMB

Liste todos os containers mais uma vez para confirmar que apenas o container com o rótulo env=development permanece.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

Você deve ver apenas o container-label-env listado.

container-label-env env=development

Resumo

Neste laboratório, aprendemos como criar e parar containers Docker usando os comandos docker run e docker stop, e como listar containers em execução com docker ps. Em seguida, exploramos o comando docker container prune para remover eficientemente containers parados. Especificamente, praticamos a poda (pruning) de todos os containers parados, a remoção de containers parados criados antes de um tempo específico usando a opção --filter until, e a remoção seletiva de containers parados com base em rótulos (labels) usando a opção --filter label. Estas etapas demonstraram métodos práticos para gerenciar e limpar containers parados em um ambiente Docker.