Contexte et objectifs
GitLab est un outil actuellement incontournable pour les DevOps dâaujourdâhui. En effet, câest un outil complet qui comprend lâensemble des Ă©lĂ©ments permettant de rĂ©aliser des chaines dâintĂ©gration continue. Il embarque notamment un « Container Registry » Docker qui est directement intĂ©grĂ© Ă lâapplication.Â
Notre objectif, dans le cadre de ce tutoriel, est de vous présenter comment activer la fonctionnalité « Container Registry » de GitLab ainsi que comment utiliser ce Registry pour stocker des images Docker.
Durée de la mise en place : 1 heure.
Configuration
0 â Mise en place de lâenvironnement
Nous travaillerons avec deux serveurs linux :
Un serveur Debian oĂč sera dĂ©ployĂ©e lâapplication GitLab CE. Celle-ci sera dĂ©ployĂ©e Ă lâaide dâun conteneur Docker :
[table id=description-srv-gitlab-registry /]
Un serveur CentOS distant avec Docker installé, pour nous permettre de réaliser les tests de login, de push et pull des images Docker :
[table id=description-srv-remote-gitlab-registry /]
Schéma Infrastructure

- Mise en place de la résolution de nom
Nâayant pas de DNS, nous ajoutons Ă la main nos entrĂ©es DNS en effectuant les commandes suivantes :
Serveur GitLab
Ăditer le hostname de la machine avec la commande « hostnamectl set-hostname » :
admin@gitlab:~$ sudo hostnamectl set-hostname gitlab.samiamoura.com
Ajouter la résolution DNS :
admin@gitlab:~$ echo '3.90.17.104 ec2-3-90-17-104.compute-1.amazonaws.com gitlab.samiamoura.com' | sudo tee -a /etc/hosts
Serveur distant
Ăditer le hostname de la machine :
[centos@serveur-distant ~]$ sudo hostnamectl set-hostname serveur-distant
Ajouter la résolution DNS pour faire correspondre les adresses avec le serveur « gitlab.samiamoura.com » :
[centos@serveur-distant ~]$ echo '3.90.17.104 ec2-3-90-17-104.compute-1.amazonaws.com gitlab.samiamoura.com' | sudo tee -a /etc/hosts
1 â GĂ©nĂ©ration du certificat SSL self-signed
Pour activer le Registry Docker de « GitLab » il est nécessaire de générer un certificat SSL self-signed (auto-signé).
- Création du dossier « /etc/docker/certs.d/gitlab.samiamoura.com »
Serveur GitLab
Créer le dossier « /etc/docker/certs.d/gitlab.samiamoura.com » :
admin@gitlab:~$ sudo mkdir -p /etc/docker/certs.d/gitlab.samiamoura.com
Serveur distant
Créer le dossier « /etc/docker/certs.d/gitlab.samiamoura.com » :
[centos@serveur-distant ~]$ sudo mkdir -p /etc/docker/certs.d/gitlab.samiamoura.com
- Génération du certificat SSL self-signed
Serveur GitLab
Générer le certificat auto-signé avec la commande « openssl req » :
admin@gitlab:~$ sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.key -x509 -days 365 -out /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.crt
Remplir les champs de la façon suivante :
| Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:gitlab.samiamoura.com Email Address []: |
Important: : Tous les champs peuvent rester vides sauf le champ Common Name (e.g. server FQDN or YOUR name) qui doit impĂ©rativement contenir lâadresse publique IPv4 de la machine ou le DNS publique IPv4 de la machine ou le la rĂ©solution de nom de la machine.
Dans notre exemple nous utiliserons la résolution de nom de la machine :
| Common Name (e.g. server FQDN or YOUR name) []:gitlab.samiamoura.com |
Nous avons maintenant deux fichiers ; un au format .crt et un au format .key :
admin@gitlab:~$ sudo ls -la /etc/docker/certs.d/gitlab.samiamoura.com/
-rw-r--r-- 1 root root 2029 Mar 30 16:48 gitlab.samiamoura.com.crt
-rw------- 1 root root 3272 Mar 30 16:47 gitlab.samiamoura.com.key
- Le fichier « gitlab.samiamoura.com.crt » : correspond au certificat qui a été généré avec la commande précédente
- Le fichier « gitlab.samiamoura.com.key » : correspond à la clé qui est associée au certificat généré précédemment
- Changement des permissions des fichiers générés ( .crt et .key)
Changer les permissions des fichiers avec les droits 600 (read and write) :
admin@gitlab:~$ sudo chmod 600 /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.*
2 â Copie des fichiers .crt et .key dans le conteneur GitLab
Pour rappel, notre application GitLab est dĂ©ployĂ©e avec un conteneur Docker afin de privilĂ©gier l’agilitĂ©.
- Récupération du nom du conteneur GitLab
Lister les conteneur en cours d’exĂ©cution « docker ps » :
admin@gitlab:~$ sudo docker ps
Voici le résultat de la commande :
| CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ed0c04c32b27 gitlab/gitlab-ce:11.3.0-ce.0 « /assets/wrapper » 3 hours ago Up 3 hours (healthy) 0.0.0.0:80->80/tcp, 22/tcp, 0.0.0.0:443->443/tcp gitlab |
â Le nom du conteneur « GitLab » en cours d’Ă©xecution est : gitlab
- Copie des fichiers .crt et .key dans le conteneur gitlab
Copier les fichiers « gitlab.samiamoura.com.crt » et « gitlab.samiamoura.com.key » dans le rĂ©pertoire « /etc/gitlab » du conteneur « gitlab » Ă lâaide de la commande « docker cp » :
admin@gitlab:~$ sudo docker cp /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.crt gitlab:/etc/gitlab/
admin@gitlab:~$ sudo docker cp /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.key gitlab:/etc/gitlab/
Information : Lâemplacement des deux fichiers nâest pas important, cependant il sera impĂ©ratif dâutiliser le mĂȘme chemin des fichiers .crt et .key dans le fichier de configuration « gitlab.rb ».
- Vérification que les deux fichiers ont correctement été copiés
Administrer le conteneur « gitlab » Ă lâaide de la commande « docker exec -it » :
admin@gitlab:~$ sudo docker exec -it gitlab /bin/bash
Dans le conteneur « gitlab » se rendre dans le dossier « /etc/gitlab/ » et vérifier que les deux fichiers ont été copiés avec succÚs :
root@ed0c04c32b27:/# cd /etc/gitlab/
root@ed0c04c32b27:/etc/gitlab# ls -la gitlab.samiamoura.com.*
-rw------- 1 root root 2029 Mar 30 16:48 gitlab.samiamoura.com.crt
-rw------- 1 root root 3272 Mar 30 16:47 gitlab.samiamoura.com.key
3 â Edition du fichier de configuration de GitLab : « gitlab.rb »
Le fichier de configuration de l’application GitLab est le fichier « gitlab.rb » situĂ© dans le rĂ©pertoire « /etc/gitlab » du conteneur. Ce fichier, Ă©crit en Ruby, permet dâactiver ou de dĂ©sactiver une multitude de modules pour lâapplication GitLab. Câest notamment grĂące Ă ce fichier que nous allons pouvoir activer et utiliser notre « Container Registry » Docker.
Important : Lâensemble des commandes de cette section seront Ă exĂ©cuter dans le conteneur « gitlab ».
Dans le rĂ©pertoire « /etc/gitlab/ », crĂ©er un fichier de backup au cas oĂč nous souhaiterons rĂ©utiliser le fichier orignal :
root@ed0c04c32b27:/etc/gitlab# cp gitlab.rb gitlab.rb.bak
- Ădition du fichier « gitlab.rb »
Les numĂ©ros de lignes peuvent lĂ©gĂšrement varier, tout dĂ©pendra de la version de l’application GitLab que vous utiliserez.
~ Ligne numéro 13
Ajouter la ligne suivante correspondant Ă lâadresse IP (Nom DNS) de la machine hĂŽte :
external_url 'http://gitlab.samiamoura.com'
~ Ligne numéro 414
Ajouter la ligne suivante correspondant Ă lâadresse IP ou Nom DNS de la machine hĂŽte :
registry_external_url 'https://gitlab.samiamoura.com'
Attention : Ne pas oublier le « s » de « https ».
~ Ligne numéro 419
Vérifier que la ligne suivante est commentée :
# gitlab_rails['registry_enabled'] = false
~ Ligne numéro 422
Ajouter la ligne suivante afin de dĂ©finir le dossier oĂč seront stockĂ©es les images Docker :
gitlab_rails['registry_path'] = "/var/opt/gitlab/gitlab-rails/shared/registry"
~ Ligne numéro 431
Ajouter la ligne suivante afin dâactiver le « Container Registry » :
registry['enable'] = true
~ Ligne numéro 1190
Ajouter la ligne suivante pour activer le registry NGINX :
registry_nginx['enable'] = true
Ajouter les lignes suivantes avec les chemins des fichiers « gitlab.samiamoura.com.crt et gitlab.samiamoura.com.key » précédemment copiés dans le dossier « /etc/gitlab » du conteneur « gitlab »:
registry_nginx['ssl_certificate'] = "/etc/gitlab/gitlab.samiamoura.com.crt"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/gitlab.samiamoura.com.key"
â La configuration du fichier « gitlab.rb » est terminĂ©e. Enregistrer le fichier et quitter.
Information : Vous trouverez le fichier complet sur mon repository GitHub Ă l’adresse suivante : https://github.com/samiamoura/eazytraining-article/blob/master/gitlab-registry/gitlab.rb
- Prise en compte de la configuration
Utiliser la commande « gitlab-ctl reconfigure » afin de reconfigurer le lâapplication GitLab et prendre en compte les changements effectuĂ©s :
root@ed0c04c32b27:/etc/gitlab# gitlab-ctl reconfigure
Si la reconfiguration est effectuée avec succÚs le message suivant apparait :
Running handlers:
Running handlers complete
Chef Client finished, 37/487 resources updated in 15 seconds
gitlab Reconfigured!
4 â RĂ©solution de nom sur le PC local
Pour rappel et comme prĂ©cisĂ© au prĂ©alable, nous nâavons pas de DNS, il faut donc ajouter la rĂ©solution de nom Ă la main sur notre ordinateur local.
Ăditer le fichier hosts de votre ordinateur local de la façon suivante en ajoutant la ligne suivante :
3.90.17.104 ec2-3-90-17-104.compute-1.amazonaws.com gitlab.samiamoura.com
Lâadresse « http://gitlab.samiamoura.com/ » est dĂ©sormais atteignable depuis votre navigateur web.

