Comment configurer un registre Docker privé sur Ubuntu / Debian

installer un registre Docker privé sur Ubuntu 22.04 / Debian

Introduction

Docker Registry est un outil puissant qui aide à gérer le stockage et la distribution des images de conteneurs Docker. Alors que Docker Hub fournit un registre public gratuit pour l’hébergement d’images Docker personnalisées, il existe des scénarios dans lesquels il est nécessaire d’avoir un registre privé pour garder des images sensibles ou propriétaires sécurisées. En mettant en place un registre Docker privé, les développeurs peuvent avoir un contrôle total sur leurs images de conteneurs et restreindre l’accès aux utilisateurs autorisés.

Dans ce tutoriel, nous allons vous guider à travers le processus de mise en place et de sécurisation de votre propre registre Docker privé sur un serveur Ubuntu 22.04 / 20.04 / 18.04 . Vous apprendrez à configurer Docker Compose pour définir les paramètres du registre et à utiliser Nginx pour transférer le trafic de l’Internet vers le conteneur Docker en cours d’exécution. À la fin de ce tutoriel, vous serez en mesure de pousser et de tirer des images Docker en toute sécurité à partir de votre registre privé.

Prérequis

Pour suivre ce tutoriel, vous aurez besoin des éléments suivants :

  • Deux serveurs Ubuntu / Debian : l’un servira de serveur hôte pour votre registre Docker privé, et l’autre servira de serveur client.
  • Docker est installé sur les deux serveurs. Vous pouvez vous référer au tutoriel “Comment installer et utiliser Docker sur Ubuntu 18.04/20.04/22.04” pour des instructions détaillées sur la configuration de Docker.
  • Nginx installé sur le serveur hôte.
  • Un nom de domaine enregistré qui se résout au serveur hébergeant votre registre Docker privé. Vous le configurerez dans le cadre du prérequis Let’s Encrypt. Pour les besoins de ce tutoriel, nous nous référerons à ce domaine comme votre_domaine.

Étape 1 : Installation et configuration du registre Docker

Pour commencer, nous devons configurer le Docker Registry en utilisant Docker Compose. Docker Compose vous permet de définir et de gérer facilement la configuration de vos conteneurs Docker.

  • Connectez-vous à votre serveur hôte via SSH.
  • Créez un répertoire appelé docker-registry pour stocker les fichiers de configuration en exécutant la commande suivante :
$ mkdir ~/docker-registry
  • Naviguez jusqu’au répertoire nouvellement créé :
cd ~/docker-registry
  • Créez un sous-répertoire appelé data pour stocker les images du Docker Registry :
$ mkdir data
  • Créez un fichier docker-compose.yml et ouvrez-le pour l’éditer :
$ nano docker-compose.yml
  • Ajoutez le contenu suivant au fichier docker-compose.yml pour définir une instance de base du Docker Registry :
version: '3'
services:
  registry:
    image: registry:latest
    ports:
      - "5000:5000"
    environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - ./data:/data

Cette configuration met en place un service Docker Registry appelé registry, en utilisant l’image registry:latest. Elle fait correspondre le port 5000 sur l’hôte au port 5000 dans le conteneur. La variable d’environnement REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY spécifie le répertoire dans lequel les images seront stockées dans le conteneur. Enfin, il monte le répertoire ./data sur l’hôte vers le répertoire /data dans le conteneur pour conserver les données de l’image.

  • Enregistrez et fermez le fichier en appuyant sur Ctrl + X, suivi de Y, puis Enter.
  • Démarrez le service Docker Registry en exécutant la commande suivante :
$ docker-compose up -d

L’option -d permet d’exécuter les conteneurs en arrière-plan.

À ce stade, votre registre Docker privé est opérationnel sur votre serveur hôte. Le registre est accessible via le nom de domaine ou l’adresse IP de votre serveur sur le port 5000.

Étape 2 : Configuration de Nginx en tant que proxy inverse

Pour accéder de manière sécurisée au Docker Registry via HTTPS et acheminer le trafic de l’internet vers le conteneur de registre, nous utiliserons Nginx en tant que proxy inverse. Le proxy inverse gérera la terminaison SSL et transmettra les requêtes au service Docker Registry.

  • Connectez-vous à votre serveur hôte via SSH.
  • Ouvrez le fichier de configuration Nginx pour votre domaine en utilisant la commande suivante (remplacez your_domain par votre nom de domaine enregistré) :
$ sudo nano /etc/nginx/sites-available/your_domain
  • Supprimez le contenu existant et ajoutez la configuration suivante :
