CI/CD avec Docker
Automatiser le déploiement d'applications avec des conteneurs
Il est recommandé de consulter la documentation officielle de Docker et celle de GitHub Actions pour des informations à jour.
Notions théoriques
Le CI/CD (Intégration Continue / Déploiement Continu) est un ensemble de pratiques visant à automatiser les étapes de développement, de test et de déploiement d'une application.
Docker permet de faciliter cette automatisation grâce à la conteneurisation des applications.
Intégration continue (CI)
L'intégration continue consiste à tester automatiquement le code à chaque modification. L'objectif est de détecter rapidement les erreurs et de garantir que l'application reste fonctionnelle au fil des versions.
Les étapes typiques de la CI sont :
- Récupérer le code depuis un dépôt (par exemple sur GitHub)
- Installer les dépendances
- Lancer les tests automatiques
- Construire une image Docker
Déploiement continu (CD)
Le déploiement continu consiste à livrer automatiquement une nouvelle version de l'application après validation. Cela peut inclure :
- Pousser l'image Docker sur un registre (Docker Hub, GitHub Container Registry…)
- Déployer l'image sur un serveur de production ou de test
Pourquoi utiliser Docker dans un pipeline CI/CD
Docker permet de :
- Garantir que l’environnement d’exécution est identique en local, en test et en production
- Automatiser la construction et le déploiement des applications
- Réduire les erreurs liées aux différences de configuration
Outils courants
- GitHub Actions : permet de définir des workflows d’automatisation directement dans un dépôt GitHub
- Docker Hub : registre d’images Docker
- GitLab CI/CD : alternative à GitHub Actions, intégrée à GitLab
- Travis CI, CircleCI, Jenkins : autres outils CI/CD
Fichier de configuration .github/workflows/
Un workflow GitHub Actions est défini dans un fichier YAML. Il contient :
- Des déclencheurs (
on: push
,on: pull_request
, etc.) - Des jobs (unités d'exécution)
- Des steps (étapes à exécuter dans chaque job)
Exemple de structure :
name: CI
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build Docker image
run: docker build -t mon-image .
Bonnes pratiques
- Versionner les images Docker (éviter le tag
latest
) - Utiliser des secrets pour les identifiants (Docker Hub, SSH, etc.)
- Scanner les images Docker pour détecter les vulnérabilités
- Nettoyer les ressources inutiles après le build
- Utiliser des images légères (ex :
python:3.11-slim
)
Exemple pratique
Il est possible de configurer un pipeline CI/CD avec GitHub Actions pour construire une image Docker à chaque push sur la branche main
, puis la publier sur Docker Hub.
Étapes
- Créer un projet contenant un fichier
app.py
:
print("Application CI/CD avec Docker")
- Créer un
Dockerfile
:
FROM python:3.11-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]
- Créer un fichier
.github/workflows/docker.yml
:
name: Build and Push Docker Image
on:
push:
branches:
- main
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Login to Docker Hub
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
- name: Build image
run: docker build -t mon-utilisateur/mon-image:latest .
- name: Push image
run: docker push mon-utilisateur/mon-image:latest
-
Ajouter les secrets
DOCKER_USERNAME
etDOCKER_PASSWORD
dans les paramètres du dépôt GitHub -
Pousser le projet sur GitHub
À chaque git push
sur main
, GitHub Actions construit et publie l’image sur Docker Hub.