Skip to main content

Harbor na Prática — Parte 4 Enviando Imagens e Configurando a Máquina Local

Nesta parte, vamos configurar o Docker na máquina local para trabalhar com o Harbor e aprender o fluxo completo de push e pull de imagens.


Configurando a máquina local

Antes de interagir com o Harbor via linha de comando, é preciso configurar o Docker para confiar no seu registry.

Cenário 1 — Harbor com HTTPS e certificado válido

Se o Harbor usa HTTPS com um certificado assinado por uma CA reconhecida (Let's Encrypt, CA corporativa), nenhuma configuração adicional é necessária. O Docker já confia nesses certificados.

Cenário 2 — Harbor com HTTPS e certificado autoassinado

Você precisa adicionar o certificado da CA ao Docker.

No Linux:

# Criar o diretório para os certificados do registry
sudo mkdir -p /etc/docker/certs.d/harbor.empresa.com

# Copiar o certificado da CA
sudo cp ca.crt /etc/docker/certs.d/harbor.empresa.com/ca.crt

# Reiniciar o Docker
sudo systemctl restart docker

No Mac (Docker Desktop):

Adicione o certificado via Preferences → Docker Engine ou importe-o nas configurações de confiança do sistema operativo.

Cenário 3 — Harbor com HTTP (sem TLS)

Para registries sem HTTPS, é preciso declarar o endereço como "insecure" no daemon do Docker.

Edite ou crie o arquivo /etc/docker/daemon.json:

{
"insecure-registries": ["harbor.empresa.com:32000"]
}

Reinicie o Docker:

sudo systemctl restart docker

⚠️ Usar HTTP sem TLS é aceitável em ambientes de desenvolvimento local, mas nunca em produção. Qualquer tráfego — incluindo tokens e imagens — trafegará sem criptografia.


Fazendo login no Harbor

docker login harbor.empresa.com

Informe o usuário e senha quando solicitado. Para automatizar:

echo "suasenha" | docker login harbor.empresa.com -u joao.silva --password-stdin

Usando um Robot Account:

echo "TOKEN_DO_ROBOT" | docker login harbor.empresa.com \
-u "robot\$backend+gitlab-ci" --password-stdin

O caractere $ no nome do robot precisa de escape (\$) no shell.

Após o login bem-sucedido, as credenciais são salvas em ~/.docker/config.json.


Estrutura de tags no Harbor

O endereço completo de uma imagem no Harbor segue o padrão:

harbor.empresa.com/<projeto>/<repositório>:<tag>

Exemplos:

harbor.empresa.com/backend/api:v1.4.2
harbor.empresa.com/backend/api:main-a3f9c12
harbor.empresa.com/frontend/web:latest
harbor.empresa.com/base/python:3.12-slim

Fazendo push de uma imagem

Passo 1 — Fazer build da imagem com a tag correta

docker build -t harbor.empresa.com/backend/api:v1.0.0 .

Ou taguear uma imagem existente:

# Imagem local
docker tag minha-api:latest harbor.empresa.com/backend/api:v1.0.0

Passo 2 — Enviar para o Harbor

docker push harbor.empresa.com/backend/api:v1.0.0

Você verá o progresso do upload layer por layer. Após concluir, a imagem estará visível no Harbor em Projects → backend → Repositories.

Enviando múltiplas tags

# Tag de versão semântica
docker tag minha-api:latest harbor.empresa.com/backend/api:v1.0.0
# Tag com hash do commit
docker tag minha-api:latest harbor.empresa.com/backend/api:main-$(git rev-parse --short HEAD)

# Push de ambas
docker push harbor.empresa.com/backend/api:v1.0.0
docker push harbor.empresa.com/backend/api:main-$(git rev-parse --short HEAD)

Fazendo pull de uma imagem

docker pull harbor.empresa.com/backend/api:v1.0.0

Para projetos privados, é preciso estar autenticado (ou usar um Robot Account com permissão de pull).


Verificando as imagens no Harbor

Após o push, você pode inspecionar a imagem via API:

# Listar repositórios do projeto
curl -s "https://harbor.empresa.com/api/v2.0/projects/backend/repositories" \
-u "admin:suasenha" | jq '.[].name'

# Listar tags de um repositório
curl -s "https://harbor.empresa.com/api/v2.0/projects/backend/repositories/api/artifacts" \
-u "admin:suasenha" | jq '.[].tags[].name'

Usando o Trivy para inspecionar vulnerabilidades

Após o push, o Harbor pode escanear a imagem automaticamente (se configurado) ou manualmente via UI:

Projects → backend → Repositories → api → clique na tag → Scan

Ou via API:

curl -X POST \
"https://harbor.empresa.com/api/v2.0/projects/backend/repositories/api/artifacts/v1.0.0/scan" \
-u "admin:suasenha"

Os resultados aparecem na aba Vulnerabilities da imagem, classificados por severidade (Critical, High, Medium, Low).


Deletando imagens

Via UI: Projects → Repositório → selecione a tag → Delete

Via API:

# Deletar uma tag específica
curl -X DELETE \
"https://harbor.empresa.com/api/v2.0/projects/backend/repositories/api/artifacts/v1.0.0/tags/v1.0.0" \
-u "admin:suasenha"

# Deletar o artifact inteiro (todas as tags)
curl -X DELETE \
"https://harbor.empresa.com/api/v2.0/projects/backend/repositories/api/artifacts/sha256:abc123..." \
-u "admin:suasenha"

Deletar uma tag não libera espaço imediatamente. O espaço é recuperado após a execução do Garbage Collection (Administration → Garbage Collection).


Boas práticas de tagging

PráticaExemploPor quê
Versão semânticav1.4.2Rastreável, imutável, previsível
Branch + commitmain-a3f9c12Rastreável ao código exato
Evitar latest em produçãolatest é mutável e causa surpresas
Data (para imagens base)2024-11-15Útil para imagens construídas por agendamento

Próximo artigo

Na Parte 5, vamos configurar o Harbor como proxy cache para Docker Hub, GCR e outros registries — eliminando rate limits e acelerando os pulls no cluster.