GNU/Linux >> Tutoriels Linux >  >> Rocky Linux

Comment configurer un registre Docker privé sur Rocky Linux 8

Si vous travaillez pour une organisation et que vous souhaitez conserver vos images Docker en interne pour un déploiement rapide, l'hébergement d'un référentiel Docker privé est parfait. Avoir un registre docker privé vous permet de posséder votre pipeline de distribution d'images et d'avoir un contrôle plus strict sur le stockage et la distribution des images. Vous pouvez intégrer votre registre à votre système CI/CD pour améliorer votre flux de travail.

Ce didacticiel vous apprendra comment configurer et utiliser un registre Docker privé sur un serveur basé sur Rocky Linux 8 en utilisant Amazon S3 comme emplacement de stockage.

Prérequis

  • Deux serveurs Linux avec Rocky Linux 8. Un serveur agira en tant qu'hôte de registre, tandis que l'autre sera utilisé en tant que client pour envoyer des requêtes et recevoir des images de l'hôte.
  • Un nom de domaine enregistré pointant vers le serveur hôte. Nous utiliserons registry.example.com pour notre tutoriel.
  • Un utilisateur non root avec des privilèges sudo sur les deux machines.

Étape 1 - Configurer le pare-feu

La première étape consiste à configurer le pare-feu. Rocky Linux utilise Firewalld Firewall. Vérifiez l'état du pare-feu.

$ sudo firewall-cmd --staterunning

Le pare-feu fonctionne avec différentes zones, et la zone publique est celle par défaut que nous utiliserons. Répertorier tous les services et ports actifs sur le pare-feu.

$ sudo firewall-cmd --permanent --list-services

Il devrait afficher la sortie suivante.

cockpit dhcpv6-client ssh

Autoriser les ports HTTP et HTTPS.

$ sudo firewall-cmd --permanent --add-service=http$ sudo firewall-cmd --permanent --add-service=https

Revérifiez l'état du pare-feu.

$ sudo firewall-cmd --permanent --list-services

Vous devriez voir une sortie similaire.

cockpit dhcpv6-client http https ssh

Rechargez le pare-feu pour activer les modifications.

$ sudo firewall-cmd --reload

Étape 2 - Installer Docker et Docker Compose

Cette étape est requise à la fois sur le serveur et sur les machines clientes.

Installez le référentiel Docker officiel.

$ sudo dnf install yum-utils$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo

Installez Docker.

$ sudo dnf install docker-ce docker-ce-cli containerd.io

Activez et exécutez le démon Docker.

$ sudo systemctl enable docker --now

Ajoutez votre utilisateur système au groupe Docker pour éviter d'utiliser sudo pour exécuter les commandes Docker.

$ sudo usermod -aG docker $(whoami)

Connectez-vous à nouveau à votre serveur après vous être déconnecté pour activer le changement.

Téléchargez et installez la dernière version stable de Docker Compose.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o / usr/local/bin/docker-compose

Appliquez les autorisations exécutables au fichier binaire téléchargé.

$ sudo chmod +x /usr/local/bin/docker-compose

Installez le script Docker-compose Bash Completion.

$ sudo curl \ -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \ -o /etc/bash_completion.d/docker-compose 

Rechargez les paramètres de votre profil pour que la complétion bash fonctionne.

$ source ~/.bashrc

Étape 3 - Configurer le registre Docker

Créer des répertoires d'utilisateurs

Créez un répertoire pour la configuration du registre.

$ mkdir ~/docker-registry

Basculer vers le docker-registry répertoire.

$ cd ~/docker-registry

Créez un répertoire pour stocker le mot de passe d'authentification HTTP, les fichiers de configuration Nginx et les certificats SSL.

$ mkdir auth

Créez un autre répertoire pour stocker les journaux Nginx.

Journaux $ mkdir

Créer un compartiment Amazon S3

Vous pouvez stocker les données du registre et les images sur votre serveur ou utiliser un service d'hébergement cloud. Pour notre tutoriel, nous utiliserons le service cloud Amazon S3.

