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
- Usando o Repositório de Imagens Docker Hub
- Convenções de Nomenclatura para Tags de Imagem
- Fazendo Pull e Push em Repositórios
- Camadas de Imagem e Mecanismos de Cache
- Política de Limpeza de Imagens
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.
# 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.
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
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: ⭐)
# 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
REPOSITORY TAG SIZE
nginx latest 187MB
nginx 1.25-alpine 42.5MB
nginx 1.25 187MB
▶ Exemplo: Visualizando a lista de imagens locais (Dificuldade: ⭐)
# 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: ⭐⭐)
# 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
localhost:5000/myapp/nginx v1 42.5MB
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: ⭐⭐)
# 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
docker stop + docker rm no contêiner antes de excluir a imagem.
▶ Exemplo: Verificando uso de disco (Dificuldade: ⭐)
# Mostrar detalhamento do uso de disco do Docker
docker system df
# Mostrar tamanho detalhado por imagem
docker system df -v
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.
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
# Mostrar histórico de build da imagem (cada camada)
docker history nginx:1.25-alpine
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: ⭐)
# Remover imagens dangling (sem tag)
docker image prune -f
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
# ============================================
# 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
# 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:latestlocais existentes não serão atualizadas automaticamente. Você deve usar explicitamentedocker pull nginx:latestpara 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 (comonginx: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. Usedocker image prunepara 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-truncpara 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 -vpara visualizar o espaço real recuperável para cada imagem.
📖 Resumo
- A imagem é composta por camadas somente leitura empilhadas umas sobre as outras; o armazenamento em camadas permite desduplicação e cache para otimização de desempenho.
- Convenção de nomenclatura de imagens:
registry/repository:tag; evite usar:latestno ambiente de produção docker pull/images/tag/rmisão as quatro operações básicas do gerenciamento de imagensdocker tagCria um alias sem copiar a imagem;docker rmiLimpa contêineres associados antes de excluir a imagem- Use
docker image prunepara limpar imagens flutuantes; usedocker system prunepara uma limpeza abrangente. - Alpine é a menor (7 MB), mas pode ter baixa compatibilidade; Slim oferece boa compatibilidade (80–150 MB). Escolha a que melhor se adapta às suas necessidades.
📝 Exercícios
- 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 usandodocker images. - Questão Avançada (Dificuldade: ⭐⭐): Use
docker history nginx:latestpara analisar as camadas da imagem Nginx, identifique a maior camada e explique a qual operação ela corresponde. - Desafio (Dificuldade: ⭐⭐⭐): Execute
docker system df -vpara analisar a distribuição de uso de disco do Docker em sua máquina local, depois executedocker image prune -a -fpara limpá-lo e compare quanto espaço foi recuperado antes e depois da limpeza.