Nesta aula, vamos explorar os registries de imagens, que são componentes essenciais no ecossistema DevOps. Um registry é um serviço que armazena e distribui imagens de contêineres, permitindo que você compartilhe aplicações entre diferentes ambientes, desde desenvolvimento até produção. Dominar o uso de registries é fundamental para implementar pipelines de CI/CD, versionar aplicações e garantir consistência entre ambientes.

Vamos começar entendendo o Docker Hub, o registry público mais popular, e depois avançar para a configuração de registries privados, que oferecem mais controle e segurança. Em seguida, abordaremos os comandos push e pull, as melhores práticas de tags e versionamento, e finalizaremos com as principais preocupações de segurança ao trabalhar com imagens.

Docker Hub e privados

O Docker Hub é o registry público oficial do Docker, onde você pode encontrar milhares de imagens prontas, como ubuntu, nginx e postgres. Ele também permite que você publique suas próprias imagens, tornando-as disponíveis para a comunidade. Para usar o Docker Hub, você precisa criar uma conta gratuita e fazer login via linha de comando com docker login.

No entanto, em ambientes corporativos, é comum utilizar registries privados para manter as imagens internas, protegidas por autenticação e políticas de acesso. Existem várias opções: o Docker Registry (open source), o Harbor, o Amazon ECR, o Google Artifact Registry e o Azure Container Registry. Esses serviços integram-se com sistemas de autenticação, oferecem auditoria e podem ser configurados em redes privadas.

Para configurar um registry privado simples, você pode usar a imagem oficial do Docker Registry:

docker run -d -p 5000:5000 --name registry registry:2

Isso iniciará um registry local na porta 5000. Você pode então marcar suas imagens locais com o endereço do registry e enviá-las para ele.

push e pull

Os comandos docker push e docker pull são os principais para transferir imagens entre seu ambiente local e um registry. O pull baixa uma imagem para o seu host, enquanto o push envia uma imagem local para o registry.

Antes de enviar uma imagem, você precisa marcá-la com o nome do registry e a tag desejada. Por exemplo, para enviar a imagem minha-app para o Docker Hub com o nome de usuário meuusuario e tag v1.0, execute:

docker tag minha-app meuusuario/minha-app:v1.0
docker push meuusuario/minha-app:v1.0

Para baixar uma imagem, basta usar docker pull:

docker pull nginx:latest

É importante notar que, ao puxar uma imagem sem especificar tag, a tag latest é usada por padrão, mas não é recomendado para produção, pois pode causar inconsistências.

Tags e versionamento

Tags são rótulos que identificam versões específicas de uma imagem. Elas permitem que você gerencie diferentes versões da sua aplicação e garanta que cada ambiente use a versão correta. Boas práticas de versionamento incluem usar tags semânticas, como 1.0.0, 1.0.1, e também tags específicas para ambientes, como dev, staging e prod.

Uma estratégia comum é usar o número do commit ou o build ID como tag, o que facilita o rastreamento. Por exemplo, em um pipeline de CI, você pode gerar tags como build-123 ou sha-abcdef. Também é útil manter tags imutáveis, ou seja, não reutilizar uma tag para uma versão diferente, para evitar que ambientes recebam atualizações inesperadas.

Para listar as tags de uma imagem em um registry, você pode usar a API do registry, mas uma forma simples é usar o comando docker image inspect para ver as tags locais:

docker image inspect minha-app:latest --format '{{.RepoTags}}'

Segurança

A segurança em registries de imagens é crítica, pois imagens comprometidas podem introduzir vulnerabilidades em seus sistemas. Algumas práticas essenciais incluem: usar apenas imagens oficiais ou de fontes confiáveis, escanear imagens em busca de vulnerabilidades, e assinar imagens para garantir sua integridade.

Ferramentas como Trivy, Clair e Anchore podem ser integradas ao seu pipeline para escanear imagens. Além disso, o Docker Content Trust permite assinar imagens, garantindo que elas não foram alteradas. Para habilitar, defina a variável de ambiente DOCKER_CONTENT_TRUST=1.

Em registries privados, configure autenticação forte, use TLS para comunicação segura e limite o acesso por usuário ou equipe. Também é importante monitorar os logs de acesso para detectar atividades suspeitas.

Boas práticas e observações finais

Algumas boas práticas adicionais: sempre especifique a tag ao puxar ou usar imagens em produção, evite usar latest em ambientes críticos, limpe imagens antigas para economizar espaço, e automatize a criação de tags em seu pipeline de CI/CD. Além disso, considere usar um registry com funcionalidades de replicação para distribuir imagens em múltiplas regiões.

Em resumo, registries são fundamentais para o fluxo de trabalho DevOps. Com o conhecimento de Docker Hub, registries privados, push/pull, tags e segurança, você está preparado para gerenciar imagens de forma eficiente e segura.

Referências

Exercícios

  1. Explique a diferença entre Docker Hub e um registry privado. Cite duas vantagens de usar um registry privado em uma empresa.
  2. ✓ Resposta: O Docker Hub é um serviço público de registry, acessível a todos, enquanto um registry privado é restrito a uma organização. Vantagens do privado: maior controle de acesso e segurança, pois as imagens não ficam expostas publicamente; e melhor desempenho em redes locais, pois as imagens podem ser armazenadas internamente, reduzindo latência e dependência de internet.
  3. Escreva os comandos para enviar a imagem local meu-app para o Docker Hub com o usuário joao e tag v2.0.
  4. ✓ Resposta:
    docker tag meu-app joao/meu-app:v2.0
    docker push joao/meu-app:v2.0
  5. Por que é recomendado evitar o uso da tag latest em ambientes de produção? Cite um cenário problemático.
  6. ✓ Resposta: A tag latest é mutável, ou seja, pode ser atualizada a qualquer momento. Se um ambiente de produção usa latest, uma nova versão da imagem pode ser puxada sem controle, causando atualizações não planejadas e potencialmente quebrando a aplicação. Por exemplo, se nginx:latest for atualizada com uma mudança incompatível, o ambiente de produção pode parar de funcionar.
  7. Descreva duas práticas de segurança ao trabalhar com imagens em registries.
  8. ✓ Resposta: Duas práticas: 1) Escanear imagens em busca de vulnerabilidades antes de publicá-las, usando ferramentas como Trivy. 2) Usar Docker Content Trust para assinar imagens, garantindo que elas não foram alteradas desde a criação.
  9. Como você pode configurar um registry privado local na porta 5000 usando Docker? Execute o comando e explique o que ele faz.
  10. ✓ Resposta: O comando é:
    docker run -d -p 5000:5000 --name registry registry:2
    Isso baixa a imagem registry:2 e inicia um contêiner chamado registry que escuta na porta 5000 do host, mapeando para a porta 5000 do contêiner. Assim, você pode usar localhost:5000 como endereço do registry para testar push e pull.