Docker · 13 min read · Oct 05, 2025
Comment configurer un registre Docker privé sur Ubuntu 22.04

Si vous travaillez pour une organisation et souhaitez garder vos images Docker en interne pour un déploiement rapide, alors héberger un dépôt 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 avec votre système CI/CD, améliorant ainsi votre flux de travail.
Ce tutoriel vous apprendra à configurer et à utiliser un registre Docker privé sur un serveur Ubuntu 22.04 en utilisant Amazon S3 comme emplacement de stockage.
Prérequis
- Deux serveurs Linux avec Ubuntu 22.04. Un serveur agira comme hôte du registre, tandis que l’autre sera utilisé comme 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.compour notre tutoriel. - Un utilisateur non-root avec des privilèges sudo sur les deux machines.
- Assurez-vous que tout est à jour.
$ sudo apt update $ sudo apt upgrade - Quelques paquets dont votre système a besoin. Certains de ces paquets peuvent déjà être installés sur votre système.
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
Étape 1 - Configurer le pare-feu
La première étape consiste à configurer le pare-feu. Ubuntu est livré avec ufw (Uncomplicated Firewall) par défaut.
Vérifiez si le pare-feu est en cours d’exécution.
$ sudo ufw statusVous devriez obtenir la sortie suivante.
Status: inactiveAutorisez le port SSH afin que le pare-feu ne rompe pas la connexion actuelle lors de son activation.
$ sudo ufw allow OpenSSHAutorisez également les ports HTTP et HTTPS.
$ sudo ufw allow http
$ sudo ufw allow httpsActivez le pare-feu
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupVérifiez à nouveau l’état du pare-feu.
$ sudo ufw statusVous devriez voir une sortie similaire.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)Étape 2 - Installer Docker et Docker Compose
Cette étape est requise sur les serveurs et les machines clientes.
Ubuntu 22.04 est livré avec une version plus ancienne de Docker. Pour installer la dernière version, commencez par importer la clé GPG de Docker.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgCréez un fichier de dépôt Docker.
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullMettez à jour la liste des dépôts du système.
$ sudo apt updateInstallez la dernière version de Docker.
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-pluginVérifiez qu’il fonctionne.
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-04-13 09:37:09 UTC; 3min 47s ago
TriggeredBy: ? docker.socket
Docs: https://docs.docker.com
Main PID: 2106 (dockerd)
Tasks: 7
Memory: 26.0M
CPU: 267ms
CGroup: /system.slice/docker.service
??2106 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sockPar défaut, Docker nécessite des privilèges root. Si vous souhaitez éviter d’utiliser sudo chaque fois que vous exécutez la commande docker, ajoutez votre nom d’utilisateur au groupe docker.
$ sudo usermod -aG docker $(whoami)Vous devrez vous déconnecter du serveur et vous reconnecter en tant que même utilisateur pour activer ce changement ou utiliser la commande suivante.
$ su - ${USER}Confirmez que votre utilisateur est ajouté au groupe Docker.
$ groups
navjot wheel dockerÉtape 3 - Configurer le registre Docker
Créer des répertoires d’utilisateur
Créez un répertoire pour la configuration du registre.
$ mkdir ~/docker-registryPassez au répertoire docker-registry.
$ 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.
$ mkdir logsCréer un bucket 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 fichier docker-compose.yml, mais avoir un fichier séparé est bien mieux.
Créez un bucket avec les paramètres suivants.
- L’ACL doit être désactivée.
- L’accès public au bucket doit être désactivé.
- La version du bucket doit être désactivée.
- Activez le chiffrement du bucket en utilisant les clés gérées par Amazon S3. (SSE-S3)
- Le verrouillage des objets doit être désactivé.
Créez un utilisateur IAM avec la politique suivante.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::S3_BUCKET_NAME"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload"
],
"Resource": "arn:aws:s3:::S3_BUCKET_NAME/*"
}
]
}Remplacez S3_BUCKET_NAME par le nom de votre bucket S3.
Notez la clé secrète, la valeur secrète et la région du bucket à utiliser plus tard.
Créer un fichier Docker Compose
Créez le fichier docker-compose.yml et ouvrez-le pour l’édition.
$ nano docker-compose.ymlCollez le code suivant dedans.
services:
registry:
image: registry:2
restart: always
environment:
- 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=AKIA3FIG4NVFNXKQXMSJ
- REGISTRY_STORAGE_S3_SECRETKEY=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
- REGISTRY_STORAGE_S3_V4AUTH=true
- REGISTRY_STORAGE_S3_ROOTDIRECTORY=/image-registry
- REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR=inmemory
- REGISTRY_HEALTH_STORAGEDRIVER_ENABLED=false
nginx:
image: "nginx:alpine"
ports:
- 443:443
links:
- registry:registry
volumes:
- ./auth:/etc/nginx/conf.d
- ./auth/nginx.conf:/etc/nginx/nginx.conf:ro
- ./logs:/var/log/nginx
- /etc/letsencrypt:/etc/letsencryptEnregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.
Passons en revue ce que nous avons configuré dans notre fichier compose.
- La première étape consiste à récupérer la dernière image de la version 2 du registre Docker depuis le hub. Nous n’utilisons pas le tag latest car cela peut causer des problèmes en cas de mise à niveau majeure. Le définir sur 2 vous permet de récupérer toutes les mises à jour 2.x tout en évitant d’être automatiquement mis à niveau vers la prochaine version majeure, ce qui peut introduire des changements incompatibles.
- Le conteneur de registre est configuré pour redémarrer toujours en cas de défaillance ou d’arrêt inattendu.
- Nous avons défini diverses variables d’environnement pour le stockage Amazon S3. Passons rapidement en revue.
- 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 bucket S3.
- REGISTRY_STORAGE_S3_BUCKET définit le nom de votre bucket 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. Elle doit être supérieure à 5 Mo (5 1024 1024).
- REGISTRY_STORAGE_S3_SECURE - définissez-le sur true si vous allez utiliser HTTPS.
- REGISTRY_STORAGE_S3_ACCESSKEY et REGISTRY_STORAGE_S3_SECRETKEY - Identifiants utilisateur que vous avez récupérés après avoir créé votre utilisateur IAM.
- REGISTRY_STORAGE_S3_V4AUTH - définissez-le sur true si vous utilisez la version 4 de l’authentification AWS. Si vous obtenez des erreurs liées à la connexion S3, définissez-le sur false.
- REGISTRY_STORAGE_S3_ROOTDIRECTORY - définit le répertoire racine dans votre bucket 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 définir pour utiliser Redis.
- REGISTRY_HEALTH_STORAGEDRIVER_ENABLED - définissez-le sur false pour désactiver le service de vérification de la santé du stockage du registre. Il y a un bug 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, qui est ce que nous avons exposé sur notre serveur au docker.
./auth:/etc/nginx/conf.dassure que tous les paramètres de Nginx sont disponibles dans le conteneur../auth/nginx.conf:/etc/nginx/nginx.conf:romappe le fichier de paramètres Nginx du système à celui du conteneur en mode lecture seule../logs:/var/log/nginxpermet d’accéder aux journaux de Nginx sur le système en les mappant au répertoire des journaux de Nginx dans le conteneur.- Les paramètres du registre Docker sont stockés dans le fichier
/etc/docker/registry/config.ymldans le conteneur, et nous l’avons mappé au fichierconfig.ymldans le répertoire actuel, que nous créerons à l’étape suivante.
Configurer l’authentification
Pour configurer l’authentification HTTP, vous devez installer le paquet httpd-tools.
$ sudo apt install apache2-utils -yCréez le fichier de mot de passe dans le répertoire ~/docker-registry/auth.
$ htpasswd -Bc ~/docker-registry/auth/nginx.htpasswd user1
New password:
Re-type new password:
Adding password for user user1Le drapeau -c indique à la commande de créer un nouveau fichier, et le drapeau -B est pour utiliser l’algorithme bcrypt pris en charge par Docker. Remplacez user1 par un nom d’utilisateur de votre choix.
Si vous souhaitez ajouter d’autres utilisateurs, exécutez la commande à nouveau, mais sans le drapeau -c.
$ htpasswd -B ~/docker-registry/auth/registry.password user2Maintenant, le fichier sera mappé au conteneur de registre pour l’authentification.
Étape 4 - Installer SSL
Nous devons installer Certbot pour générer le certificat SSL. Vous pouvez soit installer Certbot en utilisant le dépôt d’Ubuntu, soit récupérer la dernière version en utilisant l’outil Snapd. Nous utiliserons la version Snapd.
Ubuntu 22.04 est livré avec Snapd installé par défaut. Exécutez les commandes suivantes pour vous assurer que votre version de Snapd est à jour.
$ sudo snap install core && sudo snap refresh coreInstallez Certbot.
$ sudo snap install --classic certbotUtilisez la commande suivante pour vous assurer que la commande Certbot peut être exécutée en créant un lien symbolique vers le répertoire /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbotExécutez la commande suivante pour générer un certificat SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d registry.example.comLa commande ci-dessus téléchargera un certificat dans le répertoire /etc/letsencrypt/live/registry.example.com sur votre serveur.
Générez un certificat de groupe Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096Vérifiez le service de planification de renouvellement de Certbot.
$ sudo systemctl list-timersVous trouverez snap.certbot.renew.service comme l’un des services programmés pour s’exécuter.
NEXT LEFT LAST PASSED UNIT ACTIVATES
.....
Sun 2023-04-14 00:00:00 UTC 19min left Sat 2023-02-25 18:04:05 UTC n/a snap.certbot.renew.timer snap.certbot.renew.service
Sun 2023-04-14 00:00:20 UTC 19min left Sat 2023-02-25 10:49:23 UTC 14h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Sun 2023-04-14 00:44:06 UTC 3h 22min left Sat 2023-02-25 20:58:06 UTC 7h ago apt-daily.timer apt-daily.serviceFaites un essai à sec du processus pour vérifier si le renouvellement SSL fonctionne correctement.
$ sudo certbot renew --dry-runSi vous ne voyez aucune erreur, vous êtes prêt. Votre certificat se renouvellera automatiquement.
Copier le fichier Dhparam dans le conteneur
Copiez le certificat de groupe Diffie-Hellman dans le répertoire ~/docker-registry/auth, 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 comme proxy frontal pour le serveur de registre Docker. Le registre Docker est livré avec un serveur intégré fonctionnant sur le port 5000. Nous allons le placer derrière Nginx.
Créez et ouvrez le fichier ~/docker-registry/auth/nginx.conf pour l’édition.
$ sudo nano ~/docker-registry/auth/nginx.confCollez le code suivant dedans.
events {
worker_connections 1024;
}
http {
upstream docker-registry {
server registry:5000;
}
## Définir une variable pour nous aider à décider si nous devons ajouter le
## 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 est non défini
## puisque nginx authentifie avant de faire le proxy.
map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
'' 'registry/2.0';
}
server {
listen 443 ssl http2;
server_name registry.example.com;
# SSL
ssl_certificate /etc/letsencrypt/live/registry.example.com/fullchain.pem;
ssl_certificate_key /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;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_session_cache shared:SSL:10m;
ssl_dhparam /etc/nginx/conf.d/dhparam.pem;
resolver 8.8.8.8;
# désactiver 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 de docker 1.5 et antérieur
# docker pré-1.6.0 n'a pas correctement défini l'agent utilisateur sur ping, attrapez les agents utilisateurs "Go *"
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
return 404;
}
# Pour ajouter une authentification de base à v2, utilisez le paramètre auth_basic.
auth_basic "Registry realm";
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 always;
proxy_pass http://docker-registry;
proxy_set_header Host $http_host; # requis pour le client docker
proxy_set_header X-Real-IP $remote_addr; # passer l'IP réelle du 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 entrant Y lorsque vous y êtes invité une fois terminé.
Étape 6 - Lancer le registre Docker
Passez au répertoire du registre Docker.
$ cd ~/docker-registryLancez le conteneur docker.
$ docker compose up -dVérifiez l’état des conteneurs.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3328b7e36bb2 nginx:alpine "/docker-entrypoint.…" About a minute ago Up 3 seconds 80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp docker-registry-nginx-1
bf7cdfc0e013 registry:2 "/entrypoint.sh /etc…" About a minute ago Up About a minute 5000/tcp docker-registry-registry-1Connectez-vous au registre Docker.
$ docker login -u=user1 -p=password https://registry.example.comVous obtiendrez la sortie suivante.
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/username/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login SucceededVous 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 dans le terminal en utilisant curl.
$ curl -u user1 -X GET https://registry.example.com/v2/
Enter host password for user 'user1':
{}Téléchargez la dernière image Docker d’Ubuntu.
$ docker pull ubuntu:latestTaguez cette image pour le registre privé.
$ docker tag ubuntu:latest registry.example.com/ubuntu2204Poussez l’image vers le registre.
$ docker push registry.example.com/ubuntu2204Testez si le push a réussi.
$ curl -u user1 -X GET https://registry.example.com/v2/_catalog
Enter host password for user 'user1':
{"repositories":["ubuntu2204"]}Entrez votre mot de passe d’authentification Nginx lorsque vous y êtes invité, et vous verrez la liste des dépôts disponibles via le registre.
Déconnectez-vous en utilisant le terminal pour effacer les identifiants.
$ docker logout https://registry.example.com
Removing login credentials for registry.example.comVérifiez la liste des images Docker actuellement disponibles à l’utilisation.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2 8db46f9d7550 2 weeks ago 24.2MB
nginx alpine 8e75cbc5b25c 2 weeks ago 41MB
ubuntu latest 08d22c0ceb15 5 weeks ago 77.8MB
registry.example.com/ubuntu2204 latest 08d22c0ceb15 5 weeks ago 77.8MBÉtape 7 - Accéder et utiliser le registre Docker depuis la machine cliente
Connectez-vous à votre serveur client. À l’étape 1, nous avons installé Docker sur la machine cliente.
Connectez-vous au registre Docker privé depuis la machine cliente.
$ docker login -u=user1 -p=password https://registry.example.comTirez l’image Ubuntu depuis le registre.
$ docker pull registry.example.com/ubuntu2204Listez toutes les images sur votre machine cliente.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.example.com/ubuntu2204 latest 08d22c0ceb15 5 weeks ago 77.8MBCréez et lancez un conteneur en utilisant l’image téléchargée.
$ docker run -it registry.example.com/ubuntu2204 /bin/bashVous serez connecté au Shell à l’intérieur du conteneur Ubuntu.
root@647899f255db:Exécutez la commande suivante pour vérifier la version de Linux.
root@a2da49fdbea9$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
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"
UBUNTU_CODENAME=jammyMaintenant, vous pouvez commencer à utiliser votre registre Docker depuis vos machines clientes.
Conclusion
Cela conclut notre tutoriel sur la configuration d’un registre Docker privé sur un serveur Ubuntu 22.04 qui utilise Amazon S3 comme stockage. Si vous avez des questions, postez-les dans les commentaires ci-dessous.
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.