--- title: Conteneur vs machine virtuelle description: Deux formes d'isolation qui ne travaillent pas au même niveau. --- C'est la distinction fondamentale : une machine virtuelle et un conteneur isolent tous les deux une application, mais pas de la même manière. ## Machine virtuelle Une VM virtualise le **matériel**. Un hyperviseur simule une machine physique complète sur laquelle on installe un système d'exploitation invité, noyau compris. ```text ┌──────────────────────────────────────────┐ │ App A │ App B │ App C │ ├─────────────┼─────────────┼──────────────┤ │ Bins / libs │ Bins / libs │ Bins / libs │ ├─────────────┼─────────────┼──────────────┤ │ OS invité │ OS invité │ OS invité │ │ + noyau │ + noyau │ + noyau │ ├──────────────────────────────────────────┤ │ Hyperviseur │ ├──────────────────────────────────────────┤ │ OS hôte + matériel │ └──────────────────────────────────────────┘ ``` Chaque VM doit démarrer un OS complet. Cela demande plusieurs gigaoctets de stockage ou de mémoire et des dizaines de secondes de démarrage. ## Conteneur Un conteneur ne virtualise ni le matériel ni le noyau. Il partage le noyau de l'hôte et isole la vue qu'a le processus du système. Deux mécanismes du noyau Linux rendent cela possible : - **namespaces** : chaque conteneur voit ses propres processus, son réseau et son système de fichiers ; - **cgroups** : le système peut limiter sa consommation de CPU et de mémoire. ```text ┌──────────────────────────────────────────┐ │ App A │ App B │ App C │ ├─────────────┼─────────────┼──────────────┤ │ Bins / libs │ Bins / libs │ Bins / libs │ ├──────────────────────────────────────────┤ │ Docker Engine │ ├──────────────────────────────────────────┤ │ OS hôte - noyau partagé │ └──────────────────────────────────────────┘ ``` Le conteneur contient uniquement le userspace minimal nécessaire : binaires, bibliothèques et application. Il emprunte le noyau à l'hôte. ## Comparaison | Critère | Machine virtuelle | Conteneur | | --- | --- | --- | | Niveau d'isolation | Matériel, avec noyau invité dédié | Processus, avec noyau partagé | | Poids | Plusieurs Go | Quelques Mo à quelques centaines de Mo | | Démarrage | Dizaines de secondes | Secondes ou moins | | Densité | Quelques VM par machine | Des dizaines ou centaines de conteneurs | | Frontière de sécurité | Plus forte | Plus légère, mais suffisante pour beaucoup d'usages | Dans l'usage, le résultat peut sembler proche. Techniquement, un conteneur reste un processus isolé. Sur Mac et Windows, tous les conteneurs partagent le noyau de la même VM Docker Desktop, au lieu d'utiliser une VM par service.