
Ce guide vous montre comment installer et utiliser Harbor pour stocker vos images conteneur, scanner automatiquement les vulnérabilités et éviter les problèmes de rate limiting Docker Hub. Vous apprendrez à déployer Harbor via Docker Compose, configurer le proxy-cache pour mettre en cache Docker Hub, et créer des comptes robot pour vos pipelines CI/CD. Prérequis : un serveur Linux avec Docker installé.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Installer Harbor en production avec HTTPS
- Comprendre l’architecture et les fonctionnalités clés
- Configurer le proxy-cache pour Docker Hub (éviter le rate limiting)
- Créer des comptes robot pour vos pipelines CI/CD
- Scanner automatiquement les images avec Trivy
- Répliquer des images entre plusieurs registries
Qu’est-ce que Harbor ?
Section intitulée « Qu’est-ce que Harbor ? »Harbor est un registre d’artefacts cloud-native open source, développé initialement par VMware et désormais projet CNCF graduated (le plus haut niveau de maturité). Pensez à Harbor comme un Docker Hub privé hébergé dans votre infrastructure, avec des fonctionnalités de sécurité intégrées.
Analogie : Si Docker Hub est comme un dépôt de photos public sur internet, Harbor est votre propre serveur de photos privé, où vous contrôlez qui peut voir et télécharger les images, et où un gardien (Trivy) vérifie que chaque photo ne contient pas de contenu dangereux.
Pourquoi ne pas utiliser Docker Hub directement ?
Section intitulée « Pourquoi ne pas utiliser Docker Hub directement ? »Docker Hub, le registre public par défaut, pose plusieurs problèmes en entreprise :
| Problème | Impact | Solution Harbor |
|---|---|---|
| Rate limiting | 100 pulls/6h en anonyme, builds CI/CD bloqués | Proxy-cache : 1 pull externe → N pulls internes |
| Disponibilité | Pannes Docker Hub = arrêt des déploiements | Images mises en cache localement |
| Sécurité | Pas de scan de vulnérabilités intégré | Trivy scanne chaque push automatiquement |
| Conformité | Images stockées chez un tiers (USA) | Données dans votre datacenter |
| Coût | Plans payants pour features avancées | Open source, fonctionnalités complètes |
Ce que Harbor gère
Section intitulée « Ce que Harbor gère »Harbor ne se limite plus aux images Docker. Depuis la version 2.x, il stocke également :
- Images de conteneurs : Docker, OCI, multi-architectures
- Helm charts : charts Kubernetes versionnés
- SBOM (depuis v2.11) : Software Bill of Materials pour la traçabilité
- Artefacts IA/ML (depuis v2.13) : modèles via CloudNativeAI
Architecture de Harbor
Section intitulée « Architecture de Harbor »Harbor est composé de plusieurs services qui communiquent entre eux. Comprendre cette architecture vous aidera à diagnostiquer les problèmes et à dimensionner correctement votre installation.
Composants principaux :
| Composant | Rôle | Pourquoi c’est important |
|---|---|---|
| NGINX | Reverse proxy, terminaison TLS | Point d’entrée unique, gestion HTTPS |
| Core | API REST, authentification, autorisation | Cerveau de Harbor |
| Registry | Stockage des images (Docker Distribution) | Où vos images sont réellement stockées |
| Trivy | Scan de vulnérabilités | Détecte les CVE dans vos images |
| JobService | Tâches asynchrones (réplication, scan, GC) | Travaux en arrière-plan |
| PostgreSQL | Base de données | Métadonnées, utilisateurs, projets |
| Redis | Cache et sessions | Performance et sessions utilisateurs |
Fonctionnalités de sécurité intégrées
Section intitulée « Fonctionnalités de sécurité intégrées »Harbor intègre Trivy comme scanner de vulnérabilités par défaut. Chaque image poussée peut être automatiquement scannée pour détecter les CVE connues.
Workflow de scan :
- Un développeur pousse une image
- Harbor déclenche automatiquement Trivy
- Trivy analyse chaque couche de l’image
- Les résultats sont attachés à l’image dans l’interface
- Si des vulnérabilités critiques sont détectées, le pull peut être bloqué
Contrôle d’accès et authentification
Section intitulée « Contrôle d’accès et authentification »Harbor propose plusieurs méthodes d’authentification pour s’adapter à votre infrastructure :
- Base de données locale : pour les petites équipes ou les labs
- LDAP/Active Directory : intégration avec l’annuaire d’entreprise
- OIDC (OpenID Connect) : SSO avec Keycloak, Azure AD, Okta, Google
- Robot accounts : comptes techniques pour les pipelines CI/CD (voir section dédiée)
Installation de Harbor
Section intitulée « Installation de Harbor »Harbor peut être installé de deux manières selon votre environnement :
| Méthode | Cas d’usage | Complexité |
|---|---|---|
| Docker Compose | Lab, petite équipe, serveur dédié | Simple |
| Helm sur Kubernetes | Production, haute disponibilité, cloud | Moyenne |
Dans ce guide, nous couvrons les deux méthodes. Commencez par Docker Compose pour vous familiariser avec Harbor, puis passez à Helm pour la production.
Prérequis système
Section intitulée « Prérequis système »Configuration matérielle et logicielle requise :
| Ressource | Minimum (lab) | Recommandé (prod) | Pourquoi |
|---|---|---|---|
| CPU | 2 cores | 4 cores | Trivy consomme beaucoup lors des scans |
| RAM | 4 Go | 8 Go | PostgreSQL + Trivy + Redis |
| Disque | 40 Go | 160 Go+ | Dépend du volume d’images stockées |
Logiciels requis :
- Docker Engine 20.10.10+
- Docker Compose v2 (ou v1.18+)
- OpenSSL (pour générer les certificats)
Ports réseau à ouvrir :
| Port | Protocole | Usage |
|---|---|---|
| 443 | HTTPS | Portail Harbor et API (défaut) |
| 80 | HTTP | Redirection vers HTTPS |
| 4443 | HTTPS | Docker Content Trust (optionnel) |
Téléchargement de Harbor
Section intitulée « Téléchargement de Harbor »Téléchargez l’installeur depuis le dépôt officiel GitHub. Deux options :
| Installeur | Taille | Cas d’usage |
|---|---|---|
| Online | ~50 Mo | Télécharge les images depuis Docker Hub à l’installation |
| Offline | ~800 Mo | Images pré-incluses, pour environnements sans internet |
-
Télécharger l’archive
Fenêtre de terminal cd /optwget https://github.com/goharbor/harbor/releases/download/v2.14.2/harbor-offline-installer-v2.14.2.tgz -
Vérifier l’intégrité (optionnel mais recommandé)
Fenêtre de terminal wget https://github.com/goharbor/harbor/releases/download/v2.14.2/harbor-offline-installer-v2.14.2.tgz.ascgpg --keyserver hkps://keyserver.ubuntu.com --receive-keys 644FF454C0B4115Cgpg -v --keyserver hkps://keyserver.ubuntu.com --verify harbor-offline-installer-v2.14.2.tgz.asc -
Extraire l’archive
Fenêtre de terminal tar xzvf harbor-offline-installer-v2.14.2.tgzcd harbor
Configuration de Harbor
Section intitulée « Configuration de Harbor »Le fichier harbor.yml contient toute la configuration de Harbor. Copiez le template et éditez-le :
cp harbor.yml.tmpl harbor.ymlvi harbor.ymlVoici les paramètres essentiels à configurer :
# Nom d'hôte ou IP publique (jamais localhost en production)hostname: registry.example.com
# Configuration HTTPS (obligatoire en production)https: port: 443 certificate: /opt/harbor/certs/server.crt private_key: /opt/harbor/certs/server.key
# Mot de passe admin initial (changez-le !)harbor_admin_password: VotreMotDePasseSecurise
# Répertoire de stockage des imagesdata_volume: /data
# Activer Trivy pour le scan de vulnérabilitéstrivy: ignore_unfixed: false # Inclure les CVE sans correctif security_check: vuln,config,secret skip_update: false # Mettre à jour la base de CVELancement de l’installation
Section intitulée « Lancement de l’installation »L’option --with-trivy active le scan de vulnérabilités :
sudo ./install.sh --with-trivyLe script vérifie les prérequis, génère les configurations et démarre les conteneurs. Une fois terminé :
✔ ----Harbor has been installed and started successfully.----Vous pouvez accéder à l’interface web d’Harbor via https://registry.example.com
(ou l’URL configurée dans hostname).
Installation via Helm (Kubernetes)
Section intitulée « Installation via Helm (Kubernetes) »Pour un déploiement sur Kubernetes en production, utilisez le chart Helm officiel. Cette méthode offre la haute disponibilité et une meilleure intégration avec l’écosystème cloud-native.
-
Ajouter le dépôt Helm Harbor
Fenêtre de terminal helm repo add harbor https://helm.goharbor.iohelm repo update -
Créer un fichier de values personnalisé
values-harbor.yaml expose:type: ingressingress:hosts:core: harbor.example.comtls:enabled: truecertSource: secretsecret:secretName: harbor-tlsexternalURL: https://harbor.example.compersistence:enabled: truepersistentVolumeClaim:registry:size: 100Gitrivy:enabled: trueharborAdminPassword: "VotreMotDePasseSecurise" -
Installer Harbor
Fenêtre de terminal helm install harbor harbor/harbor \--namespace harbor \--create-namespace \-f values-harbor.yaml -
Vérifier le déploiement
Fenêtre de terminal kubectl -n harbor get pods
Consultez la documentation Helm Harbor pour les options avancées (HA multi-réplicas, stockage S3, PostgreSQL externe…).
Premier accès
Section intitulée « Premier accès »Lors du premier accès à Harbor :
- Ouvrez
https://harbor.example.comdans votre navigateur - Connectez-vous avec
admin/Harbor12345(ou le mot de passe configuré) - Changez immédiatement le mot de passe via Administration → Users

