Registries de imagens
Esta aula aborda registries de imagens Docker, incluindo Docker Hub, registries privados, comandos push/pull, tags e versionamento, além de práticas de segurança. O conteúdo inclui exemplos práticos em bash, exercícios com respostas e referências oficiais.
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:2Isso 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.0Para 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
- Documentação oficial do Docker Hub
- Docker Registry (open source)
- Comando docker push
- Comando docker pull
- Comando docker tag
- Docker Content Trust
- Trivy - Scanner de vulnerabilidades
Exercícios
- Explique a diferença entre Docker Hub e um registry privado. Cite duas vantagens de usar um registry privado em uma empresa.
- Escreva os comandos para enviar a imagem local
meu-apppara o Docker Hub com o usuáriojoaoe tagv2.0. - Por que é recomendado evitar o uso da tag
latestem ambientes de produção? Cite um cenário problemático. - Descreva duas práticas de segurança ao trabalhar com imagens em registries.
- Como você pode configurar um registry privado local na porta 5000 usando Docker? Execute o comando e explique o que ele faz.
docker tag meu-app joao/meu-app:v2.0
docker push joao/meu-app:v2.0latest é 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.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.