Docker : virtualiser des applications avec des conteneurs

Comprendre Docker : conteneurs, images, écosystème et mise en pratique sous Windows

    6tq

🎯 Objectifs du cours

À 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

🔑 5 notions-clés

  1. Conteneur — Une application et tout ce dont elle a besoin, isolée du reste du système
  2. Image — Le "moule" à partir duquel on crée un conteneur (lecture seule, réutilisable)
  3. Dockerfile — Le fichier de recette qui décrit comment construire une image
  4. Docker Hub — Le dépôt public où l'on télécharge et partage des images
  5. Docker Compose — L'outil pour orchestrer plusieurs conteneurs qui travaillent ensemble

🔥 Le problème que Docker résout

"Ça marche sur ma machine..."

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 :

  • Ton PC Windows
  • Le PC de ton camarade (macOS)
  • Un serveur Linux en production
  • Un service cloud (AWS, Azure, Google Cloud)

💡 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.


⚖️ Docker vs Machine Virtuelle (VirtualBox)

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.

docker conteneurs

La machine virtuelle (VirtualBox)

Une VM émule un ordinateur complet :

  • Un processeur virtuel
  • De la RAM dédiée
  • Un disque dur virtuel
  • Un système d'exploitation complet (Windows, Ubuntu, etc.)

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.

Le conteneur Docker

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 :

  • Un conteneur Nginx pèse ~25 Mo (vs plusieurs Go pour une VM)
  • Il démarre en moins d'une seconde (vs plusieurs minutes pour une VM)
  • Tu peux lancer 50 conteneurs là où tu pourrais difficilement lancer 5 VMs

Tableau comparatif

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

Quand utiliser quoi ?

  • VirtualBox / VMware → Tu as besoin d'un vrai autre système d'exploitation (ex: tester une app Windows sur macOS, lab réseau avec plusieurs OS)
  • Docker → Tu veux déployer une application rapidement, de façon reproductible, sans te soucier de l'environnement

🧠 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.


🧩 L'écosystème Docker

docker ecosysteme

1. Le Docker Engine (le moteur)

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 :

  • Télécharger des images
  • Créer et gérer les conteneurs
  • Gérer les réseaux virtuels entre conteneurs
  • Gérer les volumes (stockage persistant)

2. L'Image Docker

Une image est un modèle en lecture seule. Elle contient :

  • Un mini-système de fichiers
  • L'application et ses dépendances
  • Les instructions de démarrage

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

docker couches

3. Le Conteneur

Un conteneur est une instance en cours d'exécution d'une image. C'est la "boîte vivante".

  • Une image → on peut en créer autant de conteneurs qu'on veut
  • Chaque conteneur est isolé : ses modifications ne touchent pas l'image source
  • Si on supprime un conteneur, ses données sont perdues (sauf si on utilise un volume)

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)

4. Le Dockerfile

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.

5. Docker Hub

C'est le registre officiel d'images Docker. L'adresse : hub.docker.com

On y trouve :

  • Des images officielles maintenues par les éditeurs (MySQL, PHP, Nginx, Node.js, Ubuntu...)
  • Des images communautaires partagées par des développeurs
  • Ton propre compte pour héberger tes images privées ou publiques

docker pull nginx → télécharge l'image officielle Nginx depuis Docker Hub.

6. Docker Compose

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.

7. Docker Desktop

C'est l'application graphique pour Windows et macOS. Elle installe et gère automatiquement :

  • Le moteur Docker
  • WSL 2 (sous Windows)
  • Une interface visuelle pour voir les conteneurs, images, volumes
  • Docker Compose

💼 Cas d'utilisation courants

En développement (le plus fréquent pour vous)

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

En production / DevOps

  • Microservices : chaque composant d'une grosse application tourne dans son propre conteneur
  • CI/CD : les pipelines de tests (GitHub Actions, GitLab CI) utilisent Docker pour créer des environnements de test propres à chaque build
  • Déploiement reproductible : "ça marche sur ma machine" devient "ça marchera partout"
  • Mise à l'échelle : avec Kubernetes, on peut lancer automatiquement 10 copies d'un conteneur si le trafic augmente

Pour un technicien informatique

  • Lancer un serveur DNS (Pi-hole) dans un conteneur sur un Raspberry Pi
  • Installer Portainer (interface web pour gérer Docker) en une commande
  • Déployer un serveur de fichiers, un Wiki, un serveur de monitoring sans "salir" le système hôte
  • Tester des configurations réseau ou serveur en toute sécurité

🏭 Docker est-il prêt pour la production ?

Oui, absolument. Docker est utilisé en production par des entreprises comme Netflix, Spotify, Airbnb, et des milliers d'autres.

Quelques chiffres :

  • Plus de 13 millions d'images sur Docker Hub
  • Utilisé dans la majorité des pipelines CI/CD modernes
  • Base de Kubernetes, le standard de l'orchestration de conteneurs

Limites à connaître

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

Bonne pratique : l'écoresponsabilité 🌱

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.


🚀 La suite du chapitre

Cette page d'introduction pose le vocabulaire et le contexte. Pour mettre les mains dans le cambouis, enchaîne avec :

  1. Premiers pas — installation, premières commandes et 3 exercices guidés (Nginx, MySQL, Compose)
  2. Docker Desktop — l'interface graphique au quotidien
  3. Les ports, volumes/réseaux, Compose, Dockerfile
  4. Bonnes pratiques et catalogue d'images selfhosted pour finir

📊 Synthèse visuelle

                    ┌─────────────────────────────────┐
                    │         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)        │
    └────────────────┘   └────────────────┘  └────────────────┘

🌱 Écoresponsabilité numérique

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.