Contactez-nous

Mettre en place un registry privé

Apprenez à installer, configurer et sécuriser votre propre registry Docker privé pour un contrôle total sur le stockage et la distribution de vos images conteneurs.

Pourquoi héberger son propre registry Docker ?

Si Docker Hub offre une solution pratique pour de nombreux besoins, plusieurs scénarios justifient la mise en place d'un registry privé auto-hébergé ou géré. La principale raison est souvent la sécurité et la confidentialité : les entreprises souhaitent garder leurs images propriétaires, potentiellement sensibles, entièrement sous leur contrôle, sans les exposer sur une plateforme publique, même dans des dépôts privés.

Le contrôle total sur l'infrastructure, les politiques d'accès, les sauvegardes et la configuration est un autre avantage majeur. Vous n'êtes pas dépendant des limitations, des politiques tarifaires ou des éventuelles pannes d'un service tiers. La performance peut également être améliorée, surtout si le registry privé est hébergé sur le même réseau local que les développeurs et les serveurs de déploiement, réduisant ainsi la latence et la consommation de bande passante externe lors des pulls et des pushes.

Enfin, des exigences de conformité spécifiques (réglementations sectorielles, politiques internes) peuvent imposer l'hébergement local des artefacts logiciels. Mettre en place son propre registry permet de répondre précisément à ces besoins.

Déploiement de base du registry officiel

Docker fournit une image officielle nommée `registry` (actuellement en version 2, donc `registry:2`) qui permet de déployer un registry fonctionnel très simplement. La commande de base pour lancer un registry écoutant sur le port 5000 de la machine hôte est :

docker run -d -p 5000:5000 --name mon-registry-local registry:2

Ce conteneur est maintenant prêt à recevoir et servir des images. Pour pousser une image vers ce registry local, vous devez d'abord la taguer avec le nom d'hôte et le port du registry :

# Supposons que mon_image:tag existe localement
# Taguer l'image pour le registry local (localhost:5000)
docker tag mon_image:tag localhost:5000/mon_image:tag

# Pousser l'image vers le registry local
docker push localhost:5000/mon_image:tag

Pour pouvoir télécharger (pull) cette image depuis une autre machine ou même depuis la même machine après l'avoir supprimée localement, vous utiliseriez :

docker pull localhost:5000/mon_image:tag

Attention : Par défaut, cette configuration est non sécurisée (HTTP) et éphémère (les données sont perdues si le conteneur est supprimé).

Assurer la persistance des données

Par défaut, les couches d'images poussées vers le conteneur `registry` sont stockées dans le système de fichiers du conteneur lui-même (généralement sous `/var/lib/registry`). Si le conteneur est supprimé, toutes les images stockées sont perdues. Il est donc absolument essentiel de monter un volume pour persister les données du registry sur l'hôte.

Cela se fait avec l'option `-v` ou `--mount` lors du lancement du conteneur :

docker run -d -p 5000:5000 \
  --restart=always \
  --name mon-registry-persistant \
  -v chemin/sur/hote/registry-data:/var/lib/registry \
  registry:2
Remplacez `chemin/sur/hote/registry-data` par le chemin absolu sur votre machine hôte où vous souhaitez stocker les données des images. L'option `--restart=always` est également recommandée pour que le registry redémarre automatiquement en cas d'arrêt ou de redémarrage de l'hôte.

Sécurisation indispensable : TLS et authentification

Un registry lancé sans sécurité (HTTP uniquement) est une vulnérabilité majeure. Les identifiants de connexion (si utilisés) et les données d'images transitent en clair sur le réseau. De plus, le démon Docker refusera par défaut de communiquer avec un registry non sécurisé, sauf configuration explicite.