5 â Configuration de l’application GitLab
Pour ce tutoriel, nous avons créé lâutilisateur « samiamoura ». Câest avec cet utilisateur que nous ferons lâensemble des dĂ©monstrations.
AprĂšs authentification, se rendre dans la partie « Admin Area » en cliquant sur lâicĂŽne suivante
.
Sur la page suivante nous pouvons voir que le module « Container Registry » est activĂ©. Cependant, il sera nĂ©cessaire de lâactiver pour chaque nouveau projet.

6 â CrĂ©ation dâun nouveau projet et activation du « Container Registry » de GitLab
Sur la mĂȘme page, cliquer sur « New project » afin de crĂ©er un nouveau projet :

Donner un nom et une description au projet et cliquer sur « Create project » :

Sur la page qui apparait aprĂšs la crĂ©ation du projet, nous pouvons constater que le « Registry » nâest pas encore activĂ© pour ce projet. Dans le menu de gauche, se rendre sur « Setting > General » :

Sur la page suivante, se rendre sur « Visibility, project features, permissions » :

Cliquer sur le bouton « Expand » pour afficher les options relatives à ce projet, puis activer le « Container registry » en cliquant sur le bouton. Cliquer sur « Save changes » pour enregistrer les modifications.

AprĂšs avoir cliquĂ© sur « Save changes », nous pouvons constater que lâonglet « Registry » est apparu dans le menu de gauche :