server {
    listen 80;
    listen [::]:80;
    server_name your_domain;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name your_domain;
    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
    location / {
        proxy_pass http://localhost:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Remplacez votre_domaine par votre nom de domaine enregistré. Cette configuration permet à Nginx de rediriger les requêtes HTTP vers HTTPS et d’écouter les requêtes HTTPS entrantes. Elle spécifie le certificat SSL et les emplacements des clés fournis par Let’s Encrypt. location / block redirige les requêtes vers http://localhost:5000, qui correspond au service Docker Registry exécuté sur l’hôte.

  • Enregistrez et fermez le fichier en appuyant sur Ctrl + X, suivi de Y, puis Enter.
  • Activez la configuration de Nginx en créant un lien symbolique :
$ sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
  • Tester la configuration de Nginx pour vérifier qu’il n’y a pas d’erreurs de syntaxe :
$ sudo nginx -t

Si le fichier de configuration ne contient pas d’erreurs de syntaxe, le message suivant s’affiche syntax is ok et test is successful messages.

  • Redémarrez Nginx pour appliquer les modifications :
$ sudo systemctl restart nginx

Nginx est maintenant configuré comme un proxy inverse pour votre registre Docker, gérant la terminaison SSL et transmettant les demandes au service de registre.

Étape 3 : Pousser et tirer des images du registre Docker privé

Maintenant que votre registre Docker privé est configuré et accessible via votre nom de domaine en HTTPS, vous pouvez pousser et tirer des images Docker vers et depuis le registre.

Pour transférer une image dans le registre, utilisez la commande suivante :

$ docker push your_domain/image_name:tag

Remplacer your_domain avec votre nom de domaine enregistré, image_name avec le nom de votre image, et tag avec une version ou une balise spécifique pour l’image.

Pour extraire une image du registre, utilisez la commande suivante :

$ docker pull your_domain/image_name:tag

Remplacer à nouveau your_domainimage_name, et tag avec les valeurs appropriées.

Étape 4 : Activer l’authentification

Par défaut, le Docker Registry que nous avons mis en place ne nécessite pas d’authentification pour pousser et tirer des images. Cependant, l’activation de l’authentification ajoute une couche de sécurité supplémentaire à votre registre Docker privé. Lorsque l’authentification est activée, seuls les utilisateurs autorisés peuvent accéder au registre et interagir avec lui.

Pour activer l’authentification, vous pouvez choisir parmi plusieurs méthodes d’authentification en fonction de vos besoins. Une méthode courante consiste à utiliser un système d’authentification basé sur un nom d’utilisateur et un mot de passe. Docker Registry prend en charge un mécanisme d’authentification de base utilisant un fichier htpasswd. Voici comment activer l’authentification :

Créer un fichier htpasswd :

  • Installer le apache2-utils s’il n’est pas déjà installé :
$ sudo apt-get install apache2-utils
  • Générer un fichier htpasswd avec un nom d’utilisateur et un mot de passe :
$ sudo htpasswd -Bc /path/to/htpasswd <username>
  • Vous serez invité à saisir et à confirmer le mot de passe du nom d’utilisateur spécifié. Répétez cette étape pour chaque utilisateur que vous souhaitez ajouter.

Configurer Docker Registry pour utiliser l’authentification :

  • Ouvrez votre fichier docker-compose.yml.
  • Ajoutez la variable d’environnement suivante au service de registre :
environment:
  - REGISTRY_AUTH=htpasswd
  - REGISTRY_AUTH_HTPASSWD_PATH=/path/to/htpasswd
  - REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm
  • Remplacer  /path/to/htpasswd avec le chemin réel de votre fichier htpasswd.

Enregistrez les modifications et redémarrez le Docker Registry :

$ docker-compose down
$ docker-compose up -d

Une fois l’authentification activée, les utilisateurs devront fournir des informations d’identification valides (nom d’utilisateur et mot de passe) pour envoyer et retirer des images du registre.

N’oubliez pas de gérer les comptes d’utilisateurs et les mots de passe en toute sécurité. Examinez régulièrement l’accès des utilisateurs et mettez-le à jour si nécessaire. Vous pouvez également explorer d’autres méthodes d’authentification telles que l’authentification par jeton ou l’intégration avec des fournisseurs d’authentification externes tels que LDAP ou OAuth.

Voilà, c’est fait ! Vous avez maintenant votre propre registre Docker privé configuré avec un cryptage SSL et accessible via un nom de domaine. Vous pouvez utiliser ce registre pour stocker et gérer vos images Docker en toute sécurité.

Conclusion:

Dans cet article, nous avons abordé le processus de mise en place d’un registre Docker privé. Nous avons abordé l’installation de Docker, la création d’un fichier Docker Compose, l’activation du chiffrement SSL/TLS et l’activation de l’authentification pour l’accès autorisé. En suivant ces étapes, vous pouvez établir un registre Docker sécurisé pour gérer et distribuer vos applications conteneurisées au sein de votre organisation. N’oubliez pas de vous tenir au courant des meilleures pratiques en matière de sécurité et de revoir régulièrement la configuration de votre registre. Profitez des avantages d’un registre Docker bien sécurisé pour rationaliser le déploiement de vos applications.

Laisser un commentaire