VM vs conteneurs : comprendre la différence
Avant Docker, déployer une application signifiait souvent provisionner une machine virtuelle complète. Les conteneurs proposent une approche radicalement différente : plus légère, plus rapide, mais avec ses propres contraintes.
La machine virtuelle : isolation totale
Une VM émule un ordinateur complet (CPU, RAM, disque, réseau) sur un hyperviseur (VMware ESXi, Hyper-V, VirtualBox). Chaque VM embarque son propre système d'exploitation invité.
┌─────────────────────────────────────┐
│ VM 1 (Ubuntu) VM 2 (Windows) │
│ ┌───────────┐ ┌──────────────┐ │
│ │ App + OS │ │ App + OS │ │
│ └───────────┘ └──────────────┘ │
│ Hyperviseur (Type 1/2) │
│ Hardware │
└─────────────────────────────────────┘
Avantage : isolation totale, OS différents sur le même hôte. Inconvénient : démarrage en minutes, empreinte mémoire lourde (OS invité = 512 Mo à 4 Go).
Le conteneur : isolation légère
Un conteneur partage le noyau Linux de l'hôte (pas de second OS). Il utilise deux mécanismes noyau :
- namespaces : isolent les processus, le réseau, le système de fichiers (chaque conteneur "voit" son propre univers)
- cgroups : limitent les ressources CPU et RAM attribuées
graph TD
HW[Hardware]
OS[OS Linux hôte + noyau partagé]
DE[Docker Engine / containerd]
C1[Conteneur 1
App + libs]
C2[Conteneur 2
App + libs]
C3[Conteneur 3
App + libs]
HW --> OS --> DE
DE --> C1
DE --> C2
DE --> C3
Avantage : démarrage en secondes, empreinte mémoire faible (quelques Mo pour les libs applicatives uniquement). Inconvénient : tous les conteneurs partagent le même noyau Linux (pas de Windows dans un conteneur Linux).
Comparaison pratique
| Critère | VM | Conteneur |
|---|---|---|
| Démarrage | 1-5 min | < 5 secondes |
| Poids | Plusieurs Go (OS) | Quelques Mo à centaines de Mo |
| Isolation | Totale (OS séparé) | Processus/réseau isolés, noyau partagé |
| Portabilité | Image volumineuse | Image légère, portable |
| Idéal pour | OS différents, isolation maximale | Microservices, CI/CD, déploiement rapide |
Cas concret : déployer Nginx
Sans Docker : installer nginx, gérer les dépendances, configurer le service système. Avec Docker :
docker run -d -p 80:80 nginx
Nginx tourne en 3 secondes, sans rien installer sur l'hôte.
Erreurs fréquentes
- Conteneur = VM légère : non. Un conteneur partage le noyau hôte. Il ne peut pas faire tourner Windows sur un hôte Linux.
- Les données dans un conteneur sont persistantes : non par défaut. Quand un conteneur est supprimé, ses données le sont aussi. Il faut des volumes (leçon suivante).
- Docker = Linux uniquement : Docker Desktop sur Windows/Mac utilise une VM Linux légère en coulisse pour faire tourner les conteneurs.
À retenir
- Conteneurs = namespaces + cgroups → isolation légère, noyau partagé.
- VMs = OS complet → isolation totale, plus lourd.
- Docker n'est pas la seule runtime : containerd, Podman, CRI-O coexistent.
- Démarrage conteneur : secondes. Démarrage VM : minutes.