Cliquer sur lâonglet « Registry », la page suivante apparait avec les instructions pour pouvoir utiliser le « Container Registry » :

Nous pouvons aussi constater que celui-ci est vide pour le moment :

6 â Configuration des accĂšs au « Container Registry » GitLab
Pour pouvoir utiliser le Container Registry, il va nous falloir configurer notre certificat et le copier sur le serveur distant.
- Management du certificat
Serveur GitLab
Renommer le fichier « /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.crt » en « /etc/docker/certs.d/gitlab.samiamoura.com/ca.crt »
admin@gitlab:~$ sudo mv /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.crt /etc/docker/certs.d/gitlab.samiamoura.com/ca.crt
Supprimer le fichier « /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.key » car celui-ci va nous empĂȘcher de nous logguer sur notre « Container registry » :
aadmin@gitlab:~$ sudo rm -f /etc/docker/certs.d/gitlab.samiamoura.com/gitlab.samiamoura.com.key
Copier le certificat « /etc/docker/certs.d/gitlab.samiamoura.com/ca.crt » sur le serveur distant dans le dossier « /etc/docker/certs.d/gitlab.samiamoura.com/ » afin de pouvoir utiliser le « Container Registry » avec la commande « scp » :
admin@gitlab:~$ sudo scp -i "devops.pem" /etc/docker/certs.d/gitlab.samiamoura.com/ca.crt centos@serveur-distant:/etc/docker/certs.d/gitlab.samiamoura.com/
Serveur distant
Vérifier que le fichier « ca.crt » est effectivement présent :
[centos@serveur-distant ~]$ ls -la /etc/docker/certs.d/gitlab.samiamoura.com/
-rw-------. 1 root root 2029 Mar 30 19:44 ca.crt
7 â Utilisation du « Container Registry » GitLab
- Authentification
Pour utiliser le « Container Registry », il va dâabord falloir se logguer avec un utilisateur.
Se logguer au « Container Registry », avec la commande « sudo docker login » :
[centos@serveur-distant ~]$ sudo docker login gitlab.samiamoura.com
Username: samiamoura
Password:
Information : Nous avons utilisĂ© les identifiants (login/password) de l’utilisateur « samiamoura » créé sur « GitLab » prĂ©alablement.
Si l’authentification est rĂ©ussie le message suivant apparait :
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
- Push / Pull des images
Pour tester notre « Container Registry », nous allons rĂ©cupĂ©rer une image « Nginx » du DockerHub et la pusher sur notre « Container Registry » aprĂšs lâavoir tagguĂ©e avec les informations liĂ©es Ă notre compte.
RĂ©cupĂ©rer lâimage « Nginx » avec la commande « docker pull » :
[centos@serveur-distant ~]$ sudo docker pull nginx:latest
latest: Pulling from library/nginx
68ced04f60ab: Pull complete
28252775b295: Pull complete
a616aa3b0bf2: Pull complete
Digest: sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b
Status: Downloaded newer image for nginx:latest
Tagguer lâimage prĂ©cĂ©demment tĂ©lĂ©chargĂ©e avec les Ă©lĂ©ments de notre repository et comme indiquĂ© sur la page de notre « Container Registry ».

