Como usar o comando docker image rm para remover imagens

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como gerenciar efetivamente imagens Docker usando o comando docker image rm. Começaremos listando as imagens existentes em seu sistema para entender o que você tem.

Em seguida, exploraremos diferentes cenários para remover imagens, incluindo a tentativa de remover uma imagem com múltiplas tags, remover uma imagem por sua tag, remover uma imagem por seu ID usando a opção force, e, finalmente, remover uma imagem por seu digest. Essa experiência prática o equipará com as habilidades necessárias para limpar imagens Docker não utilizadas ou indesejadas.

Listar imagens existentes

Nesta etapa, aprenderemos como listar as imagens Docker que estão atualmente disponíveis em seu sistema. As imagens Docker são os blocos de construção dos contêineres. Elas são templates somente leitura usados para criar contêineres.

Para listar as imagens, você pode usar o comando docker images. Este comando mostra uma lista de todas as imagens que o Docker baixou ou construiu em sua máquina.

Vamos tentar. Abra seu terminal e execute o seguinte comando:

docker images

Você deve ver uma saída semelhante a esta (as imagens e detalhes exatos podem variar dependendo do que você fez anteriormente com o Docker):

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB
hello-world   latest    d00000000000   2 months ago   13.3kB

A saída fornece várias informações sobre cada imagem:

  • REPOSITORY: O nome da imagem.
  • TAG: Uma versão específica da imagem. latest é a tag padrão se nenhuma for especificada.
  • IMAGE ID: O identificador único para a imagem.
  • CREATED: Há quanto tempo a imagem foi criada.
  • SIZE: O tamanho da imagem.

Compreender as imagens que você tem é o primeiro passo para gerenciá-las. Nas próximas etapas, exploraremos como remover imagens.

Tentar remover uma imagem com múltiplas tags

Nesta etapa, exploraremos o que acontece quando você tenta remover uma imagem Docker que possui múltiplas tags apontando para o mesmo ID da imagem. Este é um cenário comum quando você marca uma imagem com diferentes versões ou nomes.

Primeiro, vamos baixar uma imagem e marcá-la com uma tag adicional. Usaremos a imagem hello-world para este exemplo. Se você já a tiver, o download será muito rápido.

docker pull hello-world

Agora, vamos adicionar outra tag a esta imagem usando o comando docker tag. A sintaxe é docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]. Marcaremos a imagem hello-world:latest com uma nova tag chamada hello-world:mytag.

docker tag hello-world:latest hello-world:mytag

Agora, vamos listar as imagens novamente para ver a nova tag.

docker images

Você deve ver duas entradas para hello-world, uma com a tag latest e outra com a tag mytag, mas ambas terão o mesmo IMAGE ID.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB
hello-world   latest    d00000000000   2 months ago   13.3kB
hello-world   mytag     d00000000000   2 months ago   13.3kB

Agora, vamos tentar remover a imagem usando uma das tags, por exemplo, hello-world:latest, usando o comando docker rmi.

docker rmi hello-world:latest

Você notará que o Docker, na verdade, não remove os dados da imagem em si. Em vez disso, ele remove a tag específica que você especificou. A saída indicará que ela está "Untagged" (sem tag).

Untagged: hello-world:latest

Se você listar as imagens novamente, verá que a entrada hello-world:latest desapareceu, mas a entrada hello-world:mytag (com o mesmo IMAGE ID) ainda existe.

docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB
hello-world   mytag     d00000000000   2 months ago   13.3kB

Isso demonstra que, quando uma imagem tem múltiplas tags, remover uma única tag remove apenas essa referência específica aos dados da imagem. Os dados da imagem em si só são removidos quando a última tag que aponta para ela é removida, ou quando você a remove explicitamente por seu ID (o que abordaremos mais tarde).

Remover uma imagem por tag

Na etapa anterior, vimos que remover uma tag apenas destaga a imagem se outras tags ou contêineres ainda estiverem referenciando-a. Nesta etapa, removeremos a última tag restante para a imagem hello-world, o que deve resultar na remoção dos dados da imagem.

Atualmente, temos a imagem hello-world com a tag mytag. Vamos confirmar isso listando as imagens:

docker images

Você deve ver a entrada hello-world:mytag.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB
hello-world   mytag     d00000000000   2 months ago   13.3kB

Agora, vamos remover a imagem hello-world usando a tag mytag com o comando docker rmi:

docker rmi hello-world:mytag

Desta vez, como mytag era a única tag referenciando este ID de imagem, o Docker removerá tanto a tag quanto os dados da imagem subjacente. A saída mostrará que está "Untagged" (sem tag) e, em seguida, "Deleted" (removido).

Untagged: hello-world:mytag
Deleted: sha256:d000000000000000000000000000000000000000000000000000000000000000
Deleted: sha256:0000000000000000000000000000000000000000000000000000000000000000
... (mais linhas Deleted)

Vamos listar as imagens novamente para confirmar que a imagem hello-world foi removida:

docker images

A imagem hello-world não deve mais aparecer na lista.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB

Isso demonstra a maneira padrão de remover uma imagem quando ela não está sendo usada por nenhum contêiner e possui apenas uma tag.

Remover uma imagem por ID usando a força

Nesta etapa, aprenderemos como remover uma imagem Docker usando seu ID de imagem e, especificamente, como usar a opção de força (-f ou --force) quando necessário. Remover por ID é útil quando você deseja ser preciso sobre qual imagem está removendo, especialmente se várias tags apontam para a mesma imagem.

