Harbor mit Docker installieren: CNCF-zertifizierte Container-Registry mit Trivy-Scanning und RBAC
Harbor ist eine CNCF-Container-Registry mit Trivy-Schwachstellenscans, RBAC und Image-Signierung. Die Anleitung zeigt die Installation mit dem offiziellen Installer auf einem Linux-Host, von der harbor.yml bis zum ersten Image-Push.
Geprüft am 30.09.2026 · für harbor 2.15.2
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Eine private Registry macht Sie unabhängig von Docker Hub und Cloud-Anbietern. Harbor (CNCF Graduated Project) ergänzt die Image-Ablage um Schwachstellen-Scans mit Trivy, rollenbasierte Zugriffskontrolle (RBAC), Image-Signierung mit Cosign oder Notation, unveränderliche Tags und Replikation zu anderen Registries. Diese Anleitung installiert Harbor v2.15.2 mit dem offiziellen Installer per Docker Compose auf einem Linux-Host.
Voraussetzungen
- Linux-Host oder VM (Ubuntu 22.04/24.04 oder RHEL/Rocky empfohlen) mit fester IP-Adresse oder DNS-Eintrag;
localhostist als Hostname nicht nutzbar. - Docker Engine 20.10+ und Docker Compose Plugin v2.3+ (
docker compose), siehe Docker und Docker Compose auf Linux installieren. - Mindestressourcen: 2 CPU-Kerne, 4 GB RAM, 40 GB freier Disk-Speicher; Produktionsempfehlung: 4 CPU, 8 GB RAM, 160 GB Disk.
- OpenSSL für Zertifikate, wget und cosign für Download und Signaturprüfung.
- Optional für Produktion: TLS-Zertifikat (Let's Encrypt oder selbst-signiert); einen vorgeschalteten Reverse-Proxy beschreibt Traefik als Docker-Reverse-Proxy einrichten.
- Internetzugang: Der Online-Installer zieht die Images von Docker Hub.
Harbor-Eckdaten im Überblick
| Eigenschaft | Wert |
|---|---|
| Aktuelle stabile Version | v2.15.2 (Juli 2026) |
| Lizenz | Apache 2.0, CNCF Graduated |
| Architektur | amd64, arm64 |
| Mindest-RAM | 4 GB (Produktion: 8 GB) |
| Web-UI Port (HTTP) | 80 |
| HTTPS-Port | 443 |
| Haupt-Datenverzeichnis | /data (konfigurierbar) |
| Log-Verzeichnis | /var/log/harbor |
| Service / Image | Funktion |
|---|---|
| goharbor/nginx-photon:v2.15.2 | Reverse-Proxy, einziger externer Einstiegspunkt |
| goharbor/harbor-portal:v2.15.2 | Web-UI (Nginx-basiert) |
| goharbor/harbor-core:v2.15.2 | Zentrale API und Business-Logik |
| goharbor/harbor-jobservice:v2.15.2 | Async-Jobs (Replikation, Garbage Collection) |
| goharbor/registry-photon:v2.15.2 | OCI-Distribution-Registry |
| goharbor/harbor-registryctl:v2.15.2 | Registry-Controller |
| goharbor/harbor-db:v2.15.2 | PostgreSQL 18 (intern) |
| goharbor/valkey-photon:v2.15.2 | Valkey als Cache (ersetzt ab 2.15.2 Redis, intern) |
| goharbor/harbor-log:v2.15.2 | Zentraler Syslog-Aggregator |
| goharbor/trivy-adapter-photon:v2.15.2 | Vulnerability-Scanner (mit --with-trivy) |
Schritt 1: Installer herunterladen und Signatur prüfen
Laden Sie den Online-Installer v2.15.2 herunter und prüfen Sie die Signatur. Die Releases enthalten statt einer .asc-Datei ein Sigstore-Bundle, das Sie mit cosign prüfen:
# Installer und Sigstore-Bundle herunterladen
wget https://github.com/goharbor/harbor/releases/download/v2.15.2/harbor-online-installer-v2.15.2.tgz
wget https://github.com/goharbor/harbor/releases/download/v2.15.2/harbor-online-installer-v2.15.2.tgz.sigstore.json
# Signatur prüfen
cosign verify-blob \
--bundle harbor-online-installer-v2.15.2.tgz.sigstore.json \
--certificate-identity https://github.com/goharbor/harbor/.github/workflows/publish_release.yml@refs/tags/v2.15.2 \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
harbor-online-installer-v2.15.2.tgz
# Archiv entpacken
tar xzvf harbor-online-installer-v2.15.2.tgz
cd harborVerifizieren: cosign meldet Verified OK. ls im Verzeichnis harbor/ zeigt common.sh, harbor.yml.tmpl, install.sh, LICENSE und prepare.
Schritt 2: harbor.yml konfigurieren
Alle Parameter (Hostname, Passwörter, HTTPS, Trivy) stehen in harbor.yml. Das Skript prepare überträgt sie in die Konfiguration der Container.
cp harbor.yml.tmpl harbor.yml
nano harbor.ymlDie folgende Minimalkonfiguration eignet sich für Test und Entwicklung (nur HTTP). Für den Produktivbetrieb aktivieren Sie HTTPS (Schritt 6).
# harbor.yml – Minimalkonfiguration (HTTP, Test/Entwicklung)
# WICHTIG: 192.168.1.100 durch Ihre IP oder Ihren FQDN ersetzen.
# localhost/127.0.0.1/0.0.0.0 funktionieren NICHT.
hostname: 192.168.1.100
http:
port: 80
# Für Produktion: HTTPS aktivieren und Zertifikate hinterlegen
# https:
# port: 443
# certificate: /data/cert/yourdomain.crt
# private_key: /data/cert/yourdomain.key
harbor_admin_password: MeinSicheresPasswort123!
database:
password: MeinDBPasswort456!
max_idle_conns: 100
max_open_conns: 900
data_volume: /data
trivy:
ignore_unfixed: false
skip_update: false
# github_token: IHR_GITHUB_TOKEN # verhindert Rate-Limits bei DB-Updates
jobservice:
max_job_workers: 10
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harborAlle Clients müssen den hostname erreichen, Harbor nutzt ihn für Tokens und Callbacks. harbor_admin_password gilt nur beim ersten Start, spätere Änderungen erfolgen in der Web-UI.
Verifizieren: grep -E "^hostname|admin_password|^ port" harbor.yml zeigt Ihre Werte, der Hostname ist weder localhost noch 127.0.0.1 oder 0.0.0.0.
Schritt 3: Installation ausführen
Das Skript prüft Docker, erzeugt Secrets und docker-compose.yml und zieht die Images.
# Mit Trivy-Vulnerability-Scanner installieren (empfohlen)
sudo ./install.sh --with-trivy--with-trivy startet zusätzlich den trivy-adapter und registriert ihn als Standard-Scanner. Am Ende startet es Harbor mit docker compose up -d.
Verifizieren: docker compose ps im Verzeichnis harbor/ zeigt alle Dienste als Up oder Up (healthy):
docker compose psErwartete Ausgabe (gekürzt):
NAME IMAGE STATUS
harbor-core goharbor/harbor-core:v2.15.2 Up (healthy)
harbor-db goharbor/harbor-db:v2.15.2 Up (healthy)
harbor-jobservice goharbor/harbor-jobservice:v2.15.2 Up (healthy)
harbor-log goharbor/harbor-log:v2.15.2 Up (healthy)
harbor-portal goharbor/harbor-portal:v2.15.2 Up (healthy)
nginx goharbor/nginx-photon:v2.15.2 Up (healthy)
redis goharbor/valkey-photon:v2.15.2 Up (healthy)
registry goharbor/registry-photon:v2.15.2 Up (healthy)
registryctl goharbor/harbor-registryctl:v2.15.2 Up (healthy)
trivy-adapter goharbor/trivy-adapter-photon:v2.15.2 Up (healthy)Schritt 4: Web-UI aufrufen und Erst-Einrichtung
Öffnen Sie http://192.168.1.100 (Ihr Hostname) im Browser. Harbor zeigt die Anmeldeseite.
- Benutzername:
admin - Passwort: Wert von
harbor_admin_password
Ändern Sie nach der ersten Anmeldung sofort das Admin-Passwort: Admin-Menü (oben rechts) → Change Password. Danach:
- Projekt anlegen: Projects → New Project, z. B.
meinprojekt(öffentlich oder privat) - Benutzer anlegen: Administration → Users → New User und dem Projekt eine Rolle zuweisen (Developer, Maintainer etc.)
- Trivy-Scanner prüfen: Administration → Interrogation Services: Trivy ist als Standard-Scanner aufgeführt und erreichbar
Verifizieren: Prüfen Sie die Erreichbarkeit per curl:
curl -I http://192.168.1.100
# Erwartete Antwort: HTTP/1.1 200 OK oder 302 Found (Weiterleitung zur Login-Seite)Zusätzlich zeigt docker compose logs core | grep -i error keine Fehler. (Dienstname core, nicht Containername harbor-core).
Schritt 5: Docker-Client konfigurieren und erstes Image pushen
Bei reinem HTTP (Test) tragen Sie die Registry beim Client als „insecure“ ein. Achtung: Der Neustart des Docker-Dienstes stoppt kurz alle Container dieses Hosts.
# /etc/docker/daemon.json anpassen (HTTP-only, nur für Test/Entwicklung)
sudo nano /etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.100"]
}
sudo systemctl restart dockerBei HTTPS mit eigener CA kopieren Sie stattdessen das CA-Zertifikat in das Zertifikatsverzeichnis von Docker (ohne Neustart wirksam):
sudo mkdir -p /etc/docker/certs.d/192.168.1.100
sudo cp /data/cert/ca.crt /etc/docker/certs.d/192.168.1.100/Melden Sie sich an und pushen Sie das erste Image:
# Bei Harbor anmelden
docker login 192.168.1.100
# Username: admin
# Password: (Ihr Admin-Passwort)
# Beliebiges lokales Image mit dem Harbor-Pfad taggen
# Schema: <hostname>/<projekt>/<imagename>:<tag>
docker tag nginx:latest 192.168.1.100/meinprojekt/nginx:latest
# Image in die Harbor-Registry pushen
docker push 192.168.1.100/meinprojekt/nginx:latest
# Image aus der Registry ziehen
docker pull 192.168.1.100/meinprojekt/nginx:latestDas Projekt meinprojekt muss vorher in der Web-UI angelegt sein.
Verifizieren: Öffnen Sie im Browser Projects → meinprojekt → Repositories. Das Image erscheint mit Tag, Größe und nach dem Trivy-Scan mit einem Schwachstellenbericht. Alternativ per API:
curl -u 'admin:MeinSicheresPasswort123!' \
http://192.168.1.100/api/v2.0/projects/meinprojekt/repositories
# Erwartete Antwort: JSON-Array mit dem nginx-RepositorySchritt 6: HTTPS für den Produktionsbetrieb einrichten
Im Produktivbetrieb ist HTTPS Pflicht, mit selbst-signiertem oder öffentlichem Zertifikat. Zertifikate mit certbot beschreibt Let's Encrypt mit certbot – TLS-Zertifikate ohne Reverse-Proxy.
Für ein selbst-signiertes Zertifikat:
sudo mkdir -p /data/cert
cd /data/cert
# CA-Zertifikat erstellen
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=DE/ST=Bayern/L=Muenchen/O=MeinUnternehmen/CN=192.168.1.100" \
-key ca.key -out ca.crt
# Server-Zertifikat erstellen
openssl genrsa -out yourdomain.key 4096
openssl req -sha512 -new \
-subj "/C=DE/ST=Bayern/L=Muenchen/O=MeinUnternehmen/CN=192.168.1.100" \
-key yourdomain.key -out yourdomain.csr
# v3.ext-Datei für SAN erstellen
cat > v3.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth
subjectAltName=IP:192.168.1.100
EOF
# Zertifikat signieren
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial \
-in yourdomain.csr -out yourdomain.crtAktivieren Sie dann HTTPS in harbor.yml (im harbor/-Verzeichnis):
hostname: 192.168.1.100
# http-Block entfernen oder auskommentieren
# http:
# port: 80
https:
port: 443
certificate: /data/cert/yourdomain.crt
private_key: /data/cert/yourdomain.keyErzeugen Sie die Konfiguration nach jeder Änderung an harbor.yml neu:
cd /path/to/harbor
sudo ./prepare
docker compose down
docker compose up -dVerifizieren: curl -k -I https://192.168.1.100 muss HTTP/2 200 oder HTTP/1.1 302 Found zurückgeben. Mit dem CA-Zertifikat ohne -k: curl --cacert /data/cert/ca.crt -I https://192.168.1.100.
Schritt 7: Harbor verwalten – Lifecycle-Management
Führen Sie alle Befehle im Verzeichnis harbor/ aus, dort liegt die docker-compose.yml:
cd /path/to/harbor
# Status aller Dienste anzeigen
docker compose ps
# Logs eines Dienstes verfolgen (Dienstname, z. B. core)
docker compose logs -f core
# Harbor stoppen (Daten bleiben erhalten)
docker compose stop
# Harbor wieder starten
docker compose start
# Alle Container neu starten (nach Konfigurationsänderung)
docker compose down
docker compose up -d
# ACHTUNG: -v löscht auch alle Named Volumes (Datenverlust!)
# docker compose down -v # NUR für komplettes Reset/Neuinstallation verwendenNach Änderungen an harbor.yml führen Sie vor dem Neustart sudo ./prepare aus, sonst bleibt die alte Konfiguration aktiv.
Verifizieren: Nach dem Neustart zeigt docker compose ps alle Dienste als Up, docker compose logs core | tail -20 enthält keine Fehler.
Schritt 8: Harbor auf eine neue Version aktualisieren
Ablauf laut offizieller Upgrade-Doku. Die Datenbankmigration übernimmt core beim Start. Ab v2.15.2 hebt harbor-db die interne Datenbank beim ersten Start per pg_upgrade von PostgreSQL 15 auf 18, das verlängert den Start.
# 1. Alte Instanz stoppen
cd /opt/harbor
docker compose down
# 2. Installer-Verzeichnis und Datenbank sichern (Pflicht)
sudo mv /opt/harbor /opt/backup/harbor
sudo cp -a /data/database /opt/backup/
# 3. Neuen Installer laden, prüfen (Schritt 1) und entpacken
cd /opt
wget https://github.com/goharbor/harbor/releases/download/vX.Y.Z/harbor-online-installer-vX.Y.Z.tgz
tar xzvf harbor-online-installer-vX.Y.Z.tgz
# 4. Alte harbor.yml übernehmen und auf das neue Schema migrieren
cp /opt/backup/harbor/harbor.yml /opt/harbor/harbor.yml
docker run -it --rm -v /:/hostfs goharbor/prepare:vX.Y.Z migrate -i /opt/harbor/harbor.yml
# 5. Installer ausführen
cd /opt/harbor
sudo ./install.sh --with-trivyvX.Y.Z ist die Zielversion. Bei Daten mit Umlauten empfiehlt das Projekt nach dem Wechsel auf PostgreSQL 18 reindexdb --all-databases -U postgres im Container harbor-db im Wartungsfenster.
Verifizieren: docker compose ps zeigt alle Dienste als Up, die Images tragen den neuen Tag. Die Version zeigt die Web-UI über das Fragezeichen-Menü → About.
Troubleshooting / Typische Fehler
- hostname ist localhost/127.0.0.1/0.0.0.0: Symptom: Die Anmeldung schlägt fehl. Lösung: In
harbor.ymleine echte IP-Adresse oder einen FQDN eintragen, dannsudo ./prepare && docker compose down && docker compose up -d. - docker login: „certificate signed by unknown authority“: Docker kennt die eigene CA nicht. Lösung:
ca.crtnach/etc/docker/certs.d/192.168.1.100/kopieren (Schritt 5). - harbor-core bleibt im Restart-Loop: PostgreSQL ist noch nicht bereit. Prüfen Sie
docker compose logs postgresqlund nach 30 bis 60 Sekunden erneutdocker compose ps. - harbor.yml geändert, aber Harbor zeigt alte Konfiguration: Führen Sie
sudo ./prepareaus, danachdocker compose down && docker compose up -d. - Trivy-Vulnerability-DB-Update schlägt fehl (Rate-Limit): Lösung: GitHub-Token in
harbor.ymluntertrivy.github_tokeneintragen. - Image-Push mit „413 Request Entity Too Large“: Ein vorgelagerter Reverse-Proxy begrenzt die Größe. Lösung:
client_max_body_size 0;in der Nginx-Konfiguration oder das Traefik-Äquivalent setzen. - Admin-Passwort nach Neuinstallation falsch:
harbor_admin_passwordinharbor.ymlgilt nur beim ersten Start. Ändern Sie das Passwort in der Web-UI. - Intermediate-Zertifikat nicht erkannt: Hängen Sie das Zwischenzertifikat an das Serverzertifikat an:
cat intermediate.pem >> yourdomain.crt.
Häufige Fragen
Kann ich Harbor hinter einem bestehenden Reverse-Proxy (Traefik, Nginx) betreiben?
Ja. Setzen Sie http.port auf einen freien Port (z. B. 8080), lassen Sie den Proxy HTTPS terminieren und tragen Sie unter external_url die öffentliche HTTPS-URL ein. Doppelte X-Forwarded-Proto-Header stören die Token-Validierung. Traefik beschreibt Traefik als Docker-Reverse-Proxy mit automatischem HTTPS.
Was ist der Unterschied zwischen --with-trivy und einer Installation ohne diesen Parameter?
Ohne --with-trivy prüft Harbor Images nicht auf CVEs. Nachträglich aktivieren Sie Trivy, indem Sie sudo ./install.sh --with-trivy erneut im Verzeichnis harbor/ ausführen.
Kann ich eine externe PostgreSQL-Datenbank oder einen externen Redis verwenden?
Ja. In harbor.yml ersetzen Sie den database-Block durch external_database und analog external_redis. Die internen Container harbor-db und redis entfallen dann.
Wie aktiviere ich Prometheus-Metriken für Harbor?
In harbor.yml den metric-Block aktivieren und konfigurieren, dann sudo ./prepare und Neustart:
metric:
enabled: true
port: 9090
path: /metricsDer harbor-exporter-Container stellt danach Metriken auf Port 9090 bereit. Prometheus und Grafana beschreibt cAdvisor mit Prometheus: Docker-Container-Metriken sammeln und in Grafana visualisieren.
Wie unterstützt Harbor Image-Signierung?
Harbor v2.15 unterstützt Signaturen mit Cosign (Sigstore) und Notation (CNCF). Das alte Notary (--with-notary) ist entfernt; Anleitungen mit diesem Parameter sind veraltet.
Wie wird Garbage Collection ausgeführt?
Nicht mehr referenzierte Blobs belegen Speicher, bis die Garbage Collection (GC) läuft. Unter Administration → Garbage Collection starten Sie sie manuell oder per Zeitplan. Wichtig: Während der GC ist der Push temporär gesperrt.
Fazit
Harbor eignet sich, wenn Sie eine private Registry mit Schwachstellen-Scans, RBAC, Signaturen und Replikation brauchen. Der Installer erzeugt die Compose-Datei samt Secrets und Healthchecks selbst; Änderungen laufen deshalb immer über harbor.yml und prepare. Sichern Sie vor jedem Update /data/database. Scans schon in der CI/CD-Pipeline beschreibt Docker-Images auf Schwachstellen scannen mit Trivy.
Weiterführende Anleitungen und Quellen
- Docker und Docker Compose auf Linux installieren – die Self-Hosting-Grundlage
- Traefik als Docker-Reverse-Proxy mit automatischem HTTPS einrichten
- Docker-Images auf Schwachstellen scannen mit Trivy: CVE-Check, SBOM und automatische Scans
- cAdvisor mit Prometheus: Docker-Container-Metriken sammeln und in Grafana visualisieren
- Docker Compose absichern: Secrets, Healthchecks, Non-Root und Read-Only für den Produktivbetrieb
Offizielle Quellen: Harbor-Dokumentation unter goharbor.io/docs. Releases und Changelogs auf der GitHub-Releases-Seite; bei Abweichungen zur Doku-Website gelten die Release Notes. Upgrade-Ablauf: Upgrade Harbor and Migrate Data.