Utiliser Harbor au quotidien
Section intitulée « Utiliser Harbor au quotidien »Cette section couvre les opérations courantes : pousser une image, la récupérer, et comprendre le scan de vulnérabilités.
Pousser votre première image
Section intitulée « Pousser votre première image »Prenons un exemple concret : vous avez une application web simple à conteneuriser.
-
Créer un projet dans Harbor
Avant de pousser une image, créez un projet dans l’interface Harbor : Projects → New Project → “monprojet”. Un projet est comme un dossier qui regroupe des images liées (par application, par équipe, etc.).
-
Créer votre Dockerfile
FROM nginx:alpineCOPY index.html /usr/share/nginx/html/EXPOSE 80 -
Construire l’image
Fenêtre de terminal docker build -t monserveurweb:0.1 . -
Taguer l’image pour Harbor
Le format du tag est :
<harbor-url>/<projet>/<image>:<version>Fenêtre de terminal docker tag monserveurweb:0.1 registry.example.com/monprojet/monserveurweb:0.1 -
Se connecter à Harbor
Fenêtre de terminal docker login registry.example.com# Entrez vos identifiants Harbor -
Pousser l’image
Fenêtre de terminal docker push registry.example.com/monprojet/monserveurweb:0.1
Vérification : Dans l’interface Harbor, naviguez vers Projects → monprojet. Vous devriez voir votre image avec son tag 0.1.
Comprendre le scan de vulnérabilités
Section intitulée « Comprendre le scan de vulnérabilités »Une fois l’image poussée, Harbor déclenche automatiquement un scan Trivy (si configuré). Dans l’interface :
- Cliquez sur l’image pour voir ses tags
- Cliquez sur un tag pour voir le détail
- L’onglet Vulnerabilities affiche les CVE détectées