Primeiro, vamos baixar uma imagem que podemos remover por ID. Usaremos a imagem ubuntu. Se você já a tiver, o download será rápido.

docker pull ubuntu

Agora, liste as imagens para obter o ID da imagem ubuntu.

docker images

Encontre a imagem ubuntu na saída e anote seu IMAGE ID. Será uma longa sequência de caracteres hexadecimais. Você só precisa dos primeiros caracteres (geralmente 3 ou mais) para identificar a imagem de forma exclusiva.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB

Vamos tentar remover a imagem usando seu ID sem a opção de força primeiro. Substitua YOUR_IMAGE_ID pelo ID da imagem real que você anotou na saída de docker images.

docker rmi YOUR_IMAGE_ID

Se a imagem não estiver sendo usada por nenhum contêiner em execução ou parado, este comando provavelmente terá sucesso e removerá a imagem. No entanto, se houver um contêiner baseado nesta imagem, você receberá uma mensagem de erro indicando que a imagem está sendo usada por um contêiner e não pode ser removida.

Para demonstrar o uso da opção de força, vamos primeiro executar um contêiner baseado na imagem ubuntu.

docker run -d ubuntu sleep 3600

Este comando executa um contêiner Ubuntu em modo detached (-d) e o mantém em execução por uma hora (sleep 3600).

Agora, tente remover a imagem ubuntu por seu ID novamente sem a opção de força.

docker rmi YOUR_IMAGE_ID

Você deve receber uma mensagem de erro semelhante a esta:

Error response from daemon: conflict: unable to remove repository reference "ubuntu:latest" (must force) - image is referenced by one or more containers: 000000000000 (created ...)

Este erro ocorre porque um contêiner está usando a imagem. Para remover uma imagem que está sendo usada por um contêiner, você precisa usar a opção de força (-f).

Agora, vamos remover a imagem usando seu ID com a opção de força. Substitua YOUR_IMAGE_ID pelo ID da imagem real.

docker rmi -f YOUR_IMAGE_ID

A opção de força diz ao Docker para remover a imagem mesmo que ela esteja sendo usada por um contêiner. O Docker primeiro parará e removerá quaisquer contêineres que estejam usando a imagem e, em seguida, removerá a própria imagem. A saída mostrará que a imagem e suas camadas foram excluídas.

Untagged: ubuntu:latest
Deleted: sha256:2700000000000000000000000000000000000000000000000000000000000000
Deleted: sha256:0000000000000000000000000000000000000000000000000000000000000000
... (mais linhas Deleted)

Liste as imagens novamente para confirmar que a imagem ubuntu foi removida.

docker images

A imagem ubuntu não deve mais estar na lista.

Usar a opção de força deve ser feito com cautela, pois ela irá parar e remover contêineres sem confirmação adicional.

Remover uma imagem por digest

Nesta etapa final, aprenderemos como remover uma imagem Docker usando seu digest (resumo). Um digest de imagem é um identificador criptograficamente seguro para o conteúdo da imagem. Ele identifica de forma exclusiva as camadas e a configuração exatas de uma imagem, independentemente de suas tags.

Primeiro, vamos baixar uma imagem que podemos remover por digest. Usaremos a imagem alpine para este exemplo.

docker pull alpine

Agora, para ver o digest da imagem, você pode usar o comando docker images --digests.

docker images --digests

Procure a imagem alpine na saída. Você verá uma coluna DIGEST com um valor que começa com sha256:. Este é o digest da imagem.

REPOSITORY    TAG       DIGEST                                                                    IMAGE ID       CREATED        SIZE
ubuntu        latest    <none>                                                                    270000000000   2 weeks ago    77.8MB
alpine        latest    sha256:0000000000000000000000000000000000000000000000000000000000000000   000000000000   3 weeks ago    5.59MB

Para remover a imagem por seu digest, você usa o comando docker rmi seguido pelo nome da imagem e o digest no formato REPOSITORY@DIGEST. Substitua YOUR_ALPINE_DIGEST pelo digest real que você encontrou na saída anterior.

docker rmi alpine@YOUR_ALPINE_DIGEST

A saída mostrará que a imagem foi excluída.

Deleted: sha256:0000000000000000000000000000000000000000000000000000000000000000
Deleted: sha256:0000000000000000000000000000000000000000000000000000000000000000
... (mais linhas Deleted)

Liste as imagens novamente para confirmar que a imagem alpine foi removida.

docker images

A imagem alpine não deve mais estar na lista.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    <none>                                                                    270000000000   2 weeks ago    77.8MB

Remover por digest é a maneira mais específica de remover uma imagem, garantindo que você remova a versão exata da imagem identificada por aquele digest.

Resumo

Neste laboratório, aprendemos como gerenciar imagens Docker usando os comandos docker images e docker rmi. Começamos listando as imagens existentes para entender seu repositório, tag (etiqueta), ID, tempo de criação e tamanho.

Em seguida, exploramos o processo de remoção de imagens. Tentamos remover uma imagem com múltiplas tags, observando que docker rmi remove apenas a tag especificada, não o ID da imagem subjacente, se outras tags ainda a referenciam. Removemos com sucesso uma imagem especificando sua tag e também demonstramos como remover uma imagem por seu ID, incluindo o uso da flag (bandeira) de força (-f) quando necessário. Finalmente, aprendemos como remover uma imagem usando seu digest (resumo), que fornece um identificador único e imutável para o conteúdo da imagem.