Table des matières
Docker
Date de création : 2025/11/23 00:06
MODULE 1 — INTRODUCTION À DOCKER
1.0 Présentation générale
Docker est une plateforme de virtualisation légère basée sur les conteneurs. Son objectif principal est de permettre d'embarquer une application, ses dépendances, sa configuration et son environnement dans un paquet isolé, reproductible et portable : le conteneur.
Docker résout les problèmes majeurs rencontrés dans les environnements de développement et de production :
- « Chez moi ça marche, chez toi non »
- Conflits de versions entre bibliothèques
- Déploiements manuels longs et risqués
- Différences entre serveurs (OS, configurations, dépendances)
Docker garantit que le même code fonctionne exactement de la même manière partout.
1.1 Historique rapide
- 2013 : Docker, Inc. publie la première version open-source.
- Docker popularise l’usage des namespaces et cgroups du noyau Linux.
- 2014–2020 : adoption massive et industrialisation DevOps.
- Aujourd’hui : Docker est le standard mondial de la conteneurisation.
1.2 Concepts clés à connaître
IMAGE
Un modèle immuable contenant l’environnement complet nécessaire à une application.
CONTENEUR
Une instance vivante d’une image, équivalente à un processus isolé.
DOCKER ENGINE
Le moteur responsable des images, conteneurs, réseaux et volumes.
REGISTRY
Dépôt d’images (Docker Hub, GitHub Container Registry…).
1.3 Pourquoi Docker ?
- Portabilité totale
- Performances élevées
- Isolation forte
- Standardisation
- Déploiement rapide
- Scalabilité microservices
- Réduction des coûts
1.4 Différences Docker vs Machine Virtuelle
| Caractéristique | Docker | VM |
|---|---|---|
| Démarrage | <1 sec | 30 sec à plusieurs minutes |
| RAM | Faible | Élevée |
| Isolation | Processus | OS complet |
| Taille | Mo / centaines de Mo | Go |
| Performances | Natives | Réduites |
| Migration | Très simple | Complexe |
Schéma :
MACHINE VIRTUELLE CONTENEUR
+—————————+ +——————————–+
| Application | Application |
+—————————+ +——————————–+
| Bibliothèques de l'app | Bibliothèques de l'app |
+—————————+ +——————————–+
| OS COMPLET (Ubuntu…) | LIBRAIRIES SYSTÈME MINIMALES |
+—————————+ +——————————–+
| Hyperviseur (VMWare…) | Noyau de l'hôte partagé |
+—————————+ +——————————–+
| Matériel physique | Matériel physique |
+—————————+ +——————————–+
1.5 Installation Docker
macOS
brew install –cask docker
Linux
sudo apt update sudo apt install docker.io -y sudo systemctl enable –now docker
Windows
Installation via Docker Desktop Windows (WSL2 requis).
1.6 Vérification de l’installation
docker version docker run hello-world
1.7 Premier vrai conteneur : Nginx
1.8 Cycle de vie d’un conteneur
docker stop docker start docker rm docker logs docker exec
Schéma : docker run → création → exécution → arrêt → suppression
1.9 Exercices pratiques
Exercice 1
Tester installation avec hello-world.
Exercice 2
Lancer Nginx et afficher la page depuis navigateur.
Exercice 3
Explorer un conteneur via : docker exec -it <id> sh
1.10 Résumé du Module 1
- Docker = conteneurisation légère
- Un conteneur = une instance isolée
- Une image = un template immuable
- Avantages : portabilité, rapidité, simplicité
- Nginx permet un premier test concret
MODULE 2 — ARCHITECTURE DOCKER (VERSION ULTRA COMPLÈTE)
2.0 Objectif du module
Comprendre en profondeur le fonctionnement interne de Docker :
- Docker CLI
- Docker Daemon (dockerd)
- Images & layers
- Conteneurs & file systems copy-on-write
- Cgroups & Namespaces
- Storage drivers (overlay2…)
- Registries
- Interaction complète entre les composants
Ce module développe chaque concept avec des schémas, explications détaillées et exercices pratiques.
2.1 Vue d'ensemble de l’architecture
Schéma conceptuel : ``` [ Docker CLI ] → (API HTTP) → [ Docker Daemon ]
↓
[ Images / Layers ]
↓
[ Containers ]
↓
[ Registries ]
```
Docker est construit autour d’une architecture client/serveur.
Docker CLI
L’outil en ligne de commande utilisé par l’utilisateur :
- docker run
- docker build
- docker ps
- docker logs
- docker network …
Il ne fait que transmettre des commandes au daemon via une API REST.
Docker Daemon (dockerd)
Le cœur de Docker. Il gère :
- création et exécution de conteneurs
- téléchargement et construction d’images
- gestion des réseaux
- volumes
- sécurité
- stockage
Tout passe par le daemon.
2.2 Les images Docker
Une image est un ensemble de couches immuables (layers). Chaque instruction Dockerfile produit une nouvelle couche.
Structure : ``` Layer 5 — CMD / ENTRYPOINT Layer 4 — Code source Layer 3 — Dépendances Layer 2 — Paquets système supplémentaires Layer 1 — Base OS (alpine, debian, python:slim…) ```
Caractéristiques clés
- immuable
- versionnable
- portable
- optimisée via un cache
Commande pour voir les layers : ``` docker history nginx ```
2.3 Le système de fichiers Copy-On-Write
Docker utilise un mécanisme CoW (copy-on-write).
Schéma : ``` IMAGE (read-only)
▲ layers immuables |
CONTAINER (read-write) ```
Lorsqu’un fichier est modifié dans le conteneur :
1. Docker copie le fichier dans la couche RW du conteneur. 2. La modification s'applique uniquement au conteneur.
Cela rend les conteneurs légers et rapides.
2.4 Les conteneurs
Un conteneur est :
- une instance d’une image
- un processus isolé
- un système de fichiers minimal
- un ensemble d’espaces d’exécution indépendants
Cycle de vie : ``` docker create docker start docker stop docker restart docker kill docker rm ```
Commande pour inspecter un conteneur : ``` docker inspect mon_container ```
2.5 Namespaces Linux
Les namespaces fournissent l’isolation au niveau du noyau. Chaque conteneur a son propre ensemble de namespaces.
Types de namespaces
- PID — processus
- NET — réseau
- MNT — systèmes de fichiers
- IPC — communications inter-processus
- UTS — hostname
- USER — utilisateurs
- CGROUP — ressources
Schéma : ``` [ Host OS ] ├─ Namespace A → Container 1 ├─ Namespace B → Container 2 └─ Namespace C → Container 3 ```
2.6 Cgroups (control groups)
Les cgroups limitent les ressources :
- CPU
- RAM
- I/O disque
- Réseau
Exemples : ``` docker run –memory=“512m” nginx docker run –cpus=“1.5” nginx ```
On peut donc isoler les ressources de chaque conteneur.
2.7 Storage drivers
Les drivers gèrent le système de fichiers interne des conteneurs.
Principaux drivers
- overlay2 (recommandé)
- aufs (ancien)
- btrfs
- zfs
Vérification du driver utilisé
``` docker info | grep Storage ```
Sous Linux (Ubuntu), Docker utilise overlay2.
2.8 Registries
Les registres stockent les images Docker.
Types
- Docker Hub (public)
- GitHub Container Registry
- GitLab Registry
- Azure Container Registry
- Registres privés auto-hébergés
Commandes
``` docker pull nginx docker push johnben/monimage:1.0 docker login ```
2.9 Interaction CLI ↔ Daemon ↔ Conteneur
``` docker run nginx
↓
Docker CLI → API HTTP UNIX socket → Docker Daemon
↓
Daemon vérifie si l’image existe
↓
Image présente ? sinon → téléchargement
↓
Création du conteneur (RW layer)
↓
Lancement du processus principal (ENTRYPOINT/CMD) ```
2.10 Les logs du daemon
Sous Linux : ``` journalctl -u docker ```
Sous macOS : Docker Desktop → menu → Troubleshoot → logs
2.11 Exercices pratiques
Exercice 1 — Explorer une image
1. Télécharger nginx : ``` docker pull nginx ``` 2. Inspecter ses layers : ``` docker history nginx ``` 3. Inspecter l’image : ``` docker inspect nginx ```
Exercice 2 — Comprendre un conteneur
1. Lancer nginx : ``` docker run -d –name test-nginx nginx ``` 2. Inspecter le conteneur : ``` docker inspect test-nginx ``` 3. Analyser :
- GraphDriver (overlay2)
- NetworkSettings
- HostConfig (cgroups)
Exercice 3 — Observer les namespaces
Depuis le conteneur : ``` docker exec -it test-nginx sh ``` Tester : ``` ps aux hostname ```
2.12 Résumé du module 2
- Docker CLI = interface utilisateur
- Docker Daemon = moteur principal
- Images = layers immuables
- Conteneurs = instances isolées
- Namespaces = isolation
- Cgroups = contrôle des ressources
- Overlay2 = système de fichiers CoW moderne
- Registries = stockage des images
- docker inspect = commande la plus puissante pour tout comprendre
MODULE 3 — IMAGES DOCKER & DOCKERFILE (VERSION ULTRA COMPLÈTE)
3.0 Objectif du module
Comprendre en profondeur :
- la structure interne d’une image Docker
- les layers et le mécanisme de cache
- les bonnes pratiques modernes d’écriture d’un Dockerfile
- l’optimisation (taille, sécurité, vitesse)
- les multi-stage builds
- les commandes avancées d’inspection d’image
- les erreurs courantes
- un atelier pratique complet
Ce module est fondamental pour produire des images professionnelles, propres et performantes.
3.1 Qu’est-ce qu’une image Docker ?
Une image est un ensemble immuable de couches (layers) représentant :
- un OS minimal
- des paquets système
- des outils nécessaires
- le code de votre application
- les configurations finales (CMD/ENTRYPOINT)
Schéma structurel : ``` Layer 6 — CMD / ENTRYPOINT Layer 5 — Application Layer 4 — Dépendances applicatives Layer 3 — Dépendances système Layer 2 — Config système Layer 1 — OS minimal (alpine, debian-slim…) ```
Les images sont read-only, les conteneurs ajoutent une couche RW.
3.2 Les Layers (couches)
Chaque instruction Dockerfile crée une couche :
- FROM = nouvelle base
- RUN = nouvelle couche
- COPY = nouvelle couche
- ADD = nouvelle couche
- ENV = met à jour les métadonnées
- CMD/ENTRYPOINT = pas une couche de fichiers, mais une couche de configuration
Commande : ``` docker history <image> ```
Analyse typique : ``` IMAGE CREATED BY SIZE <id> CMD [“npm” “start”] 0B <id> COPY . . 34kB <id> RUN npm ci 55MB <id> COPY package*.json . 1kB <id> FROM node:20-alpine 7MB ```
3.3 Le cache Docker
Docker optimise fortement le build avec un cache basé sur les layers.
Principe
Si une instruction ne change pas, Docker réutilise le layer précédent → gain massif de temps.
Exemple : ``` COPY package*.json ./ RUN npm install COPY . . ``` → modifier seulement les fichiers sources n’invalide pas npm install.
Bonnes pratiques cache
- mettre COPY package.json AVANT COPY .
- grouper les RUN quand ils sont liés
- éviter ADD (inefficace)
- ne jamais copier tout le répertoire avant installation des dépendances
3.4 Le Dockerfile : syntaxe complète et moderne
Structure générale recommandée 2025 : ``` FROM … WORKDIR … COPY … … RUN … COPY … … EXPOSE … USER … ENTRYPOINT … CMD … ```
3.5 Analyse détaillée de chaque instruction
FROM
Définit l’image de base. Exemples : ``` FROM node:20-alpine FROM python:3.12-slim FROM ubuntu:22.04 ```
Meilleures pratiques :
- toujours utiliser une base slim ou alpine
- éviter ubuntu/debian pour les petits services
- versionner TOUTES les images (pas de latest)
WORKDIR
Définit le répertoire de travail. ``` WORKDIR /app ```
Avantages :
- évite les chemins relatifs
- plus propre et lisible
COPY
Copie des fichiers dans l’image. ``` COPY . . COPY src/ /app/src/ COPY package*.json ./ ```
Points importants :
- l’ordre des COPY influence le cache
- COPY est plus sûr que ADD
RUN
Exécute des commandes lors du build. ``` RUN apt update && apt install -y curl ```
Bonnes pratiques :
- utiliser && pour réduire le nombre de layers
- nettoyer les caches apt
- ne pas mettre plusieurs RUN inutiles
ENV
Définit une variable d’environnement dans l’image. ``` ENV NODE_ENV=production ```
ENTRYPOINT vs CMD
CMD
Commande utilisée par défaut si aucune autre n’est fournie. ``` CMD [“npm”, “start”] ```
ENTRYPOINT
Commande forcée, non écrasable. ``` ENTRYPOINT [“python”] CMD [“app.py”] ```
Exécution : → python app.py
3.6 Multi-Stage Builds (professionnel)
Objectif :
- réduire drastiquement la taille de l’image finale
- éliminer les dépendances nécessaires uniquement au build
Exemple Node.js : ``` FROM node:20-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci –only=production COPY . .
FROM node:20-alpine AS runtime WORKDIR /app COPY –from=build /app . CMD [“node”, “server.js”] ```
Avantages :
- sécurité accrue
- rapidité
- image finale très légère
3.7 Sécurité des images
Bonnes pratiques 2025 :
- ne jamais exécuter en root :
```
RUN adduser -D appuser USER appuser ``` * limiter les outils installés * scanner les images : ``` docker scan monimage ``` * utiliser des bases officielles minimalistes (alpine, slim, distroless)
3.8 Optimisation des images
Réduire la taille
- utiliser alpine (musl)
- utiliser slim (glibc)
- multi-stage
- nettoyer les caches :
```
RUN rm -rf /var/lib/apt/lists/* ```
Optimiser le build
- structurer le Dockerfile autour du cache
- éviter COPY . trop tôt
3.9 Inspection avancée d’une image
Inspecter métadonnées
``` docker inspect monimage ```
Voir les layers
``` docker history monimage ```
Explorer le contenu
``` docker run –rm -it monimage sh ```
3.10 Erreurs courantes
- oublier .dockerignore → image énorme
- mettre COPY . . avant COPY package.json
- utiliser latest → builds non reproductibles
- RUN multiple non optimisés
- permissions root dangereuses
- images trop grosses → déploiements lents
Exemple de .dockerignore recommandé : ``` node_modules .git .gitignore Dockerfile docker-compose.yml dist .env ```
3.11 Atelier pratique : construire une vraie image
Étapes :
1. Créer un répertoire
``` mkdir docker-app cd docker-app ```
2. Ajouter un fichier app.py
``` print(“Hello Johnny, Docker fonctionne en version ultra !”) ```
3. Créer un Dockerfile
``` FROM python:3.12-slim WORKDIR /app COPY . . CMD [“python”, “app.py”] ```
4. Builder l’image
``` docker build -t monpython:1.0 . ```
5. Lancer l’image
``` docker run monpython:1.0 ```
Résultat attendu
Hello Johnny, Docker fonctionne en version ultra !
3.12 Résumé du module
- Les images sont immuables et organisées en layers
- Le cache Docker améliore massivement la vitesse de build
- Le Dockerfile est le cœur de la création d’images
- Multi-stage builds = standard moderne 2025
- Optimisation = sécurité + rapidité + légèreté
- docker history / docker inspect = outils essentiels
- .dockerignore impératif
Le module 3 est crucial pour produire des images propres, rapides, petites et adaptées à la production.
MODULE 4 — LES CONTENEURS DOCKER (VERSION ULTRA COMPLÈTE)
4.0 Objectif du module
Ce module couvre en profondeur :
- le cycle de vie complet d’un conteneur
- les commandes essentielles et avancées
- la gestion des processus internes
- l’inspection, le debugging et le monitoring
- la gestion des logs
- la connexion interactive (shell)
- le mapping des ports et des systèmes de fichiers
- les redémarrages et les politiques de restart
- les erreurs courantes
- les exercices pratiques professionnels
4.1 Qu’est-ce qu’un conteneur ?
Un conteneur est une instance vivante d’une image Docker. Il représente :
- un processus isolé
- possédant son propre système de fichiers (layer RW)
- son propre espace réseau (namespace)
- ses propres ressources (cgroups)
- ses propres variables d’environnement
Schéma : ``` IMAGE (read-only layers)
│
▼
CONTAINER (read-write layer)
│
▼
Processus principal (ENTRYPOINT/CMD) ```
Un conteneur vit tant que SON PROCESSUS PRINCIPAL est en vie.
4.2 Cycle de vie complet d’un conteneur
``` docker create → crée un conteneur (pas lancé) docker start → démarre un conteneur arrêté docker run → create + start docker stop → arrêt propre (SIGTERM → SIGKILL) docker kill → arrêt brutal (SIGKILL immédiat) docker restart → stop + start docker pause → suspend les processus docker unpause → reprise docker rm → supprime un conteneur docker rm -f → supprime même s’il tourne ```
Commandes de base : ``` docker run nginx docker stop nginx docker rm nginx ```
4.3 Les états possibles d’un conteneur
Les états visibles via : ``` docker ps -a ```
États courants :
- Up : en cours d’exécution
- Exited (0) : terminé normalement
- Exited (1) : erreur
- Created : créé mais pas démarré
- Paused : suspendu
- Restarting : en boucle de redémarrage
4.4 Lancement d’un conteneur : options indispensables
Détaché (-d)
``` docker run -d nginx ```
Nom personnalisé (--name)
``` docker run –name web nginx ```
Ports (-p)
Mapping : ``` -p HOST:CONTAINER ```
Exemple : ``` docker run -d -p 8080:80 nginx ``` → http://localhost:8080
Variables d’environnement (-e)
``` docker run -e APP_ENV=prod monapp ```
Mode interactif (-it)
``` docker run -it ubuntu bash ```
Volume (-v)
``` docker run -v /host/data:/container/data nginx ```
4.5 Les politiques de redémarrage
Docker peut redémarrer automatiquement un conteneur.
``` –restart=no (par défaut) –restart=on-failure (si process error) –restart=always (toujours) –restart=unless-stopped ```
Exemple : ``` docker run –restart=always myservice ```
Très utilisé en production hors orchestrateur.
4.6 Inspecter un conteneur
Métadonnées complètes
``` docker inspect moncontainer ```
Parties importantes :
- HostConfig → cgroups, volumes, ports
- NetworkSettings → IP du conteneur
- GraphDriver → overlay2
- Config.Env → variables
Obtenir uniquement l’IP
``` docker inspect -f 'networksettings.ipaddress' moncontainer ```
4.7 Voir les logs
``` docker logs moncontainer docker logs -f moncontainer ```
Options utiles :
- -f → suivre en temps réel
- –tail 100 → n'affiche que 100 lignes
4.8 Exécuter une commande dans un conteneur
Shell interactif
``` docker exec -it moncontainer bash ``` ou si bash n’existe pas : ``` docker exec -it moncontainer sh ```
Exécuter une commande simple
``` docker exec moncontainer ls -la ```
4.9 Processus internes d’un conteneur
Chaque conteneur n’a qu’un seul processus principal.
Vérifier : ``` docker top moncontainer ```
Dans un OS classique : ``` ps aux ```
4.10 Stopping : comment Docker arrête un conteneur
docker stop envoie :
1. SIGTERM (arrêt propre) 2. après 10 secondes → SIGKILL (forcé)
Changer le délai : ``` docker stop –time=3 moncontainer ```
4.11 Mapping des ports
Schéma : ``` HOST : 8080 → CONTAINER : 80 ```
Commande : ``` docker run -p 8080:80 nginx ```
Lister les ports : ``` docker port moncontainer ```
4.12 Gestion des fichiers dans un conteneur
Le conteneur a son propre système : ``` docker exec -it moncontainer sh ls -la ```
Pour copier un fichier : ``` docker cp fichier.txt moncontainer:/tmp/ docker cp moncontainer:/etc/nginx/nginx.conf . ```
4.13 Nettoyage des conteneurs
``` docker rm id docker rm -f id docker container prune docker system prune ```
4.14 Erreurs courantes
- container keeps restarting
→ mauvais CMD / erreur au démarrage
``` docker logs ```
- ports already in use
→ le port hôte est occupé
- cannot exec: container not running
→ conteneur arrêté, vérifier avec docker ps -a
- permission denied
→ volumes ou fichiers hôte non accessibles
4.15 Atelier pratique complet
1. Lancer un conteneur Nginx
``` docker run -d -p 8080:80 –name demo-nginx nginx ```
2. Explorer le conteneur
``` docker exec -it demo-nginx sh ```
3. Voir les logs
``` docker logs -f demo-nginx ```
4. Copier un fichier de configuration
``` docker cp demo-nginx:/etc/nginx/nginx.conf . ```
5. Redémarrer
``` docker restart demo-nginx ```
6. Supprimer
``` docker rm -f demo-nginx ```
4.16 Résumé du module 4
- Un conteneur est une instance isolée et vivante d’une image
- Commande clé : docker run (create + start)
- docker exec permet d’entrer dans un conteneur
- docker logs pour diagnostiquer
- Les ports, volumes et variables sont essentiels
- docker inspect révèle tout le fonctionnement interne
- Les restart policies sont fondamentales pour la production
- Les erreurs courantes sont faciles à corriger avec les bonnes commandes
Ce module donne toutes les bases nécessaires pour maîtriser les conteneurs de manière professionnelle.
MODULE 5 — VOLUMES & PERSISTANCE DOCKER (VERSION ULTRA COMPLÈTE)
5.0 Objectif du module
Ce module ultra complet couvre :
- la persistance des données dans Docker
- les différents types de volumes
- les bind mounts vs volumes Docker
- le fonctionnement interne du stockage
- la gestion des permissions
- les bonnes pratiques 2025
- les commandes avancées : inspect, prune, backup
- un atelier complet avec exercices + CORRIGÉS
Ce module est essentiel pour les bases de données, les CMS (WordPress), les APIs persistant des données, etc.
5.1 Pourquoi la persistance est indispensable ?
Par défaut, un conteneur Docker :
- possède son propre système de fichiers isolé
- qu’il PERD entièrement si le conteneur est supprimé
Donc sans volume :
- une base MySQL perd tout
- un WordPress perd ses uploads
- une API perd ses fichiers
Il faut donc des volumes persistants.
5.2 Les 3 types de stockage dans Docker
| Type | Description | Persistance | Usage recommandé |
|---|---|---|---|
| Anonymous volumes | créés automatiquement | Oui | cas rares |
| Named volumes | gérés par Docker | Oui | base de données |
| Bind mounts | mapping d’un dossier hôte | Oui | développement local |
5.3 Les volumes nommés (Named Volumes)
Création : ``` docker volume create data-mysql ```
Utilisation : ``` docker run -d -v data-mysql:/var/lib/mysql mysql:8 ```
Lister : ``` docker volume ls ```
Inspecter : ``` docker volume inspect data-mysql ```
Avantages :
- totalement géré par Docker
- portable
- indépendant de l'hôte
- parfait pour MySQL, PostgreSQL, MongoDB, Redis
5.4 Bind Mounts
Syntaxe : ``` -v /chemin/hote:/chemin/conteneur ```
Exemple : ``` docker run -d -v /home/johnny/site:/var/www/html php:8.2-apache ```
Avantages :
- idéal en développement
- permet d’éditer les fichiers en temps réel
Inconvénients :
- dépend du système hôte
- moins portable
5.5 Où Docker stocke les volumes ?
Sous Linux : ``` /var/lib/docker/volumes/ ```
Sous macOS et Windows (Docker Desktop) : Stockés dans un disque virtuel interne.
5.6 Inspecter le contenu d’un volume
Depuis un conteneur temporaire : ``` docker run –rm -it -v data-mysql:/data alpine sh ```
Puis dans le conteneur : ``` ls -la /data ```
5.7 Permissions et utilisateurs
Dans un volume, les permissions dépendent du conteneur, pas de l’hôte (sauf bind mount).
Corriger une permission avec alpine : ``` docker run –rm -v data:/data alpine chown -R 1000:1000 /data ```
5.8 Sauvegarde d’un volume
Création d’une archive : ``` docker run –rm -v data-mysql:/source -v /backup:/backup alpine tar czvf /backup/mysql.tar.gz /source ```
Restauration : ``` docker run –rm -v data-mysql:/dest -v /backup:/backup alpine tar xzvf /backup/mysql.tar.gz -C /dest –strip 1 ```
5.9 Suppression des volumes
Supprimer un volume spécifique : ``` docker volume rm data-mysql ```
Supprimer les volumes inutilisés : ``` docker volume prune ```
5.10 Bonnes pratiques 2025
- toujours nommer ses volumes
- utiliser bind mounts uniquement en dev
- ne jamais stocker des données dans le conteneur
- éviter les chemins relatifs
- pour bases SQL → toujours volume dédié
- versionner le dossier backup, pas le volume
5.11 Atelier pratique complet (avec CORRIGÉS)
EXERCICE 1 : Persister MySQL
Objectif :
- lancer MySQL
- vérifier la persistance
- supprimer le conteneur
- vérifier que les données existent encore
Commandes à exécuter : ``` docker volume create mysql-data docker run -d –name mydb -e MYSQL_ROOT_PASSWORD=1234 -v mysql-data:/var/lib/mysql mysql:8 ```
Ajouter une table : ``` docker exec -it mydb mysql -u root -p1234 -e “CREATE DATABASE test;” docker exec -it mydb mysql -u root -p1234 -e “USE test; CREATE TABLE demo(id INT);” ```
Supprimer le conteneur : ``` docker rm -f mydb ```
CORRIGÉ
Vérification : ``` docker run –rm -it -v mysql-data:/data alpine ls -la /data ``` → les fichiers .ibd et .frm sont présents → la base est bien persistée
EXERCICE 2 : Comprendre bind vs volume
Création bind mount : ``` mkdir ~/monapp echo “hello” > ~/monapp/test.txt
docker run –rm -it -v ~/monapp:/data alpine sh ```
Dans alpine : ``` cat /data/test.txt ```
MODIFIER depuis le conteneur : ``` echo “modifié” > /data/test.txt ```
Quitter, puis vérifier côté hôte : ``` cat ~/monapp/test.txt ```
CORRIGÉ
→ Le fichier local a été modifié → preuve que bind mount = partage natif
EXERCICE 3 : Sauvegarder un volume
Créer un volume : ``` docker volume create testdata ```
Ajouter des fichiers : ``` docker run –rm -v testdata:/data alpine sh -c “echo 'Johnny' > /data/name.txt” ```
Sauver : ``` mkdir ~/backup docker run –rm -v testdata:/source -v ~/backup:/backup alpine tar czvf /backup/archive.tar.gz /source ```
CORRIGÉ
Fichier créé : ``` ls -la ~/backup/archive.tar.gz ``` → archive présente → backup réussi
5.12 Résumé du module 5
- Docker perd les données sans volume
- Volumes nommés = standard pour la production
- Bind mounts = parfaits pour le développement
- Les volumes sont indépendants du cycle de vie des conteneurs
- docker inspect permet de comprendre la structure
- Savoir faire un backup / restore est indispensable
- Ce module est clé pour tout service nécessitant des données (SQL, NoSQL, uploads, logs)
MODULE 6 — RÉSEAU DOCKER (VERSION ULTRA COMPLÈTE)
6.0 Objectif du module
Ce module ultra complet couvre :
- le fonctionnement réseau interne de Docker
- les types de réseaux Docker (bridge, host, none)
- les réseaux personnalisés
- la résolution DNS interne entre conteneurs
- l’isolation réseau et les namespaces
- les ports, NAT et iptables
- les drivers réseau avancés (overlay, macvlan)
- Docker Compose et les réseaux
- les outils de diagnostic réseau
- les exercices pratiques AVEC réponses
Ce module est essentiel pour comprendre comment les conteneurs communiquent.
6.1 Introduction au réseau Docker
Lorsqu’un conteneur Docker est lancé, Docker lui attribue :
- une interface réseau virtuelle
- une adresse IP interne
- un namespace réseau isolé
- un accès éventuel au réseau hôte selon configuration
Schéma général : ``` [Host Network]
│
[Docker Engine]
│
[Bridge Network] — Conteneurs isolés + IP internes ```
Chaque conteneur vit dans un namespace réseau isolé.
6.2 Les drivers réseau disponibles
| Type | Description | Usage |
|---|---|---|
| bridge | par défaut, réseau isolé en NAT | usage général |
| host | partage le réseau du host | performance, accès direct |
| none | aucun réseau | sécurité maximale |
| overlay | réseau multi-hôte, Swarm/K8s | clusters |
| macvlan | donne une adresse MAC réelle | intégration LAN |
| ipvlan | similaire macvlan mais plus simple | datacenters |
6.3 Le réseau Bridge (par défaut)
Le réseau *bridge* est créé automatiquement : ``` docker network ls ```
On y voit : ``` bridge host none ```
IP par défaut : ``` 172.17.0.0/16 ```
Lorsqu’un conteneur démarre : ``` docker run -d nginx ```
Il reçoit une IP locale : ``` 172.17.0.2 ```
6.4 NAT, iptables et mapping de ports
Le mapping : ``` -p 8080:80 ```
Signifie : ``` HÔTE port 8080 → CONTENEUR port 80 ```
Docker configure automatiquement :
- NAT (iptables MASQUERADE)
- Forward de ports
- Routage interne
6.5 Inspecter le réseau
Inspecter un réseau
``` docker network inspect bridge ```
Inspecter un conteneur
``` docker inspect moncontainer ```
Sections importantes :
- IPAddress
- Networks
- MacAddress
- Gateway
6.6 Réseaux personnalisés
Créer : ``` docker network create monreseau ```
Lancer deux conteneurs : ``` docker run -d –name web –network monreseau nginx docker run -d –name api –network monreseau alpine sleep 9999 ```
Tester la communication : ``` docker exec -it api ping web ```
Résultat attendu : ``` PING web (172.x.x.x): 56 data bytes ```
Docker crée automatiquement un DNS interne.
6.7 Aliases DNS
Créer un alias : ``` docker run -d –network monreseau –network-alias backend nginx ```
Tester : ``` docker exec -it api ping backend ```
6.8 Le réseau Host
``` docker run –network host nginx ```
Le conteneur :
- partage l’interface réseau du host
- n’a pas de NAT
- expose directement ses ports
Avantage → perf maximale Inconvénient → aucune isolation
6.9 Le réseau None
``` docker run –network none alpine ```
Résultat :
- aucun accès réseau
- seulement `lo`
Idéal pour :
- batch sécurisés
- environnements isolés
6.10 Macvlan
Macvlan permet d’attribuer une vraie adresse MAC.
Exemple de création : ``` docker network create -d macvlan –subnet=192.168.1.0/24 –gateway=192.168.1.1 -o parent=eth0 pubnet ```
Les conteneurs apparaissent comme des machines réelles sur le LAN.
6.11 Overlay
Utilisé pour Swarm ou Kubernetes.
Permet à des conteneurs :
- situés sur plusieurs serveurs physiques
- d’être sur un même réseau virtuel
6.12 Docker Compose
Exemple : ``` version: “3.9” services:
web:
image: nginx
networks:
- backend
api:
image: alpine
command: sleep 9999
networks:
- backend
networks:
backend: driver: bridge
```
Test DNS : ``` docker compose exec api ping web ```
6.13 Outils de diagnostic réseau
Tester DNS
``` docker exec -it conteneur nslookup web ```
Sniffer
``` docker run –rm -it –net=host nicolaka/netshoot ```
Netshoot contient :
- tcpdump
- dig
- nslookup
- ip route
- netstat
6.14 Exercices pratiques + CORRIGÉS
EXERCICE 1 : Trouver l’IP d’un conteneur
Commandes : ``` docker run -d –name test-nginx nginx docker inspect -f 'networksettings.ipaddress' test-nginx ```
RÉPONSE ATTENDUE : → Une IP interne `172.17.x.x`
EXERCICE 2 : Ping entre deux conteneurs
Création réseau : ``` docker network create reseau-test ```
Lancement conteneurs : ``` docker run -d –name c1 –network reseau-test alpine sleep 9999 docker run -d –name c2 –network reseau-test alpine sleep 9999 ```
Ping : ``` docker exec -it c1 ping -c 2 c2 ```
RÉPONSE ATTENDUE : → Ping OK grâce au DNS Docker
EXERCICE 3 : Conteneur sans réseau
``` docker run –network none alpine ip a ```
RÉPONSE ATTENDUE : → Seule interface disponible : `lo`
6.15 Résumé du module 6
- Docker utilise un réseau bridge NAT par défaut
- Chaque conteneur reçoit une IP interne
- Docker inclut un DNS interne très puissant
- Le mapping de ports passe par iptables NAT
- host = réseau partagé
- none = aucun réseau
- macvlan = conteneur visible sur LAN
- overlay = multi-nœuds
- docker network inspect = outil clé
Ce module permet de maîtriser tous les aspects réseau indispensables en production.
MODULE 7 — DOCKER COMPOSE (VERSION ULTRA COMPLÈTE)
7.0 Objectif du module
Ce module ultra complet couvre :
- le fonctionnement de Docker Compose
- la syntaxe complète du fichier docker-compose.yml
- les services, réseaux, volumes et dépendances
- la gestion du scaling (réplication de services)
- l'override, les profils, les variables d'environnement
- les commandes avancées
- un atelier complet avec exercices + réponses corrigées
- exemples professionnels utilisés en production
Docker Compose est l’outil indispensable pour gérer des environnements multi-conteneurs.
7.1 Qu’est-ce que Docker Compose ?
Docker Compose permet de :
- définir plusieurs services dans un fichier unique
- lancer toute une stack en une seule commande
- gérer réseaux, volumes, dépendances automatiquement
- simplifier les environnements de dev, test et staging
Commande principale : ``` docker compose up -d ```
7.2 Structure d’un fichier docker-compose.yml
Structure générale : ``` version: “3.9” services:
service1: ... service2: ...
networks:
...
volumes:
...
```
Les sections principales :
- services
- networks
- volumes
- configs (avancé)
- secrets (avancé)
7.3 Définir un service
Exemple : ``` services:
web:
image: nginx
ports:
- "8080:80"
```
Options courantes :
- image
- build
- ports
- environment
- volumes
- depends_on
- restart
- command
- networks
7.4 Build d’une image via Compose
``` services:
api:
build: .
ports:
- "3000:3000"
```
Compose exécutera automatiquement : ``` docker build . ```
7.5 Variables d’environnement
Dans le fichier
``` environment:
- APP_ENV=prod
- DB_HOST=mysql
```
Via .env
Fichier `.env` : ``` APP_ENV=prod PORT=8080 ```
Compose : ``` ports:
- “${PORT}:80”
```
7.6 Volumes dans Docker Compose
Exemple : ``` services:
db:
image: mysql
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
```
Permet la persistance automatique.
7.7 Réseaux dans Docker Compose
Définir un réseau : ``` networks:
backend: driver: bridge
```
Assigner un service : ``` services:
api:
image: myapi
networks:
- backend
```
Par défaut, Compose crée un réseau : ``` <dossier>_default ```
7.8 depends_on (ordre de démarrage)
``` services:
web:
depends_on:
- db
```
IMPORTANT : depends_on ne garantit PAS que db soit prêt, seulement qu'il démarre avant.
Pour vérifier la santé : ``` healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"] interval: 5s timeout: 3s retries: 5
```
7.9 Commande, entrypoint
``` services:
app: image: node command: ["npm", "start"]
```
Override ENTRYPOINT : ``` entrypoint: [“python3”] command: [“app.py”] ```
7.10 Restart policies
``` restart: always restart: on-failure restart: unless-stopped ```
7.11 Scaling (réplication)
``` docker compose up -d –scale web=3 ```
Limites :
- fonctionne uniquement si le service n’a pas de ports mappés fixes
Exemple correct : ``` ports:
- “80”
``` (= port dynamique)
7.12 Commandes essentielles
``` docker compose up -d docker compose down docker compose ps docker compose logs -f docker compose exec <service> <commande> docker compose restart docker compose up -d –build ```
7.13 Exemple complet : Nginx + PHP + MySQL
``` version: “3.9” services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- php
php:
image: php:8.2-fpm
volumes:
- ./app:/var/www/html
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
```
7.14 Exemple professionnel : API Node + Redis cache
``` version: “3.9” services:
api:
build: ./api
ports:
- "3000:3000"
depends_on:
- redis
redis:
image: redis:7
command: ["redis-server", "--appendonly", "yes"]
volumes:
- redisdata:/data
volumes:
redisdata:
```
7.15 Exercices pratiques AVEC corrigés
EXERCICE 1 : Lancer un Nginx avec Compose
docker-compose.yml : ``` version: “3.9” services:
web:
image: nginx
ports:
- "8080:80"
```
Commande : ``` docker compose up -d ```
RÉPONSE : http://localhost:8080 affiche Nginx.
EXERCICE 2 : Créer un réseau partagé
docker-compose.yml : ``` services:
c1: image: alpine command: sleep 9999
c2: image: alpine command: sleep 9999
```
Test : ``` docker compose exec c1 ping -c 2 c2 ```
RÉPONSE : Le ping fonctionne grâce au DNS interne Docker.
EXERCICE 3 : Ajouter une base MySQL persistante
docker-compose.yml : ``` version: “3.9” services:
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: 1234
volumes:
- mysqldata:/var/lib/mysql
volumes:
mysqldata:
```
Test : ``` docker compose exec db mysql -uroot -p1234 -e “CREATE DATABASE testdb;” docker compose down docker compose up -d docker compose exec db mysql -uroot -p1234 -e “SHOW DATABASES;” ```
RÉPONSE : La base testdb apparaît → la persistance fonctionne.
7.16 Résumé du module 7
- Docker Compose orchestre plusieurs services dans un seul fichier
- sections principales : services, volumes, networks
- depend_on aide à orchestrer le démarrage
- persistence gérée via volumes
- réseaux automatiques + DNS interne
- scaling possible avec –scale
- docker compose up / down / logs / exec sont les commandes essentielles
Ce module est indispensable pour déployer des stacks multi-services (WordPress, Laravel, Django, Node.js, Next.js…).
MODULE 8 — SÉCURITÉ DOCKER (VERSION ULTRA COMPLÈTE)
8.0 Objectif du module
Ce module ultra complet couvre :
- les risques liés aux conteneurs Docker
- les meilleures pratiques de sécurité 2025
- la configuration des utilisateurs non-root
- la signature et le scanning d’images
- les capabilities Linux
- seccomp, AppArmor & SELinux
- la gestion des secrets
- la sécurité réseau
- la sécurité des images et des registres
- exercises complets AVEC réponses
Ce module est essentiel pour un usage professionnel de Docker.
8.1 Pourquoi la sécurité est importante ?
Docker apporte une isolation, mais pas une sécurité absolue.
Risques courants :
- conteneur exécuté en root → très dangereux
- mauvaise isolation réseau
- images non fiables
- secrets stockés dans les fichiers
- volumes mal configurés
- ports exposés inutilement
Objectif : Protéger l’hôte, les conteneurs et les données.
8.2 Principe de base : NE PAS exécuter en root
Le conteneur tourne par défaut en root, ce qui permettrait :
- d'écrire partout dans les volumes
- d’accéder à des fichiers sensibles
- d’échapper potentiellement au conteneur
Solution recommandée : Créer un utilisateur interne.
Exemple dans Dockerfile : ``` RUN adduser -D appuser USER appuser ```
Pour vérifier : ``` docker exec -it monapp id ```
8.3 Capabilities Linux
Docker retire la majorité des capabilities, mais certaines restent.
Lister les capabilities disponibles : ``` docker run –rm alpine capsh –print ```
Désactiver TOUTES les capabilities : ``` docker run –cap-drop=ALL myapp ```
N’en autoriser qu’une : ``` docker run –cap-drop=ALL –cap-add=NET_ADMIN myapp ```
8.4 Seccomp
Seccomp = sandbox de syscalls Linux.
Voir le profil par défaut : ``` /usr/share/docker/seccomp.json ```
Exécuter un conteneur sans seccomp : ``` docker run –security-opt seccomp=unconfined myapp ``` → DÉCONSEILLÉ en production.
8.5 AppArmor / SELinux
AppArmor (Ubuntu / Debian)
Voir profils : ``` aa-status ```
Activer un profil : ``` docker run –security-opt apparmor=monprofil myapp ```
SELinux (CentOS / RHEL)
Mode permissif : ``` setenforce 0 ```
Mode enforcing : ``` setenforce 1 ```
Label SELinux pour Docker : ``` docker run -v data:/data:Z myapp ```
8.6 Scanner la sécurité d’une image
Docker propose un scan natif : ``` docker scan monimage ```
Sortie :
- CVE détectées
- Niveau de sévérité
- Packages vulnérables
- Correctifs recommandés
Autre outil : Trivy ``` docker run aquasec/trivy image monimage ```
8.7 Signature des images (Docker Content Trust)
Activer la confiance : ``` export DOCKER_CONTENT_TRUST=1 ```
Signer une image : ``` docker trust sign monrepo/monimage:1.0 ```
Valider une signature : ``` docker trust inspect monrepo/monimage ```
8.8 Sécuriser les images Docker
Bonnes pratiques 2025 :
- utiliser images officielles (docker.io/library/)
- préférer alpine, slim ou distroless
- éviter latest
- limiter les packages installés
- utiliser multi-stage builds
- supprimer les outils sensibles :
```
RUN apk del curl git build-base ```
8.9 Sécuriser les conteneurs
Isoler les processus
``` docker run –pids-limit 100 myapp ```
Limiter mémoire
``` docker run –memory=512m myapp ```
Limiter CPU
``` docker run –cpus=“1.0” myapp ```
Lire-only filesystem
``` docker run –read-only myapp ```
Désactiver nouveau processus
``` docker run –security-opt no-new-privileges myapp ```
8.10 Sécurité réseau
—- Réduire la surface d'exposition —-
- éviter d'exposer tous les ports
- privilégier des réseaux internes
- utiliser un reverse proxy (Traefik, Nginx Proxy Manager)
—- Exemple : Nginx accessible seulement via backend —- ``` networks:
backend: public:
services:
nginx:
networks:
- public
- backend
api:
networks:
- backend
```
—- Firewall interne —- ``` docker run –cap-add NET_ADMIN alpine iptables -L ```
8.11 Gestion sécurisée des secrets
Ne jamais mettre les secrets dans :
- Dockerfile
- docker-compose.yml
- .env versionné
Docker Compose secrets
``` secrets:
db_pass: file: ./db_pass.txt
```
Usage
``` services:
db:
secrets:
- db_pass
```
Dans le conteneur : ``` /run/secrets/db_pass ```
8.12 Sécuriser les registres
Authentification : ``` docker login registry.example.com ```
Limiter le push : ``` docker push registry.example.com/secure/image:1.0 ```
Registry privé sécurisé :
- HTTPS obligatoire
- tokens d’accès
- scanning automatique CI/CD
8.13 Exercices pratiques AVEC corrigés
EXERCICE 1 : Lancer un conteneur non-root
Objectif : Créer un conteneur avec un utilisateur non-root.
Solution : ``` docker run -it –user 1000:1000 alpine id ```
RÉPONSE : Le conteneur affiche : ``` uid=1000 gid=1000 ```
EXERCICE 2 : Désactiver toutes les capabilities
Commandes : ``` docker run –cap-drop=ALL alpine sh -c “ping 8.8.8.8” ```
RÉSULTAT ATTENDU : ``` ping: socket: Operation not permitted ```
→ NORMAL : capability supprimée.
EXERCICE 3 : Scanner une image
``` docker scan nginx ```
RÉSULTAT ATTENDU : Liste de CVE + niveaux critique/haut/moyen.
EXERCICE 4 : Fichier système en mode read-only
``` docker run –read-only -it alpine touch /test ```
RÉPONSE ATTENDUE : ``` touch: /test: Read-only file system ```
8.14 Résumé du module 8
- Ne jamais exécuter en root
- Limiter les capabilities Linux
- Utiliser seccomp, AppArmor, SELinux
- Scanner les images (Docker Scan, Trivy)
- Utiliser des bases minimales (alpine, slim, distroless)
- Sécuriser l’accès réseau et les secrets
- Protéger les registres privés
- Limiter ressources CPU / RAM / PIDs
- Activer rootless si possible
- Réduire la surface d’attaque au strict minimum
Ce module est indispensable pour un déploiement professionnel sécurisé.
MODULE 9 — OUTILS & ENVIRONNEMENT DOCKER (VERSION ULTRA COMPLÈTE)
9.0 Objectif du module
Ce module ultra complet couvre :
- les outils essentiels pour gérer, surveiller et optimiser Docker
- les interfaces graphiques (Portainer, DockStation…)
- le monitoring réseau & système (Netshoot, cAdvisor…)
- les reverse-proxy modernes (Traefik, Nginx Proxy Manager)
- les outils de mise à jour (Watchtower)
- les environnements de développement optimisés
- les outils de build & analyse
- EXERCICES COMPLETS + réponses
C’est le module le plus pratique pour travailler comme un professionnel.
9.1 Portainer — L’interface graphique N°1
Portainer permet :
- de visualiser les conteneurs
- de voir logs, stats, CPU/RAM
- de gérer réseaux, volumes, stacks
- de déployer Docker Compose depuis UI
- de gérer un cluster Swarm
Installation : ``` docker volume create portainer_data docker run -d -p 9443:9443 –name portainer –restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce ```
Accès : ``` https://localhost:9443 ```
9.2 Nginx Proxy Manager (NPM) — Reverse Proxy Simple
Permet :
- HTTPS avec Let’s Encrypt en un clic
- gestion multi-sites
- redirections
- proxy vers conteneurs
Compose complet : ``` version: “3.9” services:
npm:
image: jc21/nginx-proxy-manager:latest
ports:
- "80:80"
- "81:81"
- "443:443"
volumes:
- npm-data:/data
- npm-letsencrypt:/etc/letsencrypt
volumes:
npm-data: npm-letsencrypt:
```
9.3 Traefik — Reverse Proxy Professionnel
Traefik permet :
- proxy dynamique
- SSL automatique
- dashboards
- labels Docker
- load balancing
Exemple service avec labels : ``` services:
api:
image: myapi
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.example.com`)"
```
9.4 Watchtower — Mise à jour automatique des conteneurs
``` docker run -d –name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower ```
Fonctions :
- vérifie les images mises à jour
- redéploie automatiquement
- idéal pour les serveurs auto-hébergés
9.5 Netshoot — Le couteau suisse du diagnostic réseau
``` docker run –rm -it nicolaka/netshoot ```
Inclut :
- curl
- dig
- tcpdump
- nslookup
- mtr
- netstat
- iperf
Ex : résolution DNS interne → ``` dig web ```
9.6 cAdvisor — Monitoring CPU / RAM / I/O
``` docker run -d -p 8080:8080 –name cadvisor –volume=/:/rootfs:ro –volume=/var/run:/var/run:ro –volume=/sys:/sys:ro –volume=/var/lib/docker/:/var/lib/docker:ro gcr.io/cadvisor/cadvisor ```
Interface : ``` http://localhost:8080 ```
9.7 DockStation — GUI moderne (alternative Portainer)
Fonctions :
- gestion projets multi-conteneurs
- interface visuelle intuitive
- logs en temps réel
- gestion Docker Compose
9.8 Dive — Analyse de la taille d’image
``` docker run –rm -it wagoodman/dive:latest <image> ```
Dive analyse :
- les layers
- la taille de chaque layer
- les fichiers dupliqués
- optimisation possible
9.9 LazyDocker — Interface Terminal Ultime
Installation : ``` curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash ```
Interface : ``` lazydocker ```
Fonctions :
- vue conteneurs
- vue logs CPU/RAM
- vue réseau
- gestion volumes
- restart/stop en temps réel
9.10 Buildx — Build avancé multi-architecture
``` docker buildx create –use docker buildx build –platform linux/arm64,linux/amd64 -t image:latest . ```
Pratique pour :
- Raspberry Pi
- clusters ARM
- images cross-platform
9.11 Stern — Logs multi-conteneurs
``` stern “api-*” ```
Similaire à : ``` docker compose logs -f ``` Mais avec filtrage avancé.
9.12 Atelier pratique — OUTILS DOCKER (avec réponses)
EXERCICE 1 : Installer Portainer
Commandes : ``` docker volume create portainer_data docker run -d -p 9443:9443 –name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce ```
RÉPONSE : Accès → https://localhost:9443
EXERCICE 2 : Tester Netshoot pour diagnostiquer DNS
Commandes : ``` docker run -d –name web nginx docker run -d –name api –network bridge alpine sleep 9999 docker exec -it api apk add bind-tools docker exec -it api dig web ```
RÉSULTAT ATTENDU : web.docker resolve vers → 172.17.x.x
EXERCICE 3 : Utiliser Dive pour analyser une image
Commande : ``` docker run –rm -it wagoodman/dive:latest nginx ```
RÉSULTAT ATTENDU :
- layers listés
- taille optimisée
- suggestions de réduction
EXERCICE 4 : Activer Watchtower et vérifier une mise à jour
Commande : ``` docker run -d –name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower –interval 30 ```
RÉPONSE ATTENDUE : Watchtower surveille les images toutes les 30 secondes.
9.13 Résumé du module 9
- Portainer = meilleure interface graphique
- Nginx Proxy Manager = HTTPS facile
- Traefik = reverse proxy moderne en production
- Watchtower = mise à jour automatique
- Netshoot = diagnostic réseau ultime
- cAdvisor = monitoring CPU/RAM/I/O
- Dive = analyse taille images
- LazyDocker = gestion terminal avancée
- Buildx = builds multi-architectures
Ce module fournit l’ensemble des outils nécessaires à une gestion pro et simplifiée de Docker.
MODULE 10 — DOCKER EN PRODUCTION (VERSION ULTRA COMPLÈTE)
10.0 Objectif du module
Ce module ultra complet couvre :
- les bonnes pratiques professionnelles pour déployer Docker en production
- l’optimisation des images, conteneurs et réseaux
- la supervision, la gestion des logs et des ressources
- les stratégies de mise à jour et de rollback
- la haute disponibilité (Swarm / K8s introduction)
- la CI/CD avec Docker
- la sécurité renforcée
- les patterns de déploiement modernes
- exercices complets + réponses corrigées
Ce module est la conclusion professionnelle de toute la formation.
10.1 Préparer Docker pour la production
Une stack Docker prête pour la production doit respecter :
- images légères (alpine/slim/distroless)
- utilisateurs non-root
- ressources limitées (CPU/RAM/PIDs)
- logs externes (ELK / Loki / Splunk)
- reverse proxy sécurisé (Traefik / NPM)
- monitoring complet (cAdvisor, Prometheus, Grafana)
- backups automatiques (volumes)
- stratégie de mises à jour maîtrisée
Le mot d’ordre : minimalisme + sécurité + observabilité.
10.2 Choix des images professionnelles
Images recommandées :
- alpine
- debian-slim
- python:slim
- node:alpine
- distroless
Éviter :
- latest
- ubuntu “full”
- images non officielles
Bonne pratique : ``` FROM node:20-alpine RUN adduser -D appuser USER appuser ```
10.3 Optimisation des conteneurs
Limiter CPU
``` docker run –cpus=“1.0” myapp ```
Limiter RAM
``` docker run –memory=“512m” myapp ```
Limiter PIDs
``` docker run –pids-limit=100 myapp ```
Système de fichier read-only
``` docker run –read-only myapp ```
10.4 Logs en production
Ne jamais stocker les logs DANS le conteneur.
Solutions recommandées :
- Loki (Grafana)
- ELK Stack
- Promtail
- Splunk
Logging driver : ``` docker run –log-driver json-file myapp ```
10.5 Monitoring complet
Outils essentiels :
- cAdvisor — CPU, RAM, IO
- Prometheus — métriques
- Grafana — dashboards
- Netshoot — diagnostic réseau
Exemple cAdvisor : ``` docker run -d -p 8080:8080 gcr.io/cadvisor/cadvisor ```
10.6 Reverse proxy professionnel
Traefik :
- SSL automatique
- autodiscovery Docker
- redirections
- load balancing
Exemple labels : ``` labels:
- “traefik.enable=true”
- “traefik.http.routers.web.rule=Host(`site.com`)”
- “traefik.http.routers.web.tls.certresolver=myresolver”
```
10.7 Stratégies de mises à jour
Rolling Update
Déployer progressif → réduire risques.
Blue/Green
2 versions en parallèle → switch instantané.
Canary
Un petit pourcentage du trafic teste la nouvelle version.
10.8 Gestion des backups
Toujours sauvegarder :
- volumes SQL
- configurations
- certificats SSL
- images privées
Backup modèle : ``` docker run –rm -v data:/source -v /backup:/backup alpine tar czvf /backup/data.tar.gz /source ```
10.9 CI/CD avec Docker
Pipeline GitHub Actions : ``` name: Deploy on: push jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: docker build -t myapp .
- run: docker login -u $USER -p $PASS
- run: docker push myapp
```
Pipeline complet :
- build
- tests
- scanning sécurité
- push registry
- déploiement automatique
10.10 Docker Swarm — haute disponibilité simple
``` docker swarm init docker service create –replicas 3 nginx ```
Fonctions :
- load balancing natif
- scaling automatique
- secrets sécurisés
- rollback intégré
10.11 Kubernetes — introduction
Kubernetes permet :
- orchestration avancée
- autoscaling
- stratégies de déploiement sophistiquées
- stockage dynamique
- observabilité complète
Idéal pour :
- les infrastructures complexes
- les microservices
- la haute disponibilité
10.12 Sécurité renforcée en production
Checklist :
- utilisateur non-root
- seccomp actif
- pas de capabilities inutiles
- no-new-privileges activé
- réseaux internes privés
- pas de secrets dans Dockerfile
Exemple : ``` docker run –security-opt no-new-privileges –cap-drop=ALL myapp ```
10.13 Architectures réseau professionnelles
Séparer les réseaux :
- public (reverse proxy)
- backend (API)
- database (privé)
Exemple Compose : ``` networks:
public: internal:
services:
web:
networks:
- public
- internal
db:
networks:
- internal
```
10.14 EXERCICES COMPLETS + RÉPONSES
EXERCICE 1 : Limiter un conteneur
Commande : ``` docker run –cpus=“0.5” –memory=“256m” nginx ``` RÉPONSE : Le conteneur ne peut utiliser que :
- 50% d’un CPU
- 256 Mo RAM
EXERCICE 2 : Scanner une image
``` docker scan nginx ``` RÉPONSE : La liste des CVE s’affiche → corrigées avant mise en prod.
EXERCICE 3 : Tester read-only
``` docker run –read-only -it alpine touch /test ``` RÉSULTAT ATTENDU : ``` touch: /test: Read-only file system ```
10.15 Résumé du module 10
- Production = sécurité, optimisation, monitoring, CI/CD
- Ne jamais exécuter en root
- Utiliser images optimisées
- Limiter ressources des conteneurs
- Utiliser reverse proxies professionnels
- Logging & monitoring externes obligatoires
- CI/CD avec scanning sécurité intégré
- Swarm & Kubernetes pour haute disponibilité
Ce module final clôture toute la formation en vous donnant les standards industriels actuels.
Cette page a pour source partielle ou intégrale la ou les page(s) suivante(s):
Page dans la catégorie:
