Docker: Gerenciamento de Imagens Docker

Última atualização: 2026-08-26

As imagens são os blocos de construção centrais do Docker — dominar o gerenciamento de imagens significa dominar o "repositório de software" do mundo dos contêineres.

1. O Que Você Vai Aprender



2. Uma História Real de uma Pessoa Engenheira de Operações

(1) Ponto de Dor: Alerta de Disco no Servidor CI

Bob recebeu um alerta de disco do servidor CI — as imagens Docker estavam ocupando 40 GB de espaço. Ao investigar, ele encontrou um grande número de imagens órfãs <none> (sobras de builds antigos) e cinco versões de imagens Node.js (1,2 GB cada), mesmo que a equipe realmente precisasse apenas das duas versões mais recentes. O disco estava 80% cheio e os builds começaram a falhar.

(2) Solução para Limpeza de Imagens

Bob excluiu 20 GB de imagens não utilizadas com apenas três comandos.

BASH
# Remover imagens dangling (sobras sem tag)
docker image prune -f

# Remover imagens não usadas por nenhum contêiner
docker image prune -a -f

# Verificar uso de disco após a limpeza
docker system df

(3) Benefício: Espaço em disco recuperado

20 GB de espaço foram liberados, o uso de disco caiu de 80% para 35% e os builds CI retomaram a operação normal.



3. Imagens e Docker Hub

(1) Componentes de uma Imagem

Uma imagem Docker é composta por várias camadas somente leitura empilhadas umas sobre as outras, com cada camada representando uma alteração no sistema de arquivos.

100%
graph TB
    L4["CMD ['nginx', '-g', 'daemon off;']<br/>Comando de Inicialização"]
    L3["COPY html /usr/share/nginx/html<br/>Código da Aplicação"]
    L2["RUN apt-get install nginx<br/>Instalar o software"]
    L1["FROM debian:bookworm-slim<br/>Sistema Básico"]
    L4 --> L3 --> L2 --> L1

(2) Convenções de Nomenclatura de Imagens

TEXT 📖 Somente leitura
registry/repository:tag
Componente Descrição Exemplo
registry URL do Repositório (Docker Hub por padrão) docker.io / localhost:5000
repository Nome do Repositório (Pessoa Usuária/Nome da Imagem) library/nginx / myorg/myapp
tag Tag de versão (padrão: latest) 1.25-alpine / latest / v2.0

(3) Convenções Comuns de Nomenclatura de Tags

Sufixo da Tag Significado Referência de Tamanho Casos de Uso
latest Última Versão Padrão Máximo Teste Rápido
alpine Base Alpine Linux Mínimo (5–50 MB) Produção/Restrição de Recursos
slim Debian Mínimo Pequeno (80–150 MB) Produção (requer glibc)
bookworm / jammy Especificar versão Debian/Ubuntu Médio (100–300 MB) Requer bibliotecas de sistema específicas
v1.25.3 Número de versão exato Depende da imagem base Versão fixa para produção


4. Operações Básicas com Imagens

▶ Exemplo: Fazendo pull de imagens Nginx com diferentes tags (Dificuldade: ⭐)

BASH
# Fazer pull do nginx com diferentes tags
docker pull nginx:latest
docker pull nginx:1.25-alpine
docker pull nginx:1.25

# Visualizar imagens baixadas
docker images
💻 Saída:

TEXT 📖 Somente leitura
REPOSITORY   TAG            SIZE
nginx        latest         187MB
nginx        1.25-alpine    42.5MB
nginx        1.25           187MB
💡 Dica: Tags diferentes da mesma imagem base compartilham os mesmos dados subjacentes, então o uso real de armazenamento é muito menor do que a soma dos tamanhos das três imagens (armazenamento com desduplicação).

▶ Exemplo: Visualizando a lista de imagens locais (Dificuldade: ⭐)

BASH
# Listar todas as imagens locais
docker images

# Filtrar por nome do repositório
docker images nginx

# Mostrar apenas IDs das imagens
docker images -q

▶ Exemplo: Tagueando uma imagem (docker tag) (Dificuldade: ⭐⭐)

BASH
# Taguear uma imagem existente para um registro privado
docker tag nginx:1.25-alpine localhost:5000/myapp/nginx:v1

# Verificar a nova tag
docker images | grep myapp
💻 Saída:

TEXT 📖 Somente leitura
localhost:5000/myapp/nginx   v1       42.5MB
📌 Ponto-chave: docker tag Não cria uma cópia da imagem; apenas cria um alias apontando para a mesma imagem. As duas tags compartilham armazenamento e não ocupam espaço adicional.

▶ Exemplo: Excluindo uma imagem (Dificuldade: ⭐⭐)

