Pour éviter de rendre mes images Docker publiques, je voulais un repo privé. J’aurais pu choisir une solution simple et utiliser directement un repository privé sur Docker Hub.
Mais comme j’aime bien autohéberger mes outils, je me suis penché sur une autre solution. En faisant mes recherches, je suis d’abord tombé sur https://hub.docker.com/_/registry, puis je me suis aperçu que GitLab avait déjà une fonctionnalité intégrée de registry pour Docker.
Et comme j’ai déjà un GitLab qui tourne chez moi, je n’ai qu’à activer et configurer cette fonctionnalité.
Cet article détaille mon implémentation de GitLab Container Registry.
Je me suis basé sur la doc de Gitlab registry , la doc d’administration de Gitlab Registry et pendant la mise en place, j’ai vu
ce qui m’a mener à Container registry metadata database puis Enable the metadata database for new Omnibus installations
Pour rappel, mon instance de Gitlab est containerisé avec Docker.
Je me suis basé sur la doc de Gitlab Registry, la doc d’administration de Gitlab Registry et, pendant la mise en place, j’ai vu:
Ce qui m’a mené à Container registry metadata database, puis Enable the metadata database for new Omnibus installations.
Pour rappel, mon instance de GitLab est containerisée avec Docker.
Vérifier l’utilisateur registry
Pour simplifier la mise en place, je vais configurer la connexion à la base PostgreSQL avec l’utilisateur système registry.
Donc, pour ça, je vérifie qu’il existe dans mon container:
docker exec -it gitlab bash
puis:
cat /etc/passwd
ce qui me donne, entre autre:
registry:x:993:993::/var/opt/gitlab/registry:/bin/sh
Il existe bien, donc c’est bon, je peux passer à la mise en place de la base de données.
Créer la base de données
Toujours dans mon container GitLab, je vais créer la base de données sur le Postgres intégré à l’image Docker de GitLab:
gitlab-psql -c "CREATE USER registry WITH PASSWORD 'registrypassword'"
gitlab-psql -c "CREATE DATABASE gitlab_registry WITH OWNER registry"
Configurer Gitlab
Je peux maintenant configurer la fonctionnalité de Registry et la connexion à la base de données pour le Registry. Dans mon fichier de configuration GitLab, j’ajoute :
postgresql['custom_pg_hba_entries'] = {
registry_db: [
{
type: 'local',
database: 'gitlab_registry',
user: 'registry',
method: 'md5'
}
]
}
et:
################################################################################
## Container Registry settings
##! Docs: https://docs.gitlab.com/ee/administration/packages/container_registry.html
################################################################################
registry_external_url 'https://gitlab.anthony-jacob.com:1234'
### Settings used by GitLab application
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = "gitlab.anthony-jacob.com"
gitlab_rails['registry_port'] = "1234"
gitlab_rails['registry_path'] = "/var/opt/gitlab/gitlab-rails/shared/registry"
gitlab_rails['registry_api_url'] = "http://127.0.0.1:9876"
### Settings used by Registry application
registry['enable'] = true
registry['username'] = "registry"
registry['group'] = "registry"
registry['dir'] = "/var/opt/gitlab/registry"
registry['registry_http_addr'] = "127.0.0.1:9876"
registry['database'] = {
'enabled' => true,
'host' => '/var/opt/gitlab/postgresql/',
'user' => 'registry',
'password' => 'registrypassword',
'dbname' => 'gitlab_registry',
'sslmode': 'disable'
}
registry_nginx['enable'] = true
registry_nginx['listen_port'] = 1234
registry_nginx['listen_https'] = true
registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/live/anthony-jacob.com/fullchain.pem"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/live/anthony-jacob.com/privkey.pem"
À ce stade, je peux reconfigurer GitLab et redémarrer le service PostgreSQL:
gitlab-ctl reconfigure
gitlab-ctl restart postgresql
Ce qui me permet ensuite de vérifier que les settings de connexion à la base de données sont bien pris en compte dans le fichier /var/opt/gitlab/postgresql/data/pg_hba.conf
cat /var/opt/gitlab/postgresql/data/pg_hba.conf | grep registry -B 3
J’ai bien une connexion locale à la base gitlab_registry
pour mon utilisateur registry
.
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# registry_db
local gitlab_registry registry md5
Je peux maintenant initialiser la base de données avec:
gitlab-ctl registry-database migrate up
Tests et vérifications
Donc, après avoir exposé le nouveau port de mon container Docker et ouvert le port sur mon routeur (le port 1234 dans ma config), j’ai maintenant un environnement qui devrait fonctionner. Pour tester, je vais push et pull une image.
Créer un jeton d’accès
Je crée d’abord un jeton d’accès (tu peux aussi très bien t’authentifier avec ton mot de passe) :
Puis, en ligne de commande, j’essaie de me connecter à mon registry tout neuf.
Se loguer au Registry GitLab
docker login gitlab.anthony-jacob.com:1234 -u MonUser -p MonPassword_OU_AccessToken
Ce qui me donne un tant attendu Login Succeeded
Push une image sur le registry GitLab
Maintenant, pour tester, je build une image Docker que j’avais déjà avec:
docker build -t gitlab.anthony-jacob.com:1234/anthony.jacob/dummy-test-project:latest . -f ./Dockerfile
Et enfin, je la pousse avec :
docker push gitlab.anthony-jacob.com:1234/anthony.jacob/dummy-test-project:latest
Pull une image depuis le registry GitLab
Maintenant que mon image est bien sur mon registry privé, c’est le test ultime. Je vais, depuis un autre PC, pull mon image (après bien sûr m’être aussi logué depuis ce nouveau PC) :
docker login gitlab.anthony-jacob.com:1234 -u MonUser -p MonPassword_OU_AccessToken
docker image pull gitlab.anthony-jacob.com:6666/anthony.jacob/dummy-test-project:latest
Et c’est bon ! Tout fonctionne comme prévu !
Eh bien !! Ça ne paraît peut-être pas, mais c’était une sacrée aventure !! Après avoir tâtonné avec la configuration, je suis enfin arrivé à mes fins.
La prochaine étape pour moi va être de configurer du CI/CD pour que mes projets soient déployés automatiquement.
En tout cas, si tu passes par là, j’espère que ce contenu pourra t’être utile. N’hésite pas à me faire un retour. En attendant, je te dis à bientôt !!