Interpréter les résultats :
| Sévérité | Signification | Action recommandée |
|---|---|---|
| Critical | Faille exploitable à distance, impact majeur | Corriger immédiatement |
| High | Faille sérieuse | Corriger rapidement |
| Medium | Faille modérée | Planifier la correction |
| Low | Faille mineure | Corriger quand possible |
Configurer le proxy-cache
Section intitulée « Configurer le proxy-cache »Le proxy-cache est l’une des fonctionnalités les plus utiles de Harbor. Il permet de mettre en cache les images de registries externes (Docker Hub, Quay, GCR…) pour :
- Éviter le rate limiting Docker Hub (100 pulls/6h en anonyme)
- Accélérer les pulls (images servies depuis votre réseau local)
- Garantir la disponibilité même si Docker Hub est en panne
Comment fonctionne le proxy-cache ?
Section intitulée « Comment fonctionne le proxy-cache ? »Premier pull : Harbor récupère l’image depuis Docker Hub, la stocke localement, et la sert au client.
Pulls suivants : Harbor sert l’image depuis son cache local. Docker Hub n’est pas contacté (sauf pour vérifier les mises à jour).
Configurer un proxy-cache Docker Hub
Section intitulée « Configurer un proxy-cache Docker Hub »-
Créer un endpoint de registry
Dans l’interface Harbor : Administration → Registries → New Endpoint
Champ Valeur Provider Docker Hub Name dockerhub Endpoint URL https://hub.docker.com Access ID (optionnel, votre username Docker Hub) Access Secret (optionnel, votre token Docker Hub) Cliquez sur Test Connection pour vérifier, puis OK.
-
Créer un projet proxy-cache
Projects → New Project
Champ Valeur Project Name dockerhub-proxy Access Level Public (ou Private selon vos besoins) Proxy Cache ✅ Activé Registry dockerhub (l’endpoint créé à l’étape 1) -
Utiliser le proxy-cache
Au lieu de :
Fenêtre de terminal docker pull nginx:latestUtilisez :
Fenêtre de terminal docker pull registry.example.com/dockerhub-proxy/library/nginx:latestPour les images non-officielles :
Fenêtre de terminal docker pull registry.example.com/dockerhub-proxy/bitnami/redis:latest
Registries supportés
Section intitulée « Registries supportés »Harbor supporte le proxy-cache pour de nombreux registries :
- Docker Hub
- Quay.io
- GitHub Container Registry (ghcr.io)
- AWS ECR
- Azure ACR
- Google Container Registry
- JFrog Artifactory
Comptes robot pour la CI/CD
Section intitulée « Comptes robot pour la CI/CD »Les robot accounts sont des comptes techniques conçus pour les pipelines CI/CD. Contrairement aux comptes utilisateurs, ils :
- N’ont pas accès à l’interface web
- Ont des permissions limitées (push/pull uniquement)
- Peuvent être révoqués sans impacter les utilisateurs
- Ont une durée de vie configurable
Créer un compte robot
Section intitulée « Créer un compte robot »-
Naviguer vers le projet
Projects → votre-projet → Robot Accounts
-
Créer le robot
Cliquez sur New Robot Account :
Champ Valeur recommandée Name ci-pipeline Expiration 365 jours (ou selon votre politique) Permissions Push Artifact, Pull Artifact -
Sauvegarder les credentials
Harbor affiche le token une seule fois. Copiez-le immédiatement et stockez-le dans votre gestionnaire de secrets (Vault, GitLab CI variables, GitHub Secrets…).
Utiliser dans GitLab CI
Section intitulée « Utiliser dans GitLab CI »variables: HARBOR_URL: registry.example.com HARBOR_PROJECT: monprojet
build: stage: build script: - docker login -u "${HARBOR_ROBOT_USER}" -p "${HARBOR_ROBOT_TOKEN}" ${HARBOR_URL} - docker build -t ${HARBOR_URL}/${HARBOR_PROJECT}/myapp:${CI_COMMIT_SHA} . - docker push ${HARBOR_URL}/${HARBOR_PROJECT}/myapp:${CI_COMMIT_SHA}Les variables HARBOR_ROBOT_USER et HARBOR_ROBOT_TOKEN sont définies dans Settings → CI/CD → Variables (type “masked”).
Réplication entre registries
Section intitulée « Réplication entre registries »La réplication permet de synchroniser des images entre plusieurs instances Harbor ou vers d’autres registries. Cas d’usage :
- Multi-datacenter : répliquer les images vers un site de DR
- Edge computing : pré-pousser les images vers des clusters edge
- Migration : copier des images depuis un ancien registry
Modes de réplication
Section intitulée « Modes de réplication »| Mode | Direction | Cas d’usage |
|---|---|---|
| Push | Harbor → External | Distribuer vers d’autres registries |
| Pull | External → Harbor | Importer depuis Docker Hub, GCR, etc. |
Configurer une réplication push
Section intitulée « Configurer une réplication push »-
Créer l’endpoint de destination
Administration → Registries → New Endpoint
Configurez l’accès au registry de destination (Harbor distant, ECR, etc.).
-
Créer une règle de réplication
Administration → Replications → New Replication Rule
Champ Valeur Name prod-datacenter-2 Replication mode Push-based Source resource filter monprojet/** Destination registry (l’endpoint créé) Trigger mode Event Based (à chaque push) -
Tester la réplication
Poussez une image dans le projet source. Elle devrait apparaître dans le registry de destination après quelques secondes.
Dépannage
Section intitulée « Dépannage »Les problèmes avec Harbor se manifestent généralement de deux façons : l’interface est inaccessible ou les opérations Docker échouent (login, push, pull). Voici les causes les plus fréquentes.
Problèmes d’installation
Section intitulée « Problèmes d’installation »| Symptôme | Cause probable | Solution |
|---|---|---|
| Harbor ne démarre pas | Conteneur en erreur | docker compose ps puis logs du conteneur en échec |
| Erreur “port already in use” | Port 443/80 déjà utilisé | Arrêter le service conflictuel ou changer le port |
| Interface inaccessible | HTTPS mal configuré | Vérifier les chemins des certificats dans harbor.yml |
| Erreur base de données | PostgreSQL corrompu | Vérifier les logs PostgreSQL dans /var/log/harbor/ |
Problèmes de connexion Docker
Section intitulée « Problèmes de connexion Docker »| Symptôme | Cause probable | Solution |
|---|---|---|
x509: certificate signed by unknown authority | Certificat auto-signé non trusté | Ajouter le CA au système (voir ci-dessous) |
unauthorized: authentication required | Mauvais credentials | Vérifier username/password, refaire docker login |
denied: requested access to the resource is denied | Permissions insuffisantes | Vérifier les droits sur le projet Harbor |
| Timeout lors du push | Réseau ou firewall | Vérifier la connectivité sur le port 443 |
Faire confiance à un certificat auto-signé
Section intitulée « Faire confiance à un certificat auto-signé »Si vous utilisez un certificat auto-signé (lab), vous devez l’ajouter au système :
# Copier le certificat CAsudo cp ca.crt /usr/local/share/ca-certificates/harbor-ca.crtsudo update-ca-certificates
# Redémarrer Dockersudo systemctl restart docker# Copier le certificat CAsudo cp ca.crt /etc/pki/ca-trust/source/anchors/harbor-ca.crtsudo update-ca-trust
# Redémarrer Dockersudo systemctl restart dockerConsulter les logs
Section intitulée « Consulter les logs »Les logs Harbor sont stockés dans /var/log/harbor/ avec un fichier par composant :
# Logs du composant core (API)tail -f /var/log/harbor/core.log
# Logs du registrytail -f /var/log/harbor/registry.log
# Logs Trivy (scanner)tail -f /var/log/harbor/trivy-adapter.logPour les installations Helm, utilisez kubectl :
kubectl -n harbor logs deployment/harbor-core -fÀ retenir
Section intitulée « À retenir »- Harbor est un registre d’artefacts cloud-native qui stocke images Docker, Helm charts, SBOM et artefacts IA
- Le proxy-cache résout le rate limiting Docker Hub : 1 pull externe → N pulls internes
- Trivy scanne automatiquement les images pour détecter les CVE
- Les robot accounts sont essentiels pour la CI/CD : credentials dédiés, révocables, avec permissions minimales
- La réplication permet le multi-datacenter et la haute disponibilité
- HTTPS est obligatoire en production ; Docker refuse les registries HTTP par défaut
- Projet CNCF graduated = maturité et pérennité garanties