Présentation
Si vous souhaitez garantir un développement CI/CD fluide à l'aide de la plate-forme Docker, envisagez de configurer un registre Docker privé. Non seulement cela accélère la livraison, mais c'est aussi un moyen pratique de distribuer des ressources et de partager des images Docker entre conteneurs.
Dans ce didacticiel, découvrez comment configurer un registre Docker privé et le configurer pour l'accessibilité externe.
Prérequis
- Accès à un compte utilisateur avec sudo ou racine privilèges
- Un serveur client
- Un serveur pour Docker Registry privé
- Docker et Docker–Compose sur les deux serveurs
- Nginx sur le serveur privé Docker Registry
Qu'est-ce qu'un registre Docker privé ?
Registre Docker est une application côté serveur et fait partie du produit de plate-forme en tant que service de Docker. Il vous permet de stocker localement toutes vos images Docker dans un emplacement centralisé.
Lorsque vous configurez un registre privé, vous affectez un serveur pour communiquer avec Docker Hub via Internet. Le rôle du serveur est d'extraire et de transférer des images, de les stocker localement et de les partager avec d'autres hôtes Docker.
En exécutant un registre accessible de l'extérieur, vous pouvez économiser des ressources précieuses et accélérer les processus. Le logiciel vous permet d'extraire des images sans avoir à vous connecter au Docker Hub, ce qui économise de la bande passante et sécurise le système contre les menaces en ligne potentielles.
Les hôtes Docker peuvent accéder au référentiel local via une connexion sécurisée et copier des images à partir du registre local pour créer leurs propres conteneurs.
Avant de commencer
Comme indiqué dans la section des prérequis, le guide suppose que Docker et Docker-Compose sont déjà installés sur tous les serveurs.
Pour vérifier que vous disposez du logiciel requis, vous pouvez vérifier leurs versions avec les commandes :
docker version
docker-compose version
Vous voudrez également vous assurer que le service Docker a démarré et qu'il est configuré pour s'activer au démarrage :
sudo systemctl start docker
sudo systemctl enable docker
Installer et configurer le registre Docker privé
Étape 1 :Créer des répertoires de registre
Commencez à configurer le serveur qui hébergera le registre privé. Vous voulez d'abord créer un nouveau répertoire qui stockera tous les fichiers de configuration requis.
1. La commande suivante crée un nouveau répertoire de projet intitulé registry
et deux sous-répertoires - nginx
et auth
:
mkdir -p registry/{nginx, auth}
2. Accédez au registry
et créez deux nouveaux répertoires dans nginx
:
cd registry/
mkdir -p nginx/{conf.d/,ssl}
3. Voir la hiérarchie des répertoires nouvellement créés en tapant :
tree
Étape 2 :Créer un script Docker-Compose et définir des services
Ensuite, vous devez créer et configurer un nouveau docker-compose.yml
scénario. Le script définit la version de Docker-Compose, ainsi que les services dont vous avez besoin pour configurer un registre privé.
1. Créez un nouveau fichier dans le registry
répertoire, avec un éditeur de texte de votre choix :
nano docker-compose.yml
2. Il y a quelques éléments que vous devez définir dans ce fichier de configuration, alors suivez attentivement et ajoutez soigneusement chaque section du contenu :
version: '3'
services:
#Registry
registry:
image: registry:2
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- registrydata:/data
- ./auth:/auth
networks:
- mynet
#Nginx Service
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynet
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
registrydata:
driver: local
3. Enregistrez et fermez le fichier.
La configuration expliquée :
Tout d'abord, vous définissez la version de Docker-Compose que vous souhaitez utiliser. Dans cet exemple, il s'agit de version: '3'
. Ensuite, vous passez à la définition de tous les composants du registre Docker, en commençant par le #Registry
services.
Docker Registry est essentiellement un conteneur exécutant l'image de registre, c'est pourquoi l'image est définie comme registry:2
.
Ajout du restart: always
garantit que vous démarrez Docker Registry en tant que service dès que vous démarrez le système.
Détermination des ports 5000:5000
indique à Docker que l'hôte et le conteneur en cours d'exécution communiquent via les numéros de port définis.
Le service montera le volume docker registrydata
et le répertoire local auth
, ainsi que son fichier d'authentification registry.passwd
.
L'élément suivant est le #Nginx Service
. La configuration décrit le service s'exécute sur les ports 80:80
(HTTPS) et 443:443
(HTTPS). Il montera le répertoire local pour la configuration virtuelle (conf.d
) et certificats SSL (ssl
).
Enfin, définissez mynet
avec un pilote de pont et les registrydata
avec un pilote local comme paramètres pour le réseau personnalisé.
Étape 3 :Configurer le transfert de port Nginx
L'étape suivante consiste à configurer un hôte virtuel Nginx et à le configurer pour le service Nginx.
1. Déplacez-vous vers nginx/conf.d/
répertoire que vous avez créé à l'étape précédente :
cd nginx/conf.d/
2. Créez un nouveau fichier d'hôte virtuel nommé registry.conf
:
nano registry.conf
3. Ajoutez le contenu suivant :
upstream docker-registry {
server registry:5000;
}
server {
listen 80;
server_name registry.example-server.com;
return 301 https://registry.example-server.com$request_uri;
}
server {
listen 443 ssl http2;
server_name registry.example-server.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# Log files for Debug
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location / {
# Do not allow connections from docker 1.5 and earlier
# docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
return 404;
}
proxy_pass http://docker-registry;
proxy_set_header Host $http_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;
proxy_read_timeout 900;
}
}
4. Enregistrez le fichier et revenez au shell du terminal.
Étape 4 :Augmenter la taille de téléchargement du fichier Nginx
Par défaut, Nginx limite la taille de téléchargement du fichier à 1 Mo . Comme de nombreuses images Docker dépassent ce nombre, la meilleure pratique consiste à augmenter la taille de fichier maximale sur Nginx. Assurez-vous que vous pouvez télécharger des images de plus grande taille en définissant le max_body_size
à 2 Go .
1. Créez un fichier de configuration supplémentaire avec :
nano additional.conf
2. Ajoutez la ligne suivante dans le fichier :
client_max_body_size 2G;
3. Enregistrez et fermez le fichier.
Étape 5 :Configurer le certificat SSL et l'authentification de base
1. Les fichiers de certificats SSL de votre domaine doivent être copiés dans le ssl
annuaire. Pour ce faire, exécutez les commandes :
cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/
2. Ensuite, passez à auth
répertoire :
cd auth
3. Et demandez un nouveau fichier de mot de passe nommé registry.passwd
pour votre utilisateur :
htpasswd -Bc registry.passwd example
4. Tapez un mot de passe fort et retapez-le pour confirmer. Avec cela, vous avez ajouté un mot de passe pour votre utilisateur.
Étape 6 :Ajoutez le certificat de l'autorité de certification racine
Vous devez maintenant ajouter le certificat Root CA à Docker et au système sur lequel vous travaillez.
1. Exportez le .crt
fichier avec OpenSSL en tapant :
openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt
2. Copiez le certificat racine dans un nouveau répertoire pour les certificats Docker :
mkdir -p /etc/docker/certs.d/registry.example-server.com/
cp rootCA.crt /etc/docker/certs.d/example-server.com/
3. Ensuite, copiez le même certificat dans un autre nouveau répertoire sous le nom /usr/share/ca-certificate/extra
:
mkdir -p .usr.share.ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/
4. Reconfigurez le ca-certificate
nouvellement créé package en tapant :
dpkg-reconfigure ca-certificates
5. Enfin, redémarrez le service Docker :
systemctl restart docker
Étape 7 :Exécutez Docker Registry
Une fois que tout est configuré et prêt, vous pouvez créer le conteneur Docker Registry à l'aide de Docker-Compose :
docker-compose up -d
Vérifiez si le registre et les services Nginx sont en cours d'exécution :
docker-compose ps
netstat -plntu
La sortie devrait vous montrer les services et leurs ports assignés.
Extraire l'image de Docker Hub vers un registre privé
1. Pour stocker localement une image de Docker Hub dans votre registre privé, utilisez le docker pull
commande :
docker pull [docker_image]
2. Ajoutez une balise à l'image pour l'étiqueter pour le registre privé :
docker image tag [docker_image] registry.example-server.com/[new_image_name]
3. Vous pouvez vérifier si l'image Docker est disponible localement en demandant au système de répertorier toutes les images stockées localement :
docker images
Comment transférer une image Docker vers un registre privé
1. Pour pousser une image d'un hôte Docker vers le serveur de registre privé Docker, vous devez d'abord vous connecter au registre avec la commande :
docker login https://registry.example-server.com/v2/
2. Saisissez le nom d'utilisateur et mot de passe que vous avez défini pour l'hôte virtuel.
3. Vous pouvez maintenant pousser votre image vers le registre privé avec la commande :
docker push registry.example-server.com/[new_image_name]
4. Voir une liste d'images stockées dans le registre privé Docker :
http -a example https://registry.example-server.com/v2/_catalog