Comment créer votre propre registre Docker privé –
L’exécution de votre propre registre Docker vous donne un endroit privé pour stocker vos images Docker. Que vous soyez dans un environnement d’entreprise ou que vous souhaitiez simplement réduire votre dépendance à Docker Hub, voici comment vous pouvez être opérationnel avec un déploiement de registre.
Docker Registry est un système côté serveur qui stocke et indexe les images Docker. Vous «poussez» des images prédéfinies dans le registre. Les autres utilisateurs peuvent ensuite les «extraire» pour les exécuter, sans avoir besoin d’accéder au Dockerfile d’origine.
Le registre public le plus connu est Docker Hub. L’utilisation de votre propre registre vous permet de contrôler le stockage des images et les méthodes d’accès. Il peut également faciliter l’intégration avec des outils tiers.
Il existe des services gérés disponibles qui vous permettent de créer rapidement des installations de registre. Ce guide se concentre sur l’auto-hébergement d’un registre sur votre propre serveur. Les seuls prérequis sont que vous devez avoir Docker et docker-compose installés sur la machine qui hébergera le registre.
Sommaire
Exécution d’un registre
Le serveur Docker Registry est distribué sous la forme de sa propre image Docker. Vous pouvez l’obtenir depuis Docker Hub. Le serveur est exposé sur le port 5000; vous devrez y lier un port hôte afin que les clients puissent se connecter.
Vous devez également configurer un volume pour que Docker Hub ait un emplacement pour stocker de manière permanente les images téléchargées. Assurez-vous que vous disposez de suffisamment d’espace libre sur votre hôte. Un registre activement utilisé peut se développer rapidement.
Commencez par créer un docker-compose.yml
fichier pour décrire votre déploiement. Vous pouvez ajuster les ports et les chemins du système de fichiers en fonction de vos préférences. Cet exemple rendra le registre accessible sur le port 5000. Les images seront stockées dans le data
dossier dans votre répertoire de travail.
version: "3" services: registry: image: registry:2 ports: - 5000:5000 environment: - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data restart: unless-stopped volumes: - ./data:/data
Enregistrez le fichier et exécutez docker-compose up -d
pour lancer votre registre. docker-compose extrait l’image de registre de Docker Hub. Il démarrera ensuite un nouveau conteneur en utilisant votre configuration.
Accéder à votre registre
Vous devriez maintenant pouvoir commencer à utiliser votre registre. Marquez une image en utilisant un chemin qui correspond à votre registre. Vous pouvez utiliser localhost
si vous travaillez sur le serveur de registre lui-même. Vous devriez alors être en mesure de pousser l’image vers le registre.
docker tag my-image localhost:5000/my-image docker push localhost:5000/my-image
L’image sera désormais disponible dans le registre. Si vous inspectez votre data
dossier, vous verrez les calques qui composent l’image. Vous pouvez le retirer d’une autre machine en utilisant docker pull
. Remplacer localhost
avec l’adresse réseau du serveur exécutant le registre.
Configuration de l’authentification
Le registre n’est actuellement pas sécurisé. Tout le monde peut tirer et pousser des images! Résolvons cela en configurant l’authentification. Une fois configuré, vous devrez utiliser docker login
avant de pouvoir interagir avec le registre.
L’approche par défaut de l’authentification de Docker Registry utilise l’authentification de base HTTP. Vous devrez créer un htpasswd
file – il est préférable de le faire en utilisant la commande fournie par apache2-utils
.
sudo apt install apache2-utils mkdir auth htpasswd -Bc auth/.htpasswd my-username
Cela créera un fichier d’authentification pour l’utilisateur my-username
. Vous serez invité à fournir un mot de passe. Le htpasswd
le fichier sera alors écrit dans le répertoire de travail sous la forme auth/.htpasswd
.
Prochaine mise à jour de votre docker-compose.yml
pour configurer le système d’authentification. Vous devez spécifier le type d’authentification utilisé et le chemin d’accès au htpasswd
déposer. Cela devra être monté en tant que nouveau volume.
version: "3" services: registry: image: registry:2 ports: - 5000:5000 environment: - REGISTRY_AUTH: htpasswd - REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm - REGISTRY_AUTH_HTPASSWD_PATH: /auth/.htpasswd - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data restart: unless-stopped volumes: - ./auth:/auth - ./data:/data
Courir docker-compose up -d --force-recreate
pour recréer le conteneur de registre en cours d’exécution à l’aide de la nouvelle configuration. Vous devriez trouver que la CLI Docker refuse maintenant de vous laisser interagir avec le registre.
Pour restaurer l’accès, exécutez docker login localhost:5000
. Vous devrez ajuster l’URI du registre si vous n’exécutez pas Docker sur la même machine. Docker vous demandera de fournir votre nom d’utilisateur et votre mot de passe. Utilisez les valeurs que vous avez définies lors de la création du .htpasswd
déposer.
Une fois l’authentification réussie, vous pourrez recommencer à pousser et à extraire des images. Docker met en cache vos informations d’identification afin que vous n’ayez pas besoin de répéter l’authentification jusqu’à ce que vous docker logout
.
Configurer SSL
Vous devrez ajouter un certificat SSL pour toutes les connexions sauf les plus élémentaires via localhost
. Vous pouvez ajouter un certificat SSL au registre en montant le certificat dans un volume et en définissant des variables d’environnement supplémentaires. Vous devez généralement mettre à jour la configuration du port pour que le registre écoute sur 443, le port HTTPS par défaut.
version: "3" services: registry: image: registry:2 ports: - 443:5000 environment: - REGISTRY_AUTH: htpasswd - REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm - REGISTRY_AUTH_HTPASSWD_PATH: /auth/.htpasswd - REGISTRY_HTTP_ADDR: 0.0.0.0:443 - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/cert.crt - REGISTRY_HTTP_TLS_KEY=/certs/cert.key - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data restart: unless-stopped volumes: - ./auth:/auth - ./certs:/certs - ./data:/data
Ajoutez vos fichiers de certificat à certs
puis redémarrez le registre. Il devrait revenir avec le support HTTPS, en utilisant le fichier de certificat fourni.
SSL via LetsEncrypt
Le serveur de registre a un support intégré pour Let’s Encrypt. Cela vous permet de générer et de renouveler automatiquement vos certificats SSL. Pour utiliser Let’s Encrypt, vous doit exposez publiquement votre registre sur le port 443.
Met le REGISTRY_HTTP_TLS_LETSENCRYPT_EMAIL
et REGISTRY_HTTP_TLS_LETSENCRYPT_HOSTS
variables d’environnement pour ajouter la prise en charge de TLS à votre registre. Let’s Encrypt utilisera l’adresse e-mail comme contact pour vos certificats SSL.
version: "3" services: registry: image: registry:2 ports: - 443:5000 environment: - REGISTRY_AUTH: htpasswd - REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm - REGISTRY_AUTH_HTPASSWD_PATH: /auth/.htpasswd - REGISTRY_HTTP_TLS_LETSENCRYPT_EMAIL: example@example.com - REGISTRY_HTTP_TLS_LETSENCRYPT_HOSTS: [my-registry.com] - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data restart: unless-stopped volumes: - ./auth:/auth - ./certs:/certs - ./data:/data
Recréez le conteneur avec docker-compose up -d --force-recreate
pour appliquer le changement. Le registre utilisera Let’s Encrypt pour acquérir un certificat SSL pour les domaines spécifiés. La disponibilité du certificat peut prendre quelques minutes.
Autres moyens de déployer
Le déploiement avec docker-compose, HTTP Basic Auth et Let’s Encrypt est le moyen le plus simple d’exécuter un registre de conteneurs privé. Cependant, d’autres options sont disponibles, en particulier si vous souhaitez un contrôle d’accès plus avancé.
L’utilisation de l’authentification de base ne va pas bien au-delà d’une poignée d’utilisateurs. Comme alternative, le serveur prend en charge une routine d’authentification déléguée qui repose sur des serveurs de jetons externes. Ceci est conçu pour les scénarios où une intégration étroite avec les systèmes de contrôle d’accès organisationnels est requise.
Le serveur de registre n’implémente pas lui-même l’authentification par jeton. Des projets tels que docker_auth essaient d’ajouter cette pièce manquante, fournissant un système d’authentification à part entière qui peut être déployé avec le registre principal.
Les projets alternatifs visent à faciliter la gestion de votre registre, sans recourir à des commandes de terminal pratiques. Portus est un projet SUSE qui fournit une interface Web, ainsi que son propre système d’authentification des utilisateurs.