BASH
# Remover uma imagem por nome:tag
docker rmi nginx:1.25

# Remover por ID da imagem
docker rmi a1b2c3d4e5f6

# Forçar remoção (mesmo se usada por contêineres parados)
docker rmi -f nginx:latest
⚠️ Nota: Uma imagem não pode ser excluída enquanto estiver sendo usada por um contêiner em execução. Você deve primeiro executar docker stop + docker rm no contêiner antes de excluir a imagem.

▶ Exemplo: Verificando uso de disco (Dificuldade: ⭐)

BASH
# Mostrar detalhamento do uso de disco do Docker
docker system df

# Mostrar tamanho detalhado por imagem
docker system df -v
💻 Saída:

TEXT 📖 Somente leitura
TYPE            TOTAL   ACTIVE  SIZE      RECLAIMABLE
Images          5       2       1.2GB     800MB (66%)
Containers      3       1       150MB     120MB (80%)
Local Volumes   2       1       500MB     250MB (50%)
Build Cache     10      0       300MB     300MB (100%)


5. Camadas de Imagem e Cache

(1) O Princípio das Camadas

Cada instrução Dockerfile gera uma camada de imagem. Durante o docker pull, as camadas são baixadas uma a uma, e as camadas existentes são ignoradas.

100%
graph TB
    subgraph "Camadas da Imagem (Compartilhadas, Somente Leitura)"
        L1["Camada 1: SO Base<br/>debian:bookworm-slim"]
        L2["Camada 2: apt install<br/>nginx + dependências"]
        L3["Camada 3: COPY html<br/>Conteúdo personalizado"]
    end
    subgraph "Camada do Contêiner (Gravável)"
        C["Camada do Contêiner<br/>Alterações em tempo de execução<br/>logs, arquivos temporários"]
    end
    C --> L3 --> L2 --> L1

(2) Benefícios das Camadas

Benefícios Descrição
Desduplicação de Armazenamento Apenas uma cópia é armazenada por camada; várias imagens a compartilham
Aceleração de Transferência Ignora camadas existentes durante um pull e baixa apenas novas camadas
Aceleração de Build Camadas não alteradas usam o cache; não são reconstruídas

(3) Visualizar o histórico de build da imagem

BASH
# Mostrar histórico de build da imagem (cada camada)
docker history nginx:1.25-alpine
💻 Saída (trecho):

TEXT 📖 Somente leitura
IMAGE          CREATED       CREATED BY                                      SIZE
e1ade32        2 weeks ago   CMD ["nginx" "-g" "daemon off;"]                0B
<missing>      2 weeks ago   STOPSIGNAL SIGQUIT                              0B
<missing>      2 weeks ago   ENTRYPOINT ["/docker-entrypoint.sh"]            0B
<missing>      2 weeks ago   COPY 15-local-resolvers.envsh /etc...           389B
<missing>      2 weeks ago   COPY 30-tune-worker-processes.sh /etc...        4.61kB
<missing>      2 weeks ago   RUN /bin/sh -c set -x ... && apk add...         30.4MB
<missing>      2 months ago  /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B


6. Política de Limpeza de Imagens

(1) Comparação de Três Comandos de Limpeza

Comando Escopo da Limpeza Risco Cenários Aplicáveis
docker rmi <imagem> Excluir Imagem Especificada Baixo (Controle Preciso) Excluir Imagens Indesejadas Conhecidas
docker image prune Excluir imagens órfãs (tag <none>) Muito baixo (sem referências) Limpeza de rotina
docker image prune -a Excluir todas as imagens não usadas por contêineres Médio (pode excluir algumas que ainda são necessárias) Quando o espaço em disco está baixo
docker system prune Limpar tudo (imagens + contêineres + volumes + cache) Alto (exclusão extensiva) Limpeza abrangente

▶ Exemplo: Limpando Imagens Órfãs (Dificuldade: ⭐)

BASH
# Remover imagens dangling (sem tag)
docker image prune -f
💻 Saída:

TEXT 📖 Somente leitura
Deleted Images:
untagged: <none>
deleted: sha256:a1b2c3d4...
Total reclaimed space: 150MB

(2) Comparação de Tamanhos Comuns de Imagens Base

Imagem Tamanho Gerenciador de Pacotes Características
alpine:3.19 7 MB apk Mínima, musl libc
debian:bookworm-slim 74 MB apt glibc padrão, boa compatibilidade
ubuntu:22.04 77 MB apt Ecossistema rico
node:20-alpine 135 MB apk + npm Runtime Node.js
python:3.12-slim 155 MB apt + pip Runtime Python
golang:1.22 780 MB apt + go Ambiente de compilação


7. Exemplo Completo: Fazer Pull da Imagem → Taguear → Push → Limpar

