Ce que cet atelier nous a appris
Aujourd'hui, nous avons mis en place une chaîne de déploiement continu complète :
du poste du développeur jusqu'au serveur de production, sans aucune intervention manuelle.
Chaque git push suffit à tout déclencher.
Image Docker
Un modèle figé contenant l'application et tout son environnement. Construit depuis le Dockerfile.
Conteneur Docker
Une instance en cours d'exécution de l'image. Isolé, léger, redémarre automatiquement avec --restart always.
Dockerfile
Le fichier de recette. FROM nginx:alpine, COPY, EXPOSE 80, CMD — quatre lignes suffisent.
Port mapping
Le conteneur est isolé. Le flag -p 8101:80 le rend accessible depuis l'extérieur.
Pipeline Jenkins
Le Jenkinsfile orchestre cinq stages qui s'enchaînent à chaque push.
📥
Checkout
Clone ou pull le dépôt
🗑️
Stop/Rm
Supprime l'ancien
✅
Verify
Vérifie les logs
Docker
Jenkins
nginx:alpine
CI/CD
Notre Dockerfile
Quatre lignes suffisent pour conteneuriser ce site :
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
daemon off; maintient Nginx en premier plan.
Sans cette option, le conteneur s'arrêterait immédiatement au démarrage.
Pourquoi Docker est incontournable en DevOps
Avant Docker, le problème classique était : « ça marche sur ma machine ».
Docker résout cela en empaquetant l'application avec tout son environnement.
Peu importe le serveur, le comportement est identique.
Reproductibilité
L'environnement d'exécution est identique du poste du développeur au serveur de production.
Isolation
Chaque application tourne dans son propre conteneur sans interférer avec les autres.
Rollback instantané
Les images Docker sont versionnées. Revenir à une version précédente prend quelques secondes.
Scalabilité
Lancer plusieurs instances d'un conteneur se fait en une seule commande. Base de Kubernetes.