O que é um Container Registry
Um Container Registry é um repositório centralizado onde você armazena, gerencia e distribui imagens Docker. Pense nele como um GitHub para imagens de contêiner — assim como você faz push e pull de código, você faz push e pull de imagens Docker. Quando você executa docker run nginx, o Docker procura essa imagem localmente; se não encontrar, ele automaticamente faz download do Registry padrão (Docker Hub). Sem registries, você precisaria compilar a mesma imagem Docker várias vezes em cada máquina ou transferir arquivos manualmente — impraticável em ambientes corporativos com dezenas de aplicações.
Existem três tipos principais: públicos (Docker Hub), fornecidos por plataformas (GitHub Container Registry), e privados autohospedados (Harbor, Nexus). A escolha depende de segurança, custo e controle. Se sua imagem contém código proprietário ou dados sensíveis, usar Docker Hub público é arriscado. Se sua equipe já usa GitHub, o GHCR oferece integração nativa. Se você precisa de auditoria completa, versionamento granular e conformidade, Harbor é a solução robusta.
Docker Hub: O Registry Público Padrão
O Docker Hub é mantido pela Docker Inc. e é o registry padrão da comunidade. Quando você instala Docker, ele já está configurado para usar Docker Hub. É gratuito para repositórios públicos, mas oferece planos pagos para repositórios privados com quotas maiores de downloads. A simplicidade é sua força — ideal para projetos open-source e protótipos, mas inadequado para produção corporativa com dados sensíveis.
Criando e Enviando uma Imagem para Docker Hub
Primeiro, crie uma conta em hub.docker.com e confirme seu email. Depois, autentique-se localmente:
docker login
Você será solicitado a informar seu nome de usuário e token de acesso pessoal (não use sua senha diretamente; crie um PAT nas configurações da conta). Agora crie um Dockerfile simples:
FROM python:3.11-slim
WORKDIR /app
COPY app.py .
RUN pip install flask
CMD ["python", "app.py"]
E um arquivo app.py:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return {"message": "Hello from Docker Hub!"}
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Construa a imagem com a tag no formato seu-usuario/nome-imagem:versao:
docker build -t seu-usuario/meu-app:1.0 .
Agora faça push para Docker Hub:
docker push seu-usuario/meu-app:1.0
Qualquer pessoa agora pode fazer pull dessa imagem públicamente:
docker run -p 5000:5000 seu-usuario/meu-app:1.0
Limitações do Docker Hub para Produção
Docker Hub oferece apenas 6 horas de retenção de build histórico na versão gratuita e limita webhooks. Não há controle granular de permissões — ou o repositório é público (todos podem puxar) ou privado (todos com acesso veem tudo). Não há auditoria nativa de quem puxou qual imagem e quando. Para compliance regulatório (HIPAA, GDPR, PCI-DSS), você precisa de logs detalhados, o que Docker Hub não fornece adequadamente.
GitHub Container Registry: Integração Nativa com GitHub
O GitHub Container Registry (GHCR) é gerenciado pelo GitHub e oferece integração perfeita com GitHub Actions, repositórios e controle de acesso. Cada conta GitHub obtém storage gratuito e pode hospedar imagens privadas sem custo adicional (diferente de Docker Hub que cobra por repositórios privados). A autenticação usa o mesmo token OAuth do GitHub, simplificando gerenciamento de credenciais.
Configurando GHCR e Enviando uma Imagem
O GHCR usa o domínio ghcr.io. Autentique-se usando seu token de acesso pessoal do GitHub (crie em Settings > Developer settings > Personal access tokens com escopos write:packages e read:packages):
echo "seu-token-github" | docker login ghcr.io -u seu-usuario-github --password-stdin
Agora construa e envie uma imagem com a tag GHCR:
docker build -t ghcr.io/seu-usuario-github/meu-app:1.0 .
docker push ghcr.io/seu-usuario-github/meu-app:1.0
A imagem agora está em ghcr.io/seu-usuario-github/meu-app:1.0. Se o repositório for privado, apenas pessoas com acesso ao repositório GitHub podem puxar.
Automação com GitHub Actions
O verdadeiro poder do GHCR é sua integração com GitHub Actions. Crie um workflow que constrói e faz push automaticamente:
name: Construir e Enviar para GHCR
on:
push:
branches:
- main
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v3
- uses: docker/setup-buildx-action@v2
- uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@v4
with:
context: .
push: true
tags: |
ghcr.io/${{ github.repository }}:latest
ghcr.io/${{ github.repository }}:${{ github.sha }}
Salve esse arquivo em .github/workflows/build-and-push.yml. A partir de agora, cada push na branch main dispara o build automaticamente e envia a imagem para GHCR usando o token do GitHub (nenhuma credencial extra necessária). Você pode usar tags semânticas (v1.0.0) para builds mais específicos.
Harbor: Um Registry Privado Corporativo Robusto
Harbor é um projeto open-source mantido pela Cloud Native Computing Foundation (CNCF) que oferece um registry autohospedado com recursos empresariais: controle de acesso baseado em função (RBAC), varredura de vulnerabilidades integrada, replicação entre registries, webhooks, e auditoria completa. Diferente de Docker Hub ou GHCR, você tem controle total — dados nunca saem de sua infraestrutura.
Instalação de Harbor com Docker Compose
Baixe a versão mais recente:
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz
tar xzvf harbor-offline-installer-v2.9.0.tgz
cd harbor
Edite harbor.yml para configurar o hostname e credenciais:
hostname: registry.suaempresa.com
http:
port: 80
https:
port: 443
certificate: /path/to/certificate.crt
private_key: /path/to/private.key
harbor_admin_password: SenhaForte123!
database:
password: PasswordBancoDados123!
data_volume: /data/harbor
Gere certificados SSL (ou use Let's Encrypt):
./prepare
docker-compose up -d
Harbor está agora rodando em https://registry.suaempresa.com. Acesse a interface web com admin/SenhaForte123!.
Autenticação e Push para Harbor
Autentique seu cliente Docker:
docker login registry.suaempresa.com
Crie um novo projeto em Harbor (por exemplo, "backend-team") pela interface web. Depois, faça push de uma imagem:
docker build -t registry.suaempresa.com/backend-team/meu-app:1.0 .
docker push registry.suaempresa.com/backend-team/meu-app:1.0
Varredura de Vulnerabilidades Automática
Harbor integra scanners como Trivy para detectar vulnerabilidades em imagens. Na interface web, vá para Administração > Configuração > Scanners e configure um scanner (Trivy é gratuito e recomendado). Agora, toda imagem enviada será automaticamente escaneada:
docker pull registry.suaempresa.com/backend-team/meu-app:1.0
Na interface web, em Projetos > backend-team > Repositórios, você verá um ícone de escaneamento com o nível de risco (crítico, alto, médio, baixo). Imagens com vulnerabilidades críticas podem ser bloqueadas por política — configure isso em Projetos > backend-team > Políticas.
Replicação e Sincronização entre Registries
Suponha que você tenha dois data centers. Configure replicação em Administração > Gerenciamento de Replicação. Crie uma regra que replica todas as imagens de backend-team/* para outro Harbor:
Origem: registry.suaempresa.com/backend-team
Destino: registry-dr.suaempresa.com/backend-team
Evento: Push de imagem
Agora, quando alguém fizer push para o Harbor principal, a imagem é automaticamente replicada para o backup.
RBAC e Controle de Acesso
Harbor implementa controle granular de acesso. Na interface web, crie um usuário deployer com permissão apenas para pull (não push) em Administração > Gerenciamento de Usuários. Depois, em Projetos > backend-team > Membros, adicione deployer com papel "Guest" (apenas pull). Isso garante que apenas desenvolvedores aprovados possam fazer push, enquanto CI/CD pode apenas puxar imagens.
Comparação Prática e Escolha
Para um projeto pessoal ou open-source, Docker Hub é suficiente e gratuito. Para uma organização GitHub com equipes pequenas e sem requisitos de conformidade rigorosa, GHCR é ideal — nenhuma infraestrutura extra, integração com Actions, e control de acesso alinhado com GitHub. Para empresas com múltiplos times, requisitos de compliance (PCI-DSS, HIPAA), ou múltiplos data centers, Harbor é obrigatório.
A tabela abaixo resume as diferenças críticas:
| Aspecto | Docker Hub | GHCR | Harbor |
|---|---|---|---|
| Custo | Gratuito (público), pago (privado) | Gratuito | Gratuito (auto-hospedado) |
| Auditoria | Limitada | Integrada com GitHub | Completa com webhooks |
| Varredura de Vulnerabilidades | Pago (Snyk) | GitHub Advanced Security | Trivy integrado |
| RBAC Granular | Não | Sim (via GitHub) | Sim (nativo) |
| Replicação | Não | Não | Sim |
| Compliance Regulatório | Inadequado | Adequado | Excelente |
Conclusão
Os Container Registries são pilares da entrega contínua. Docker Hub democratizou a distribuição de imagens, mas é inadequado para produção corporativa. GHCR oferece um ponto de equilíbrio para equipes GitHub — gratuito, integrado e suficiente para startups. Harbor é o padrão ouro para empresas que precisam controlar completamente seus artefatos, implementar políticas de segurança rigorosas e auditar cada ação. Sua escolha deve considerar tamanho da organização, requisitos regulatórios e o investimento em infraestrutura que está disposto a fazer. Na maioria dos casos, você não precisa de apenas um — use GHCR para desenvolvimento/testes e Harbor para produção.