Harbor — prywatny rejestr Docker z skanowaniem obrazów
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS i serwery
Przechowywanie obrazów Docker na Docker Hub wiąże się z limitami pull rate, brakiem gwarancji prywatności i ryzykiem zależności od zewnętrznego serwisu. Harbor to CNCF Graduated prywatny rejestr kontenerów, który stawiasz na własnym VPS. Oferuje nieograniczone prywatne repozytoria, wbudowane skanowanie podatności (Trivy), kontrolę dostępu RBAC, replikację między rejestrami i wsparcie Helm chartów. Ten artykuł przeprowadza przez instalację, konfigurację projektów, robot accounts i integrację z Kubernetes.
Instalacja Harbor przez Docker Compose
Harbor dystrybuuje offline installer — spakowany archiwum zawierający wszystkie obrazy Docker i skrypt instalacyjny. Nie potrzebujesz dostępu do Docker Hub podczas instalacji.
# Pobierz offline installer (sprawdz aktualna wersje na github.com/goharbor/harbor) wget https://github.com/goharbor/harbor/releases/download/v2.12.0/harbor-offline-installer-v2.12.0.tgz tar xvf harbor-offline-installer-v2.12.0.tgz cd harbor # Konfiguracja cp harbor.yml.tmpl harbor.yml nano harbor.yml # Kluczowe ustawienia w harbor.yml: # hostname: harbor.example.com # http: # port: 80 # https: # port: 443 # certificate: /etc/harbor/tls/harbor.crt # private_key: /etc/harbor/tls/harbor.key # harbor_admin_password: zmien-to-haslo # database: # password: mocne-haslo-db # Wygeneruj certyfikat (lub uzyj Let's Encrypt) mkdir -p /etc/harbor/tls openssl genrsa -out /etc/harbor/tls/ca.key 4096 openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=PL/ST=Mazovia/L=Warsaw/O=MyOrg/CN=harbor.example.com" \ -key /etc/harbor/tls/ca.key \ -out /etc/harbor/tls/ca.crt # (dla produkcji: certbot z Let's Encrypt lub własne CA) # Instalacja sudo ./install.sh --with-trivy # Harbor uruchamia sie przez docker compose w katalogu /harbor
Projekty, użytkownicy i robot accounts
Harbor organizuje obrazy w projekty — odpowiedniki organizacji na Docker Hub. Każdy projekt ma własnych użytkowników z rolami (Guest, Developer, Maintainer, ProjectAdmin) i ustawienia bezpieczeństwa.
# Zaloguj sie do Harbor przez CLI
docker login harbor.example.com
# Username: admin
# Password: (harbor_admin_password)
# Push obrazu
docker tag myapp:latest harbor.example.com/myproject/myapp:latest
docker push harbor.example.com/myproject/myapp:latest
# Pull obrazu
docker pull harbor.example.com/myproject/myapp:latest
# Robot accounts przez Harbor API (lub UI: Admin → Robot Accounts)
# Uzyj robot w CI/CD zamiast hasla admina
# Konfiguracja Docker demona dla self-signed cert (na kliencie Docker)
# /etc/docker/daemon.json
{
"insecure-registries": ["harbor.example.com"]
}
# LUB skopiuj CA cert:
sudo mkdir -p /etc/docker/certs.d/harbor.example.com
sudo cp /etc/harbor/tls/ca.crt /etc/docker/certs.d/harbor.example.com/ca.crt
sudo systemctl restart docker Skanowanie podatności Trivy
Harbor z --with-trivy automatycznie skanuje każdy push nowego obrazu. Trivy sprawdza
warstwy obrazu pod kątem CVE w bazach NVD, GitHub Security Advisories, Red Hat, Debian i innych.
Możesz ustawić Prevent vulnerable images from running
— Harbor zablokuje pull obrazów z podatnościami powyżej ustalonego severity.
- Scan on push: automatyczny skan po każdym docker push — wyniki widoczne w UI projektu w ciągu kilkudziesięciu sekund.
- Scheduled scans: codzienne skanowanie istniejących obrazów (bazy CVE są aktualizowane, stary obraz może stać się podatny).
- Vulnerability threshold: Project → Configuration → Prevent vulnerable images — blokuje pull obrazów z CVE o severity HIGH lub CRITICAL.
- Trivy DB update: Harbor pobiera bazę CVE automatycznie; możesz wymusić aktualizację przez UI: Administration → Interrogation Services → Update.
Replikacja między rejestrami
Harbor obsługuje replikację push i pull między wieloma rejestrami: Harbor, Docker Hub, ECR (AWS), GCR (Google), ACR (Azure) i Quay. Przydatne do geo-replikacji (registry w PL i w DE) lub tworzenia lustrzanej kopii Docker Hub dla szybszych pullów.
# Konfiguracja replikacji przez Harbor API # 1. Dodaj zdalny rejestr (target): # Administration → Registries → New Endpoint # Typ: Harbor / Docker Hub / AWS ECR etc. # URL, user/token drugiego rejestru # 2. Utworz regule replikacji: # Administration → Replications → New Replication Rule # Mode: Push-based (push do remote po lokalnym push) # Source: myproject/** (filter - wszystkie obrazy z projektu) # Destination: myproject/ (katalog docelowy) # Trigger: Event-based (na kazdy push) lub Schedule # Przykladowy workflow: lokalny Harbor → kopia na Docker Hub # Kazdy push do harbor.example.com/myproject/myapp # automatycznie replikuje do docker.io/myorg/myapp
Integracja z Kubernetes (imagePullSecret)
# Stworz Secret z credentials Harbor (robot account) kubectl create secret docker-registry harbor-registry \ --docker-server=harbor.example.com \ --docker-username=robot\$myproject+ci-robot \ --docker-password=ROBOT_TOKEN \ [email protected] \ -n myapp-namespace # Deployment z imagePullSecret # k8s/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 2 template: spec: imagePullSecrets: - name: harbor-registry containers: - name: myapp image: harbor.example.com/myproject/myapp:latest # Dodaj do ServiceAccount (globalnie dla namespace): kubectl patch serviceaccount default \ -p '{"imagePullSecrets": [{"name": "harbor-registry"}]}' \ -n myapp-namespace
Porównanie Harbor vs alternatywy
| Cecha | Harbor (self-hosted) | Docker Hub | GitHub Container Registry |
|---|---|---|---|
| Koszt | Koszt VPS (~20-80 PLN/msc) | Free / Pro $5/msc | Free (w pakietach GitHub) |
| Prywatne repo | Nieograniczone | 1 free, $5/msc więcej | Tak (płatne powyżej limitu) |
| Skanowanie podatności | Trivy (wbudowany) | Snyk (plany płatne) | Dependabot (code, nie images) |
| Kontrola dostępu RBAC | Pełna (projekty, role) | Podstawowa | Przez GitHub permissions |
| Helm Charts | Tak (OCI) | Nie | Tak (OCI) |
| Pull rate limits | Brak | 100-200/6h (anonymous) | Brak dla uwierzytelnionych |