Exercice 05 : Utiliser Docker dans un pipeline GitLab CI
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Configurer Docker-in-Docker (DinD) avec
image: docker:26etservices: docker:26-dind - ✅ Comprendre le rôle de
DOCKER_TLS_CERTDIR - ✅ Construire une image Docker avec
docker builddans un job GitLab CI - ✅ Vérifier la présence de l'image avec
docker images
Durée estimée : 20 minutes
Difficulté : ⭐⭐☆☆☆ (Débutant)
Prérequis :
- Exercices 01 à 04 complétés
- Notions de base Docker (Dockerfile,
docker build)
📖 Contexte
Pour construire des images Docker dans un pipeline GitLab CI, vous avez besoin de Docker-in-Docker (DinD) : un daemon Docker qui tourne à l'intérieur d'un conteneur. GitLab gère cela via les services:, qui sont des conteneurs qui tournent en parallèle du job et sont accessibles via un alias réseau.
📋 Énoncé
Créez un Dockerfile pour une application Node.js simple, puis un pipeline GitLab CI qui construit l'image en utilisant Docker-in-Docker et vérifie que l'image est bien présente.
🧭 Déroulement de l'exercice
Tâche 1 : Créer un Dockerfile simple
À la racine du projet, créez un Dockerfile basé sur node:20-alpine qui copie un fichier app.js et l'expose sur le port 3000.
Indice :
`dockerfileFROM node:20-alpine
WORKDIR /app
COPY app.js .
EXPOSE 3000
CMD ["node", "app.js"]
`Créez aussi
app.jsavecconsole.log("Hello from Docker!");.
Vérification : docker build . fonctionne en local (si Docker est installé).
Tâche 2 : Configurer Docker-in-Docker dans le pipeline
Dans .gitlab-ci.yml, créez un job build-image avec image: docker:26 et services: docker:26-dind. Ajoutez la variable DOCKER_TLS_CERTDIR: "/certs".
Indice :
`yamlbuild-image:
image: docker:26
services:
- docker:26-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
`
DOCKER_TLS_CERTDIRactive TLS entre le client Docker (votre job) et le daemon DinD (le service). C'est requis pour la sécurité sur les runners partagés GitLab.com.
Vérification : Le job démarre sans erreur de connexion au daemon Docker.
Tâche 3 : Vérifier que le daemon Docker est disponible
Avant de construire, ajoutez dans le script: du job une commande qui vérifie que Docker fonctionne correctement en affichant la version du client et du serveur.
Indice :
docker infoaffiche les informations détaillées du daemon.docker versionaffiche les versions client et serveur séparément.
Vérification : Les logs affichent la version du Docker Engine (serveur) depuis le service DinD.
Tâche 4 : Construire l'image avec un tag
Dans le script du job build-image, construisez l'image avec docker build en la taguant avec $CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA.
Indice :
`bashdocker build -t $CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA .
`Le
.à la fin indique le contexte de build (le répertoire courant). Le tag combine le nom du projet et le SHA court du commit.
Vérification : La commande docker build se termine avec "Successfully built" dans les logs.
Tâche 5 : Lister les images construites
Après le build, ajoutez docker images dans le script pour lister toutes les images disponibles dans l'environnement DinD.
Indice :
docker images(oudocker image ls) affiche le REPOSITORY, le TAG, l'IMAGE ID, la date de création et la taille. L'image que vous venez de construire doit apparaître avec votre tag.
Vérification : docker images liste l'image avec le nom $CI_PROJECT_NAME et le tag correspondant au SHA du commit.
🗂️ Mini-Projet : Image Docker construite dans CI
Checkpoints de validation :
- Le
Dockerfileest présent à la racine du dépôt DOCKER_TLS_CERTDIR: "/certs"est configuré dans le jobdocker versionaffiche les versions client ET serveur dans les logs- L'image est taguée
$CI_PROJECT_NAME:$CI_COMMIT_SHORT_SHA docker imagesliste l'image construite