L'étape suivante consiste à configurer le fichier de configuration avec quelques paramètres importants. Ces paramètres peuvent également être définis dans le docker-compose.yml fichier, mais avoir un fichier séparé est bien mieux.

Créez un compartiment avec les paramètres suivants.

  • ACL doit être désactivé.
  • L'accès public au bucket doit être désactivé.
  • La gestion des versions du bucket doit être désactivée.
  • Activez le chiffrement de compartiment à l'aide de clés gérées par Amazon S3. (SSE-S3)
  • Le verrouillage d'objet doit être désactivé.

Créez un utilisateur IAM avec la stratégie suivante.

{ "Version":"2012-10-17", "Statement":[ { "Effet":"Autoriser", "Action":[ "s3:ListBucket", "s3:GetBucketLocation", "s3 :ListBucketMultipartUploads" ], "Resource":"arn:aws:s3:::S3_BUCKET_NAME" }, { "Effect":"Autoriser", "Action":[ "s3:PutObject", "s3:GetObject", "s3 :DeleteObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource":"arn:aws:s3:::S3_BUCKET_NAME/*" } ]}

Remplacez le S3_BUCKET_NAME avec le nom de votre compartiment S3.

Notez la clé secrète, la valeur secrète et la région de compartiment de votre compartiment à utiliser ultérieurement.

Créer un fichier de composition Docker

Créez le docker-compose.yml fichier et ouvrez-le pour le modifier.

$ nano docker-compose.yml

Collez-y le code suivant.

version :'3.3'services :registre :image :registre :2 redémarrage :toujours environnement :- REGISTRY_STORAGE=s3 - REGISTRY_STORAGE_S3_REGION=us-west-2 - REGISTRY_STORAGE_S3_BUCKET=hf-docker-registry - REGISTRY_STORAGE_S3_ENCRYPT=true - REGISTRY_STORAGE_S3_CHUNKSIZE=5242880 - REGISTRY_STORAGE_S3_SECURE =true - REGISTRY_STORAGE_S3_ACCESSKEY =AKIA3FIG4NVFCJ6STMUA - REGISTRY_STORAGE_S3_SECRETKEY =j9sA / fw6EE9TVj5KRDhm / 7deye + aYDPXttkGbdaX - REGISTRY_STORAGE_S3_V4AUTH =true - REGISTRY_STORAGE_S3_ROOTDIRECTORY =/ image registre - REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR =inmemory - REGISTRY_HEALTH_STORAGEDRIVER_ENABLED =false nginx:image:ports:"alpine nginx":- 443 :443 liens :- registre:volumes de registre :- ./auth:/etc/nginx/conf.d - ./auth/nginx.conf:/etc/nginx/nginx.conf:ro - ./logs:/var/ log/nginx - /etc/letsencrypt:/etc/letsencrypt

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.

Passons en revue ce que nous avons mis en place dans notre fichier de composition.

  1. La première étape consiste à récupérer la dernière image de la version 2 du registre Docker à partir du hub. Nous n'utilisons pas la dernière balise car elle peut causer des problèmes dans le cas d'une mise à jour majeure de la version. Le définir sur 2 vous permet de récupérer toutes les mises à jour 2.x tout en empêchant la mise à niveau automatique vers la prochaine version majeure, ce qui peut introduire des modifications avec rupture.

  2. Le conteneur de registre est configuré pour redémarrer toujours en cas de panne ou d'arrêt inattendu.

  3. Nous avons défini diverses variables d'environnement pour le stockage Amazon S3. Passons-les en revue rapidement.

    • REGISTRY_STORAGE définit le type de stockage. Nous avons sélectionné s3 puisque nous utilisons Amazon S3.
    • REGISTRY_STORAGE_S3_REGION définit la région de votre compartiment S3.
    • REGISTRY_STORAGE_S3_BUCKET définit le nom de votre compartiment S3.
    • REGISTRY_STORAGE_S3_ENCRYPT - définissez-le sur true si vous avez activé le chiffrement du bucket.
    • REGISTRY_STORAGE_S3_CHUNKSIZE définit la taille des morceaux de téléchargement. Il doit être supérieur à 5 Mo (5 * 1 024 * 1 024).
    • REGISTRY_STORAGE_S3_SECURE - définissez-le sur true si vous comptez utiliser HTTPS.
    • REGISTRY_STORAGE_S3_ACCESSKEY et REGISTRY_STORAGE_S3_SECRETKEY - Identifiants d'utilisateur que vous avez saisis après avoir créé votre utilisateur IAM.
    • REGISTRY_STORAGE_S3_V4AUTH - définissez-le sur true si vous utilisez la v4 de l'authentification AWS. Si vous obtenez des erreurs relatives à la connexion S3, définissez-la sur false.
    • REGISTRY_STORAGE_S3_ROOTDIRECTORY - définit le répertoire racine de votre compartiment sous lequel vos données de registre seront stockées.
    • REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR - définit l'emplacement du cache. Dans notre cas, nous le stockons en mémoire. Vous pouvez également le configurer pour utiliser Redis.
    • REGISTRY_HEALTH_STORAGEDRIVER_ENABLED - Définissez-le sur false pour désactiver le service de vérification de l'état du stockage du registre. Il y a un bogue avec le registre qui peut causer des problèmes si vous ne le définissez pas sur false.
  4. Le registre Docker communique via le port 5000, ce que nous avons exposé dans notre serveur au docker.

  5. ./auth:/etc/nginx/conf.d le mappage garantit que tous les paramètres de Nginx sont disponibles dans le conteneur.

  6. ./auth/nginx.conf:/etc/nginx/nginx.conf:ro mappe le fichier de paramètres Nginx du système à celui du conteneur en mode lecture seule.

  7. ./logs:/var/log/nginx permet d'accéder aux journaux de Nginx sur le système en mappant sur le répertoire des journaux Nginx dans le conteneur.

  8. Les paramètres du registre Docker sont stockés dans le /etc/docker/registry/config.yml fichier dans le conteneur, et nous l'avons mappé sur le config.yml fichier dans le répertoire courant, que nous allons créer à l'étape suivante.

Configurer l'authentification

Pour configurer l'authentification HTTP, vous devez installer les httpd-tools paquet.

$ sudo dnf install httpd-tools

Créez le fichier de mot de passe dans le ~/docker-registry/auth répertoire.

$ htpasswd -Bc ~/docker-registry/auth/nginx.htpasswd user1Nouveau mot de passe :retaper le nouveau mot de passe :ajouter un mot de passe pour l'utilisateur user1

Le -c indique à la commande de créer un nouveau fichier, et le -B flag consiste à utiliser l'algorithme bcrypt pris en charge par Docker. Remplacer user1 avec un nom d'utilisateur de votre choix.

Si vous souhaitez ajouter plus d'utilisateurs, exécutez à nouveau la commande, mais sans le -c drapeau.

$ htpasswd -B ~/docker-registry/auth/registry.password user2

Maintenant, le fichier sera mappé au conteneur de registre pour l'authentification.

Étape 4 - Installer SSL

Pour installer un certificat SSL à l'aide de Let's Encrypt, nous devons télécharger l'outil Certbot, disponible dans le référentiel Epel.

Installez le référentiel EPEL et Certbot.

$ sudo dnf install epel-release $ sudo dnf install certbot

Générez un certificat SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d register.example.com

La commande ci-dessus téléchargera un certificat sur /etc/letsencrypt/live/registry.example.com répertoire sur votre serveur.

Générer un groupe Diffie-Hellman certificat.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Testez le renouvellement du certificat.

$ sudo certbot renouveler --dry-run

Si le test réussit, cela signifie que vos certificats seront automatiquement renouvelés.

Copier le fichier Dhparam dans le conteneur

Copiez le groupe Diffie-Hellman certificat au ~/docker-registry/auth répertoire, qui sera mappé au conteneur.

$ sudo cp /etc/ssl/certs/dhparam.pem ~/docker-registry/auth

Étape 5 - Configurer Nginx

L'étape suivante consiste à configurer le serveur Nginx en tant que proxy frontal pour le serveur de registre Docker. Le registre Docker est livré avec un serveur intégré fonctionnant sur le port 5000. Nous le placerons derrière Nginx.

Créez et ouvrez le fichier ~/docker-registry/auth/nginx.conf pour l'édition.

$ sudo nano ~/docker-registry/auth/nginx.conf

Collez-y le code suivant.

events { worker_connections 1024;}http { docker-registry en amont { registre du serveur :5000 ; } ## Définissez une variable pour nous aider à décider si nous devons ajouter l'en-tête ## 'Docker-Distribution-Api-Version'. ## Le registre définit toujours cet en-tête. ## Dans le cas où nginx effectue l'authentification, l'en-tête n'est pas défini ## puisque nginx est auth-ing avant le proxy. carte $upstream_http_docker_distribution_api_version $docker_distribution_api_version { '' 'registry/2.0'; } serveur { écouter 443 ssl http2 ; nom_serveur registre.exemple.com ; # SSL certificat_ssl /etc/letsencrypt/live/registry.example.com/fullchain.pem ; clé_certificat_ssl /etc/letsencrypt/live/registry.example.com/privkey.pem ; ssl_trusted_certificate /etc/letsencrypt/live/registry.example.com/chain.pem ; access_log /var/log/nginx/registry.access.log ; error_log /var/log/nginx/registry.error.log; # Recommandations de https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html ssl_protocols TLSv1.2 TLSv1.3 ; chiffrements_ssl -RSA-CHACHA20-POLY1305 :DHE-RSA-AES128-GCM-SHA256 :DHE-RSA-AES256-GCM-SHA384 ; ssl_prefer_server_ciphers activé ; ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1; ssl_session_cache partagé : SSL :10 m ; ssl_dhparam /etc/nginx.d/conf.d/dhparam.pem ; résolveur 8.8.8.8 ; # désactivez toutes les limites pour éviter HTTP 413 pour les téléchargements d'images volumineuses client_max_body_size 0 ; # requis pour éviter HTTP 411 :voir le problème #1486 (https://github.com/moby/moby/issues/1486) chunked_transfer_encoding on ; location /v2/ { # Ne pas autoriser les connexions depuis docker 1.5 et versions antérieures # docker pre-1.6.0 n'a pas correctement défini l'agent utilisateur sur ping, catch "Go *" user agents if ($http_user_agent ~ "^(docker\/ 1\.(3|4|5(?!\.[0-9]-dev))|Aller ).*$" ) { return 404; } # Pour ajouter une authentification de base à la v2, utilisez le paramètre auth_basic. auth_basic "Domaine de registre" ; auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd ; ## Si $docker_distribution_api_version est vide, l'en-tête n'est pas ajouté. ## Voir la directive map ci-dessus où cette variable est définie. add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version toujours ; proxy_pass http://docker-registre ; proxy_set_header Hôte $http_host ; # requis pour l'amour du client docker proxy_set_header X-Real-IP $remote_addr ; # transmettre l'IP du vrai client proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_read_timeout 900 ; } }}

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité une fois terminé.

Configurez SELinux pour autoriser les connexions réseau pour le Private Docker Registry.

$ sudo setsebool -P httpd_can_network_connect on

Étape 6 - Lancer Docker Registry

Basculez vers le répertoire du registre Docker.

$ cd ~/docker-registry

Lancez le conteneur docker.

$ docker-compose up -d

Vérifiez l'état des conteneurs.

$ docker psCONTAINER ID IMAGE COMMANDE ÉTAT CRÉÉ NOMS DES PORTS88d6addc1687 nginx:alpine "/docker-entrypoint.…" Il y a 5 minutes Up 5 minutes 80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp docker-registry_nginx_12b112edc1c72 registre :2 "/entrypoint.sh /etc…" il y a 5 minutes Jusqu'à 5 minutes 5000/tcp docker-registry_registry_1

Connectez-vous au registre Docker.

$ docker login -u=testuser -p=testpassword https://registry.example.com

Vous pouvez également ouvrir l'URL https://registry.example.com/v2/ dans votre navigateur, et il vous demandera un nom d'utilisateur et un mot de passe. Vous devriez voir une page vide avec {} dessus.

Vous pouvez vérifier l'URL sur le terminal en utilisant curl .

$ curl -u testuser -X GET https://registry.nspeaks.xyz/v2/Entrez le mot de passe de l'hôte pour l'utilisateur 'testuser' :{}

Téléchargez la dernière image du docker Ubuntu.

$ docker pull ubuntu:latest

Marquez cette image pour le registre privé.

balise $ docker ubuntu:latest register.example.com/ubuntu2004

Poussez l'image vers le registre.

$ docker push register.example.com/ubuntu2004

Testez si la poussée a réussi.

$ curl -u testuser -X GET https://registry.nspeaks.xyz/v2/_catalogEntrez le mot de passe de l'hôte pour l'utilisateur 'testuser' :{"repositories":["ubuntu2004"]}

Entrez votre mot de passe d'authentification Nginx lorsque vous y êtes invité, et vous verrez la liste des référentiels disponibles via le registre.

Consultez la liste des images Docker actuellement disponibles.

 $ docker imagesRepository tag ID d'image créé sizeregistry 2 d3241e050fc9 il y a 5 jours 24.2Mbnginx Alpine 53722DEFE627 il y a 5 jours 23.4MBHTTPD 2 118B6ABFBF55 Il y a 5 jours 144MBUBUNTS FF0FEA8310F3 2 Weeks Il y a 72.8MBIR Mo

Étape 7 - Accéder au registre Docker et l'utiliser à partir de la machine client

Connectez-vous à votre client-serveur. À l'étape 1, nous avons installé Docker sur la machine cliente.

Connectez-vous au registre Docker privé depuis la machine cliente.

$ docker login -u=testuser -p=testpassword https://registry.example.com

Extrayez l'image Ubuntu du registre.

$ docker pull register.example.com/ubuntu2004

Répertoriez toutes les images sur votre ordinateur client.

$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEregistry.nspeaks.xyz/ubuntu2004 dernier ff0fea8310f3 il y a 2 semaines 72.8MB

Créez et lancez un conteneur à l'aide de l'image téléchargée.

$ docker run -it register.example.com/ubuntu2004 /bin/bash

Vous serez connecté au Shell dans le conteneur Ubuntu.

[email protected] :

Exécutez la commande suivante pour vérifier la version Linux.

[email protected]$ cat /etc/os-releaseNAME="Ubuntu"VERSION="20.04.4 LTS (Focal Fossa)"ID=ubuntuID_LIKE=debianPRETTY_NAME="Ubuntu 20.04.4 LTS"VERSION_ID="20.04"HOME_URL ="https://www.ubuntu.com/"SUPPORT_URL="https://help.ubuntu.com/"BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"PRIVACY_POLICY_URL="https:// www.ubuntu.com/legal/terms-and-policies/privacy-policy"VERSION_CODENAME=focalUBUNTU_CODENAME=focal

Vous pouvez maintenant commencer à utiliser votre registre Docker à partir de vos machines clientes.

Conclusion

Ceci conclut notre didacticiel sur la configuration d'un registre Docker privé sur un serveur basé sur Rocky Linux 8 qui utilise Amazon S3 comme stockage. Si vous avez des questions, postez-les dans les commentaires ci-dessous.


Rocky Linux
  1. Comment configurer et utiliser le registre Docker privé

  2. Comment configurer le registre Docker privé dans Kubernetes (k8s)

  3. Comment configurer le registre Docker privé sur Ubuntu 20.04

  4. Comment installer Docker sur AlmaLinux / Rocky Linux

  5. Comment installer et configurer Docker Container sur Rocky Linux 8

Comment installer Docker CE sur Rocky Linux 8

Comment installer Docker CE sur Rocky Linux 8

Comment installer et utiliser le conteneur Rocky Linux Docker

Comment installer Docker sur Rocky Linux et AlmaLinux

Comment créer un registre Docker privé sur Ubuntu Linux

Comment installer Docker sur Rocky Linux et AlmaLinux