DevOps & CI/CD

Container Registry: Docker Hub, GHCR e Registry Privado com Harbor: Do Básico ao Avançado

13 min de leitura

Container Registry: Docker Hub, GHCR e Registry Privado com Harbor: Do Básico ao Avançado

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 , 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

<h2>O que é um Container Registry</h2>

<p>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 <code>docker run nginx</code>, 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.</p>

<p>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.</p>

<h2>Docker Hub: O Registry Público Padrão</h2>

<p>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.</p>

<h3>Criando e Enviando uma Imagem para Docker Hub</h3>

<p>Primeiro, crie uma conta em <a href="https://hub.docker.com" target="_blank" rel="noopener noreferrer">hub.docker.com</a> e confirme seu email. Depois, autentique-se localmente:</p>

<pre><code class="language-bash">docker login</code></pre>

<p>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:</p>

<pre><code class="language-dockerfile">FROM python:3.11-slim

WORKDIR /app

COPY app.py .

RUN pip install flask

CMD [&quot;python&quot;, &quot;app.py&quot;]</code></pre>

<p>E um arquivo <code>app.py</code>:</p>

<pre><code class="language-python">from flask import Flask

app = Flask(__name__)

@app.route(&quot;/&quot;)

def hello():

return {&quot;message&quot;: &quot;Hello from Docker Hub!&quot;}

if __name__ == &quot;__main__&quot;:

app.run(host=&quot;0.0.0.0&quot;, port=5000)</code></pre>

<p>Construa a imagem com a tag no formato <code>seu-usuario/nome-imagem:versao</code>:</p>

<pre><code class="language-bash">docker build -t seu-usuario/meu-app:1.0 .</code></pre>

<p>Agora faça push para Docker Hub:</p>

<pre><code class="language-bash">docker push seu-usuario/meu-app:1.0</code></pre>

<p>Qualquer pessoa agora pode fazer pull dessa imagem públicamente:</p>

<pre><code class="language-bash">docker run -p 5000:5000 seu-usuario/meu-app:1.0</code></pre>

<h3>Limitações do Docker Hub para Produção</h3>

<p>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.</p>

<h2>GitHub Container Registry: Integração Nativa com GitHub</h2>

<p>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.</p>

<h3>Configurando GHCR e Enviando uma Imagem</h3>

<p>O GHCR usa o domínio <code>ghcr.io</code>. Autentique-se usando seu token de acesso pessoal do GitHub (crie em Settings &gt; Developer settings &gt; Personal access tokens com escopos <code>write:packages</code> e <code>read:packages</code>):</p>

<pre><code class="language-bash">echo &quot;seu-token-github&quot; | docker login ghcr.io -u seu-usuario-github --password-stdin</code></pre>

<p>Agora construa e envie uma imagem com a tag GHCR:</p>

<pre><code class="language-bash">docker build -t ghcr.io/seu-usuario-github/meu-app:1.0 .

docker push ghcr.io/seu-usuario-github/meu-app:1.0</code></pre>

<p>A imagem agora está em <code>ghcr.io/seu-usuario-github/meu-app:1.0</code>. Se o repositório for privado, apenas pessoas com acesso ao repositório GitHub podem puxar.</p>

<h3>Automação com GitHub Actions</h3>

<p>O verdadeiro poder do GHCR é sua integração com GitHub Actions. Crie um workflow que constrói e faz push automaticamente:</p>

<pre><code class="language-yaml">name: Construir e Enviar para GHCR

on:

push:

branches:

  • main

tags:

  • &#039;v*&#039;

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 }}</code></pre>

<p>Salve esse arquivo em <code>.github/workflows/build-and-push.yml</code>. A partir de agora, cada push na branch <code>main</code> 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.</p>

<h2>Harbor: Um Registry Privado Corporativo Robusto</h2>

<p>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.</p>

<h3>Instalação de Harbor com Docker Compose</h3>

<p>Baixe a versão mais recente:</p>

<pre><code class="language-bash">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</code></pre>

<p>Edite <code>harbor.yml</code> para configurar o hostname e credenciais:</p>

<pre><code class="language-yaml">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</code></pre>