Information : La structure de l’image se compose de la façon suivante : « domaineName/usernameGitlab/projectName/imageName:tag »
Utiliser la commande « docker tag » pour tagguer lâimage « Nginx » avec les nos informations :
[centos@serveur-distant ~]$ sudo docker tag nginx:latest gitlab.samiamoura.com/samiamoura/gitlab_registry/nginx:samiamoura-gitlabregistry
Utiliser la commande « docker images » pour lister les images :
[centos@serveur-distant ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6678c7c2e56c 3 weeks ago 127MB
gitlab.samiamoura.com/samiamoura/gitlab_registry/nginx samiamoura-gitlabregistry 6678c7c2e56c 3 weeks ago 127MB
Utiliser la commande « docker push » pour pusher lâimage sur notre « Container Registry ».
[[centos@serveur-distant ~]$ sudo docker push gitlab.samiamoura.com/samiamoura/gitlab_registry/nginx:samiamoura-gitlabregistry
The push refers to repository [gitlab.samiamoura.com/samiamoura/gitlab_registry/nginx]
d37eecb5b769: Pushed
99134ec7f247: Pushed
c3a984abe8a8: Pushed
samiamoura-gitlabregistry: digest: sha256:7ac7819e1523911399b798309025935a9968b277d86d50e5255465d6592c0266 size: 948
VĂ©rifier que notre image « Nginx » est prĂ©sente sur notre « Container Registry » GitLab. Se rendre sur l’application GitLab :

Environnement
Infrastructure
Les serveurs utilisĂ©s pour rĂ©aliser ce tutoriel sont des instances EC2 qui ont Ă©tĂ© provisionnĂ©es avec le provider AWS et grĂące Ă CloudFormation permettant dâavoir une architecture de type IaC. Ces stacks CloudFormation rĂ©cupĂšrent dynamiquement les sources des applications Ă dĂ©ployer sur mon repository GitHub. Les applications sont dĂ©ployĂ©es dans des conteneurs Docker afin de privilĂ©gier l’agilitĂ©.
Information : Toutes les ressources utilisées lors de ce tutoriel ont été déprovisionnées.
Distribution et version des serveurs
[table id=info-os-gitlab-registry /]
Version des applications
[table id=info-appli-gitlab-registry /]
Références
- Github : https://github.com/samiamoura
- LinkedIn : http://www.linkedin.com/in/sami-amoura

Sami AMOURA
Ingénieur Core Mobile / DevOps Junior

Rétroliens/Pings