1. Sécurisation avec TLS (HTTPS) : Il est impératif de configurer le registry pour utiliser TLS. Vous aurez besoin d'un certificat TLS et de sa clé privée. Pour des tests ou un usage interne strict, un certificat auto-signé peut suffire, mais pour la production ou un accès plus large, un certificat émis par une autorité de certification reconnue (ou via Let's Encrypt) est fortement recommandé. Vous montez le certificat (`.crt`) et la clé (`.key`) dans le conteneur et configurez le registry pour les utiliser, généralement via des variables d'environnement ou un fichier de configuration :
docker run -d -p 5000:5000 \
  --restart=always \
  --name mon-registry-securise \
  -v "$(pwd)"/registry-data:/var/lib/registry \
  -v "$(pwd)"/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2
Les clients Docker devront alors faire confiance à ce certificat (soit en ajoutant l'autorité de certification aux magasins de confiance du système, soit, pour les certificats auto-signés et à des fins de test uniquement, en configurant le démon Docker pour faire confiance à ce registry spécifique via la directive `insecure-registries` dans `daemon.json`, ce qui n'est pas recommandé pour la production). L'accès se fait alors via HTTPS : `docker push mon-serveur.domaine.com:5000/mon_image`.2. Authentification : Même avec TLS, vous voudrez probablement contrôler qui peut pousser ou tirer des images. La méthode la plus simple est l'authentification Basic Auth via un fichier `htpasswd`. Vous créez un fichier `htpasswd` avec les identifiants des utilisateurs autorisés, vous le montez dans le conteneur et vous configurez le registry pour l'utiliser :
# Créer le fichier htpasswd (exemple avec l'utilisateur 'testuser')
htpasswd -cB htpasswd testuser

docker run -d -p 5000:5000 \
  --restart=always \
  --name mon-registry-authentifie \
  -v "$(pwd)"/registry-data:/var/lib/registry \
  -v "$(pwd)"/certs:/certs \
  -v "$(pwd)"/auth:/auth \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2
Les utilisateurs devront alors se connecter avant de pouvoir interagir avec le registry en utilisant `docker login mon-serveur.domaine.com:5000` et en fournissant leurs identifiants.

Configuration avancée via fichier et alternatives

Pour des configurations plus complexes (utilisation de pilotes de stockage différents comme S3, Google Cloud Storage, Azure Blob Storage, configuration fine de l'authentification, etc.), il est préférable d'utiliser un fichier de configuration YAML (souvent nommé `config.yml`) plutôt que de multiplier les variables d'environnement. Vous montez ce fichier dans le conteneur (généralement sous `/etc/docker/registry/config.yml`) et le registry l'utilisera automatiquement.

Mettre en place et maintenir un registry privé implique une responsabilité opérationnelle (mises à jour, sauvegardes, sécurité, monitoring). Il existe des alternatives robustes qui offrent des fonctionnalités plus avancées (interface utilisateur web, scan de vulnérabilités, gestion fine des rôles, etc.) comme Harbor (open source), Sonatype Nexus Repository Manager (supporte Docker et d'autres formats), ou les services de registry managés par les fournisseurs cloud (Amazon ECR, Google Container Registry/Artifact Registry, Azure Container Registry). Le choix dépendra de vos besoins spécifiques, de vos compétences et de vos ressources.

Points clés de la mise en place d'un registry privé

Un registry privé offre contrôle, sécurité et performance pour la gestion de vos images Docker. Le déploiement de base avec l'image `registry:2` est simple, mais ne convient qu'aux tests locaux.

La persistance des données via des volumes est essentielle pour ne pas perdre vos images. La sécurisation via TLS (HTTPS) et la mise en place d'une authentification (au minimum Basic Auth avec `htpasswd`) sont indispensables pour tout usage autre que local et isolé.

Configurez les clients Docker pour qu'ils fassent confiance au certificat TLS de votre registry. Utilisez `docker login` pour vous authentifier. Pour des configurations avancées, privilégiez un fichier `config.yml`.

N'oubliez pas la charge opérationnelle associée à un registry auto-hébergé et considérez les alternatives (Harbor, Nexus, registries cloud managés) si elles correspondent mieux à vos besoins. La mise en place correcte d'un registry privé est une étape clé vers une gestion professionnelle des conteneurs.