Comprendre Docker : conteneurs, images, écosystème et mise en pratique sous Windows
À la fin de ce cours, tu seras capable de :
| Savoir/Faire | Objectif |
|---|---|
| Reproduire | Installer Docker Desktop sous Windows et exécuter des commandes de base |
| Comprendre | Expliquer la différence entre un conteneur Docker et une machine virtuelle |
| Comprendre | Identifier les composants de l'écosystème Docker (image, conteneur, Hub, Compose) |
| Appliquer | Lancer des services courants (serveur web, base de données) via Docker |
| Généraliser | Reconnaître les situations où Docker est la bonne solution |
Tu as peut-être déjà vécu cette situation :
Tu développes une application PHP sur ton PC sous Windows avec XAMPP.
Tu l'envoies à un camarade qui a une version différente de PHP.
Ça ne fonctionne plus. 😤
Ou encore :
L'application tourne parfaitement en développement.
On la déploie sur le serveur de production (Ubuntu).
Surprise : erreur au démarrage. Une bibliothèque manque. Une version ne correspond pas.
Ce problème s'appelle le problème de l'environnement.
Une application ne tourne pas seule : elle dépend d'un système d'exploitation, d'une version de langage (PHP 8.1 vs 8.3), de bibliothèques, de variables d'environnement, de fichiers de configuration...
Docker résout ce problème en encapsulant l'application ET son environnement dans une boîte autonome : le conteneur.
Un conteneur Docker tourne de la même façon sur :
💡 Analogie : Pense à un conteneur Docker comme à un aquarium auto-suffisant. Le poisson (l'application) vit dans son eau (son environnement). Peu importe où tu poses l'aquarium, les conditions intérieures restent identiques.
C'est la question que tout le monde se pose. Docker et VirtualBox permettent tous les deux de faire tourner des environnements isolés, mais leur approche est radicalement différente.
Une VM émule un ordinateur complet :
VirtualBox installe un "hyperviseur" qui fait croire à chaque VM qu'elle possède son propre matériel. Chaque VM est lourde : un Ubuntu dans VirtualBox pèse 2 à 4 Go minimum et consomme 1 à 2 Go de RAM rien que pour démarrer.
Un conteneur ne virtualise pas le matériel. Il partage le noyau (kernel) du système d'exploitation hôte et n'isole que les processus et le système de fichiers.
Résultat :
| Critère | Machine Virtuelle (VirtualBox) | Conteneur Docker |
|---|---|---|
| OS inclus | ✅ Oui, OS complet | ❌ Non, partage le noyau hôte |
| Taille | 2–10 Go | 25 Mo – quelques centaines de Mo |
| Démarrage | 1–5 minutes | < 1 seconde |
| Isolation | Totale (matériel virtualisé) | Processus isolés (moins total) |
| Performances | Réduites (overhead) | Quasi-natives |
| Cas d'usage | OS différent, tests OS, isolation forte | Déploiement d'apps, microservices |
| Portabilité | Moyenne | Excellente |
🧠 Note : Sous Windows, Docker Desktop utilise en arrière-plan une petite VM Linux légère (WSL 2 — Windows Subsystem for Linux) pour faire tourner le moteur Docker. L'utilisateur n'a pas à s'en occuper, c'est transparent.
C'est le cœur du système. Il tourne en arrière-plan sur ta machine (on appelle ça un daemon). Il est responsable de :
Une image est un modèle en lecture seule. Elle contient :
Les images sont construites en couches (layers). Chaque instruction du Dockerfile ajoute une couche. Si deux images partagent la même couche de base (ex: Ubuntu), elle n't est téléchargée qu'une seule fois.
Image Ubuntu 22.04 ← couche de base
└── + PHP 8.3 ← couche ajoutée
└── + ton app PHP ← ta couche
Un conteneur est une instance en cours d'exécution d'une image. C'est la "boîte vivante".
Analogie code : Une image = une classe. Un conteneur = une instance (objet).
Image MySQL → conteneur "db-dev" (base de données de développement)
→ conteneur "db-test" (base de données de test)
→ conteneur "db-prod" (base de données de production)
C'est le fichier texte qui contient la recette pour construire une image personnalisée.
# On part d'une image de base officielle
FROM php:8.3-apache
# On copie nos fichiers dans le conteneur
COPY ./src /var/www/html
# On expose le port 80
EXPOSE 80
Avec la commande docker build, Docker lit ce fichier et crée ton image.
C'est le registre officiel d'images Docker. L'adresse : hub.docker.com
On y trouve :
docker pull nginx → télécharge l'image officielle Nginx depuis Docker Hub.
Quand une application a besoin de plusieurs services qui coopèrent (ex: une app PHP + une base de données MySQL + phpMyAdmin), Docker Compose permet de les définir dans un seul fichier docker-compose.yml et de tout démarrer avec une seule commande.
# docker-compose.yml — exemple simplifié
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: secret
phpmyadmin:
image: phpmyadmin
ports:
- "8080:80"
depends_on:
- db
docker compose up → démarre tous les services définis.
C'est l'application graphique pour Windows et macOS. Elle installe et gère automatiquement :
| Besoin | Solution Docker |
|---|---|
| Base de données MySQL sans l'installer | docker run mysql |
| Serveur Apache/Nginx pour tester | docker run nginx |
| Tester une app sur une version PHP différente | Image php:8.1 vs php:8.3 |
| Environnement identique pour toute l'équipe | docker-compose.yml partagé via Git |
| Isoler des projets qui ont des dépendances conflictuelles | Un conteneur par projet |
Oui, absolument. Docker est utilisé en production par des entreprises comme Netflix, Spotify, Airbnb, et des milliers d'autres.
Quelques chiffres :
| Limite | Explication |
|---|---|
| Stateless par défaut | Les données d'un conteneur disparaissent à sa suppression → utiliser des volumes |
| Sécurité | Un conteneur mal configuré peut devenir un vecteur d'attaque (ne pas lancer les conteneurs en root) |
| Complexité à grande échelle | Des dizaines de conteneurs → nécessite Kubernetes ou Docker Swarm |
| Performance réseau | Une légère latence supplémentaire sur les communications inter-conteneurs |
Docker permet de mieux utiliser les ressources d'un serveur. Là où il fallait auparavant un serveur physique par application (beaucoup de gaspillage CPU/RAM), on peut maintenant en faire tourner des dizaines sur la même machine. Moins de serveurs = moins de consommation électrique = moins d'impact environnemental. C'est l'un des arguments écologiques du Cloud-native.
Cette page d'introduction pose le vocabulaire et le contexte. Pour mettre les mains dans le cambouis, enchaîne avec :
┌─────────────────────────────────┐
│ DOCKER HUB │
│ (bibliothèque d'images publiques)│
└──────────────┬──────────────────┘
│ docker pull
┌──────────────▼──────────────────┐
│ IMAGE │
│ (modèle en lecture seule) │
└──────────────┬──────────────────┘
│ docker run
┌────────────────────┼────────────────────┐
│ │ │
┌─────────▼──────┐ ┌─────────▼──────┐ ┌─────────▼──────┐
│ Conteneur 1 │ │ Conteneur 2 │ │ Conteneur 3 │
│ (dev) │ │ (test) │ │ (prod) │
└────────────────┘ └────────────────┘ └────────────────┘
Docker favorise la densification des serveurs : là où il fallait 10 serveurs physiques, on peut héberger 10 applications isolées sur un seul serveur bien dimensionné. Cela réduit la consommation électrique, la production de chaleur et les déchets électroniques. C'est l'un des fondements du mouvement Green IT dans les datacenters modernes.