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-composeRechargez 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-registryBasculer vers le
docker-registry
répertoire.$ cd ~/docker-registryCréez un répertoire pour stocker le mot de passe d'authentification HTTP, les fichiers de configuration Nginx et les certificats SSL.
$ mkdir authCréez un autre répertoire pour stocker les journaux Nginx.
Journaux $ mkdirCré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.
-
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.
-
Le conteneur de registre est configuré pour redémarrer toujours en cas de panne ou d'arrêt inattendu.
-
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.
-
Le registre Docker communique via le port 5000, ce que nous avons exposé dans notre serveur au docker.
-
./auth:/etc/nginx/conf.d
le mappage garantit que tous les paramètres de Nginx sont disponibles dans le conteneur. -
./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. -
./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. -
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 leconfig.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.