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

Exercícios

  1. Explique a diferença entre Docker Hub e um registry privado, e cite dois cenários onde cada um é mais adequado.
  2. ✓ Resposta: Docker Hub é um serviço público gerenciado pela Docker, ideal para projetos open source e prototipagem, pois oferece acesso fácil a imagens oficiais. Um registry privado é auto-hospedado ou fornecido por um provedor de nuvem, oferecendo controle de acesso, segurança e conformidade, sendo adequado para aplicações empresariais com dados sensíveis ou requisitos de latência. Exemplos: usar Docker Hub para compartilhar uma imagem pública de uma ferramenta; usar um registry privado para armazenar imagens de uma aplicação interna com dados confidenciais.
  3. Descreva o processo completo para enviar uma imagem local para um registry privado, incluindo os comandos necessários.
  4. ✓ Resposta: 1. Construir a imagem: 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.
  5. Qual é o problema de usar a tag latest em produção? Como evitá-lo?
  6. ✓ Resposta: A tag 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.
  7. Cite três práticas de segurança que devem ser adotadas ao trabalhar com registries de imagens.
  8. ✓ Resposta: 1. Usar autenticação forte e autorização baseada em papéis. 2. Habilitar criptografia TLS para comunicação segura. 3. Realizar varredura de vulnerabilidades nas imagens e assinar imagens com Docker Content Trust.
  9. Escreva um comando para puxar uma imagem de um registry privado chamado registry.exemplo.com:5000 com a tag v2.1.
  10. ✓ Resposta: docker pull registry.exemplo.com:5000/nome-da-imagem:v2.1 (substitua nome-da-imagem pelo nome real).