ACTIVATION DU CONTAINER REGISTRY DOCKER SUR GITLAB CE

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
  1. Le fichier « gitlab.samiamoura.com.crt » : correspond au certificat qui a été généré avec la commande précédente
  2. 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


Sami AMOURA
Ingénieur Core Mobile / DevOps Junior


#azure ansible AWS CI docker git gitlab jenkins