BASH
# ============================================
# Passo a passo completo: Gerenciamento do ciclo de vida da imagem
# Abrange: pull, tag, push (registro local), limpeza
# ============================================

# 1. Fazer pull da imagem Nginx Alpine
docker pull nginx:1.25-alpine

# 2. Visualizar detalhes da imagem
docker images nginx
docker history nginx:1.25-alpine

# 3. Taguear para um registro local
docker tag nginx:1.25-alpine localhost:5000/web/nginx:v1.0

# 4. Iniciar um registro local (para destino de push)
docker run -d -p 5000:5000 --name registry registry:2

# 5. Fazer push da imagem tagueada para o registro local
docker push localhost:5000/web/nginx:v1.0

# 6. Verificar o push
curl -s http://localhost:5000/v2/web/nginx/tags/list | python3 -m json.tool

# 7. Remover cópias locais
docker rmi localhost:5000/web/nginx:v1.0

# 8. Fazer pull de volta do registro local para verificar
docker pull localhost:5000/web/nginx:v1.0

# 9. Limpar: parar o registro e remover todas as imagens não utilizadas
docker stop registry && docker rm registry
docker image prune -a -f

# 10. Verificar uso de disco final
docker system df
💻 Saída (trecho):

TEXT 📖 Somente leitura
# docker push localhost:5000/web/nginx:v1.0
The push refers to repository [localhost:5000/web/nginx]
5f0e3b...: Pushed
latest: digest: sha256:7be1... size: 1361

# curl http://localhost:5000/v2/web/nginx/tags/list
{"name":"web/nginx","tags":["v1.0"]}

# docker system df
TYPE            TOTAL   ACTIVE  SIZE      RECLAIMABLE
Images          1       0       42.5MB    42.5MB (100%)

❓ Perguntas Frequentes

P: A tag :latest é atualizada automaticamente? R: Não. As tags :latest locais existentes não serão atualizadas automaticamente. Você deve usar explicitamente docker pull nginx:latest para obter a versão mais recente. Em ambientes de produção, evite usar :latest; em vez disso, use um número de versão exato (como nginx:1.25.4) para garantir a reprodutibilidade.

P: Qual é a diferença entre as imagens Alpine e Slim? R: Alpine é baseado em musl libc e BusyBox; é extremamente pequeno (7 MB), mas pode ter problemas de compatibilidade (como com extensões C do Python). Slim é baseado em Debian e usa glibc; oferece boa compatibilidade, mas é maior (80–150 MB). Use Slim sempre que possível, e use Alpine apenas quando o espaço em disco for extremamente limitado.

P: O que é uma imagem dangling? R: Uma imagem sem tag (exibida como <none>:<none>) é tipicamente criada quando um novo build sobrescreve uma imagem antiga — a imagem antiga perde sua tag, mas suas camadas permanecem. Use docker image prune para limpá-la com segurança; isso não afetará nenhuma imagem atualmente em uso.

P: Como visualizar o histórico de build de uma imagem? R: docker history <imagem> exibe o tamanho, o horário de criação e as instruções Dockerfile correspondentes para cada camada. Adicione --no-trunc para visualizar os comandos completos. Esta é uma ferramenta essencial para analisar o tamanho da imagem e otimizar o Dockerfile.

P: Como configurar um repositório privado? R: A maneira mais fácil é usar docker run -d -p 5000:5000 registry:2, que permite configurar um registro local em menos de 5 segundos. Para ambientes de produção, recomendamos usar o Harbor (que inclui interface web, autenticação e varredura de imagens) ou o registro de contêiner de um provedor de nuvem (como AWS ECR ou Alibaba Cloud ACR).

P: Por que o espaço não é liberado após excluir uma imagem? R: O Docker usa OverlayFS para armazenamento em camadas, e várias imagens podem compartilhar as mesmas camadas base. Excluir uma imagem libera apenas as camadas que ela usa exclusivamente. Use docker system df -v para visualizar o espaço real recuperável para cada imagem.


📖 Resumo


📝 Exercícios

  1. Exercício Básico (Dificuldade: ⭐): Faça pull de três imagens Ubuntu com tags diferentes do Docker Hub (latest / 22.04 / 20.04) e compare seus tamanhos usando docker images.
  2. Questão Avançada (Dificuldade: ⭐⭐): Use docker history nginx:latest para analisar as camadas da imagem Nginx, identifique a maior camada e explique a qual operação ela corresponde.
  3. Desafio (Dificuldade: ⭐⭐⭐): Execute docker system df -v para analisar a distribuição de uso de disco do Docker em sua máquina local, depois execute docker image prune -a -f para limpá-lo e compare quanto espaço foi recuperado antes e depois da limpeza.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%