Registries de imagens
Esta aula aborda registries de imagens Docker, incluindo Docker Hub e registries privados, operações de push e pull, versionamento com tags, e práticas de segurança. O conteúdo é prático, com exemplos de comandos e boas práticas para gerenciar imagens em ambientes DevOps.
Registries de imagens são componentes fundamentais no ecossistema DevOps, funcionando como repositórios centralizados para armazenar e distribuir imagens de contêineres. Sem eles, seria inviável gerenciar aplicações em escala, pois cada máquina precisaria construir suas próprias imagens. Nesta aula, vamos explorar os principais conceitos, desde o uso do Docker Hub até a implementação de registries privados, passando por práticas de versionamento e segurança.
Entender como publicar e baixar imagens corretamente é essencial para pipelines de CI/CD, onde a automação depende de acesso rápido e confiável às imagens. Além disso, a segurança em registries é crítica para evitar vulnerabilidades e acessos não autorizados. Vamos mergulhar em cada tópico com exemplos práticos.
Docker Hub e privados
O Docker Hub é o registry público padrão da Docker, onde você encontra milhares de imagens oficiais e comunitárias. Ele permite criar repositórios públicos e privados, mas tem limitações no plano gratuito, como um único repositório privado e limites de pull. Para uso profissional, muitas organizações optam por registries privados, que podem ser auto-hospedados ou fornecidos por serviços como AWS ECR, Google Artifact Registry, Azure Container Registry, ou soluções open source como o Harbor.
Um registry privado oferece maior controle sobre acesso, latência e conformidade, além de permitir armazenamento local em redes isoladas. A configuração básica envolve criar uma conta, autenticar via CLI e usar o endereço do registry nos comandos Docker. Por exemplo, para usar o Docker Hub, você faz login e pode puxar imagens como nginx. Para um registry privado, o endereço é composto pelo host e porta, como registry.meuprojeto.com:5000.
# Login no Docker Hub
docker login -u seu_usuario -p sua_senha
# Pull de imagem pública
docker pull nginx:latest
# Pull de imagem de registry privado
docker pull registry.meuprojeto.com:5000/minha-app:v1.0
push e pull
As operações de push e pull são o coração do uso de registries. docker push envia uma imagem local para o registry, enquanto docker pull baixa uma imagem. Para fazer push, você precisa primeiro marcar (tag) a imagem com o endereço do registry e o repositório desejado. Sem a tag correta, o Docker assume que você quer usar o Docker Hub.
O processo de push envolve autenticação e upload das camadas da imagem. É importante otimizar o tamanho das imagens para reduzir o tempo de upload e download. Por exemplo, usar imagens base menores como alpine e evitar camadas desnecessárias acelera o processo. Vamos ver um exemplo completo:
# Construir a imagem
docker build -t minha-app:v1.0 .
# Marcar para o registry privado
docker tag minha-app:v1.0 registry.meuprojeto.com/minha-app:v1.0
# Enviar para o registry
docker push registry.meuprojeto.com/minha-app:v1.0
# Baixar em outra máquina
docker pull registry.meuprojeto.com/minha-app:v1.0
Tags e versionamento
Tags são rótulos que identificam versões de uma imagem. Elas são essenciais para o versionamento, pois permitem rastrear mudanças e fazer rollbacks. Boas práticas incluem usar tags semânticas como 1.2.3, 1.2, 1 e latest. No entanto, a tag latest é mutável e pode causar inconsistências, então é recomendável não usá-la em produção.
O versionamento deve ser planejado para facilitar a rastreabilidade. Por exemplo, em pipelines, você pode usar o número do build ou o commit SHA como tag, como v1.2.3-abc123. Isso garante que cada imagem seja única e reproduzível. Além disso, o uso de tags imutáveis evita que atualizações acidentais quebrem o ambiente.
# Exemplo de tags
docker tag minha-app:1.2.3 registry.meuprojeto.com/minha-app:1.2.3
docker tag minha-app:1.2.3 registry.meuprojeto.com/minha-app:1.2
docker tag minha-app:1.2.3 registry.meuprojeto.com/minha-app:latest
# Usar o commit SHA
docker tag minha-app:1.2.3 registry.meuprojeto.com/minha-app:1.2.3-$(git rev-parse --short HEAD)
Segurança
A segurança em registries envolve proteger o acesso e garantir a integridade das imagens. Isso inclui autenticação forte, autorização baseada em papéis, criptografia em trânsito e em repouso, e varredura de vulnerabilidades. O Docker Content Trust (DCT) permite assinar imagens, garantindo que elas não foram alteradas. Também é importante usar imagens oficiais e manter um processo de atualização contínua.
Além disso, em registries privados, é fundamental configurar TLS para comunicação segura e usar tokens ou credenciais efêmeras. Para ambientes corporativos, ferramentas como o Harbor oferecem funcionalidades avançadas de segurança, como políticas de replicação e integração com LDAP. Vamos ver um exemplo de como configurar um registry local com autenticação básica:
# Criar um registry local com autenticação
mkdir -p auth
htpasswd -Bc auth/htpasswd usuario
docker run -d -p 5000:5000 --name registry \
-v "$(pwd)"/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
registry:2
Boas práticas e observações finais
Ao trabalhar com registries, adote as seguintes boas práticas: use imagens pequenas e específicas, evite a tag latest em produção, implemente políticas de retenção para limpar versões antigas, e monitore o acesso. Em pipelines CI/CD, sempre autentique de forma segura, usando segredos do ambiente, e não inclua credenciais no código.
Considere também a replicação entre regiões para melhorar a disponibilidade e reduzir latência. Para projetos open source, o Docker Hub é suficiente, mas para empresas, avaliar soluções como o ECR ou Harbor pode trazer benefícios em segurança e integração com o ecossistema de nuvem.
Referências
- Documentação oficial do Docker Hub
- Documentação do Docker Registry
- AWS ECR - Guia do Usuário
- Google Artifact Registry - Documentação
- Harbor - Documentação
- Docker Content Trust
Exercícios
- Explique a diferença entre Docker Hub e um registry privado, e cite dois cenários onde cada um é mais adequado.
- Descreva o processo completo para enviar uma imagem local para um registry privado, incluindo os comandos necessários.
- Qual é o problema de usar a tag
latestem produção? Como evitá-lo? - Cite três práticas de segurança que devem ser adotadas ao trabalhar com registries de imagens.
- Escreva um comando para puxar uma imagem de um registry privado chamado
registry.exemplo.com:5000com a tagv2.1.
docker build -t minha-app:v1.0 . 2. Marcar com o endereço do registry: docker tag minha-app:v1.0 registry.meuprojeto.com/minha-app:v1.0 3. Autenticar no registry: docker login registry.meuprojeto.com 4. Enviar: docker push registry.meuprojeto.com/minha-app:v1.0 Nota: é preciso ter permissão de escrita no repositório.
latest é mutável e não identifica uma versão específica, o que pode causar inconsistências e dificultar rollbacks. Para evitar, use tags imutáveis como 1.2.3 ou o SHA do commit, e não dependa de latest em ambientes de produção.
docker pull registry.exemplo.com:5000/nome-da-imagem:v2.1 (substitua nome-da-imagem pelo nome real).