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ática | Exemplo | Por quê |
|---|---|---|
| Versão semântica | v1.4.2 | Rastreável, imutável, previsível |
| Branch + commit | main-a3f9c12 | Rastreável ao código exato |
Evitar latest em produção | — | latest é 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.