<p>Gere certificados SSL (ou use Let&#039;s Encrypt):</p>

<pre><code class="language-bash">./prepare

docker-compose up -d</code></pre>

<p>Harbor está agora rodando em <code>https://registry.suaempresa.com</code>. Acesse a interface web com admin/SenhaForte123!.</p>

<h3>Autenticação e Push para Harbor</h3>

<p>Autentique seu cliente Docker:</p>

<pre><code class="language-bash">docker login registry.suaempresa.com</code></pre>

<p>Crie um novo projeto em Harbor (por exemplo, &quot;backend-team&quot;) pela interface web. Depois, faça push de uma imagem:</p>

<pre><code class="language-bash">docker build -t registry.suaempresa.com/backend-team/meu-app:1.0 .

docker push registry.suaempresa.com/backend-team/meu-app:1.0</code></pre>

<h3>Varredura de Vulnerabilidades Automática</h3>

<p>Harbor integra scanners como Trivy para detectar vulnerabilidades em imagens. Na interface web, vá para <strong>Administração &gt; Configuração &gt; Scanners</strong> e configure um scanner (Trivy é gratuito e recomendado). Agora, toda imagem enviada será automaticamente escaneada:</p>

<pre><code class="language-bash">docker pull registry.suaempresa.com/backend-team/meu-app:1.0</code></pre>

<p>Na interface web, em <strong>Projetos &gt; backend-team &gt; Repositórios</strong>, 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 <strong>Projetos &gt; backend-team &gt; Políticas</strong>.</p>

<h3>Replicação e Sincronização entre Registries</h3>

<p>Suponha que você tenha dois data centers. Configure replicação em <strong>Administração &gt; Gerenciamento de Replicação</strong>. Crie uma regra que replica todas as imagens de <code>backend-team/*</code> para outro Harbor:</p>

<pre><code>Origem: registry.suaempresa.com/backend-team

Destino: registry-dr.suaempresa.com/backend-team

Evento: Push de imagem</code></pre>

<p>Agora, quando alguém fizer push para o Harbor principal, a imagem é automaticamente replicada para o backup.</p>

<h3>RBAC e Controle de Acesso</h3>

<p>Harbor implementa controle granular de acesso. Na interface web, crie um usuário <code>deployer</code> com permissão apenas para pull (não push) em <strong>Administração &gt; Gerenciamento de Usuários</strong>. Depois, em <strong>Projetos &gt; backend-team &gt; Membros</strong>, adicione <code>deployer</code> com papel &quot;Guest&quot; (apenas pull). Isso garante que apenas desenvolvedores aprovados possam fazer push, enquanto CI/CD pode apenas puxar imagens.</p>

<h2>Comparação Prática e Escolha</h2>

<p>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.</p>

<p>A tabela abaixo resume as diferenças críticas:</p>

<div class="table-wrap"><table><thead><tr><th>Aspecto</th><th>Docker Hub</th><th>GHCR</th><th>Harbor</th></tr></thead><tbody><tr><td><strong>Custo</strong></td><td>Gratuito (público), pago (privado)</td><td>Gratuito</td><td>Gratuito (auto-hospedado)</td></tr><tr><td><strong>Auditoria</strong></td><td>Limitada</td><td>Integrada com GitHub</td><td>Completa com webhooks</td></tr><tr><td><strong>Varredura de Vulnerabilidades</strong></td><td>Pago (Snyk)</td><td>GitHub Advanced Security</td><td>Trivy integrado</td></tr><tr><td><strong>RBAC Granular</strong></td><td>Não</td><td>Sim (via GitHub)</td><td>Sim (nativo)</td></tr><tr><td><strong>Replicação</strong></td><td>Não</td><td>Não</td><td>Sim</td></tr><tr><td><strong>Compliance Regulatório</strong></td><td>Inadequado</td><td>Adequado</td><td>Excelente</td></tr></tbody></table></div>

<h2>Conclusão</h2>

<p>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.</p>

<h2>Referências</h2>

<ol>

<li><a href="https://docs.docker.com/docker-hub/" target="_blank" rel="noopener noreferrer">Documentação Oficial do Docker Hub</a></li>

<li><a href="https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry" target="_blank" rel="noopener noreferrer">GitHub Container Registry Documentation</a></li>

<li><a href="https://goharbor.io/docs/" target="_blank" rel="noopener noreferrer">Harbor Project Official Documentation</a></li>

<li><a href="https://www.cncf.io/" target="_blank" rel="noopener noreferrer">Cloud Native Computing Foundation - Container Registry Best Practices</a></li>

<li><a href="https://docs.docker.com/engine/security/" target="_blank" rel="noopener noreferrer">Docker Security Best Practices</a></li>

</ol>

<p>&lt;!-- FIM --&gt;</p>

Comentários

Mais em DevOps & CI/CD

Kubernetes Fundamentos: Arquitetura, Componentes e kubectl na Prática: Do Básico ao Avançado
Kubernetes Fundamentos: Arquitetura, Componentes e kubectl na Prática: Do Básico ao Avançado

Entendendo Kubernetes: O Orquestrador de Contêineres Kubernetes é uma platafo...

Guia Completo de Grafana: Dashboards, Data Sources e Alertas Visuais
Guia Completo de Grafana: Dashboards, Data Sources e Alertas Visuais

Introdução ao Grafana e sua Importância no Monitoramento Moderno Grafana é um...

Crossplane: Infraestrutura como Código dentro do Kubernetes na Prática
Crossplane: Infraestrutura como Código dentro do Kubernetes na Prática

O que é Crossplane e por que você deve aprender Crossplane é um framework ope...