Aller au contenu

Virtualisation et machines virtuelles

Quand tu développes une application web, tu la codes sur ton ordinateur personnel. Mais cette application finira par tourner sur un serveur — un ordinateur distant, probablement sous Linux, avec une configuration différente de la tienne. La virtualisation est l’ensemble des techniques qui te permettent de reproduire cet environnement serveur sur ta propre machine, sans acheter un deuxième ordinateur.

Ton ordinateur physique — celui que tu touches, avec son clavier, son écran et son disque dur — est la machine hôte. Le système d’exploitation installé dessus (Windows, macOS ou Linux) est le système hôte (host OS). C’est lui qui démarre quand tu allumes ton ordinateur.

Tout ce qui est virtualisé s’exécute à l’intérieur de cet hôte. L’hôte prête ses ressources (mémoire, processeur, disque) aux systèmes virtualisés. Pendant qu’une machine virtuelle tourne, ton hôte dispose de ce qui reste — c’est un partage, pas une duplication.

La virtualisation consiste à créer une version simulée d’une ressource informatique — un ordinateur complet, un réseau, un espace de stockage — à l’aide d’un logiciel. Au lieu d’acheter du matériel dédié, tu simules ce matériel par logiciel.

Dans ce cours, on s’intéresse principalement à la virtualisation de système : simuler un ordinateur complet, avec son propre système d’exploitation, à l’intérieur de ton ordinateur.

La virtualisation répond à quatre besoins concrets :

Tester un autre système. Tu travailles sur Windows mais tu dois vérifier que ton application fonctionne sur Linux? La virtualisation te permet d’installer Linux sans remplacer Windows.

Expérimenter sans risque. Tu veux essayer une commande dont tu n’es pas sûr de l’effet? Dans un environnement virtualisé, une erreur ne touche pas ton système principal. Tu peux même revenir en arrière avec un snapshot.

Isoler des projets. Deux projets nécessitent des versions différentes de Node.js ou de Python? Chaque environnement virtualisé a sa propre configuration, sans conflit.

Reproduire un environnement professionnel. Les serveurs web de production tournent presque tous sous Linux. Virtualiser Linux sur ton ordinateur te permet de travailler dans les mêmes conditions.

Une machine virtuelle (VM) est un ordinateur complet simulé par logiciel. Elle possède son propre système d’exploitation, sa propre mémoire, son propre disque dur — mais tout est virtuel. Du point de vue du système installé dans la VM, il croit être sur un vrai ordinateur.

La pièce maîtresse de la virtualisation est l’hyperviseur — le logiciel qui crée et gère les machines virtuelles. C’est lui qui fait l’intermédiaire entre le matériel réel et les systèmes invités.

Il existe deux types d’hyperviseurs :

Type 1 (bare-metal) — L’hyperviseur s’installe directement sur le matériel, à la place du système d’exploitation. Il n’y a pas d’OS hôte classique. C’est ce qu’utilisent les centres de données et le cloud (VMware ESXi, Microsoft Hyper-V Server, KVM intégré à Linux).

Type 2 (hosted) — L’hyperviseur s’installe comme une application sur un système d’exploitation existant. C’est ce que tu utilises sur ton ordinateur personnel (VMware Workstation/Fusion, VirtualBox).

Voici comment les couches s’empilent dans une VM sur ton ordinateur (hyperviseur de type 2) :

┌─────────────────────────────────┐
│ Application (Node.js, etc.) │ ← ton code
├─────────────────────────────────┤
│ OS invité (Ubuntu Linux) │ ← système complet
├─────────────────────────────────┤
│ Matériel virtuel │ ← CPU, RAM, disque simulés
│ (émulé par l'hyperviseur) │
╞═════════════════════════════════╡
│ Hyperviseur (VMware) │ ← gère la VM
├─────────────────────────────────┤
│ OS hôte (Windows / macOS) │ ← ton système principal
├─────────────────────────────────┤
│ Matériel réel │ ← ton ordinateur physique
└─────────────────────────────────┘

Chaque VM embarque un OS complet (noyau + espace utilisateur). C’est ce qui la rend puissante (isolation totale) mais aussi lourde (chaque VM consomme plusieurs Go de RAM et de disque).

Tu développes une application Express (Node.js) sur ton ordinateur Windows. Le serveur de production est un Ubuntu Linux chez ton hébergeur. Sans virtualisation, tu risques le classique « ça marche sur ma machine » — les chemins de fichiers, les permissions, le comportement du réseau diffèrent entre Windows et Linux.

Avec une VM Ubuntu sur ton Windows :

  1. Tu installes Node.js dans la VM avec sudo apt install nodejs — exactement la même commande que sur le serveur de production.
  2. Tu lances ton serveur avec node index.js — même environnement, mêmes résultats.
  3. Si tu casses quelque chose, tu restaures un snapshot et tu recommences.

Le serveur de production et ta VM parlent le même langage. Les surprises au déploiement diminuent drastiquement.

Un conteneur est un environnement isolé qui partage le noyau du système hôte au lieu d’embarquer son propre OS complet. Il empaquète une application avec toutes ses dépendances (bibliothèques, fichiers de configuration, runtime) dans un paquet léger et portable.

L’outil le plus connu pour créer des conteneurs est Docker.

Voici la différence fondamentale avec une VM :

┌────────────────┐ ┌────────────────┐
│ App A │ │ App B │ ← applications isolées
│ + dépendances │ │ + dépendances │
├────────────────┤ ├────────────────┤
│ Conteneur A │ │ Conteneur B │ ← environnements séparés
╞════════════════╧═╧════════════════╡
│ Docker Engine │ ← gère les conteneurs
├───────────────────────────────────┤
│ OS hôte (Linux) │ ← UN SEUL noyau partagé
├───────────────────────────────────┤
│ Matériel réel │
└───────────────────────────────────┘

La ligne clé est un seul noyau partagé. Les conteneurs n’embarquent pas leur propre OS — ils utilisent le noyau de l’hôte et se contentent d’isoler l’espace utilisateur (fichiers, processus, réseau). C’est ce qui les rend beaucoup plus légers qu’une VM.

Ton application utilise Node.js 20, PostgreSQL 16, et Redis 7. Sans conteneurs, tu dois installer et configurer chacun de ces outils sur ta machine. Si un collègue utilise Node.js 18 ou PostgreSQL 15, vos environnements divergent.

Avec Docker, tu décris l’environnement dans un fichier docker-compose.yml :

services:
app:
image: node:20
volumes:
- ./src:/app
ports:
- "3000:3000"
db:
image: postgres:16
cache:
image: redis:7

Une seule commande (docker compose up) démarre les trois services, chacun dans son conteneur isolé, avec les versions exactes spécifiées. Ton collègue exécute la même commande et obtient exactement le même environnement.

Les deux technologies servent à isoler des environnements, mais elles le font de manière fondamentalement différente.

Machine virtuelleConteneur
Ce qui est simuléUn ordinateur complet (matériel + OS)Un espace utilisateur isolé
NoyauChaque VM a son propre noyauPartage le noyau de l’hôte
Taille typiquePlusieurs GoQuelques Mo à quelques centaines de Mo
Démarrage30 secondes à quelques minutesQuelques secondes
IsolationForte (hyperviseur matériel)Plus légère (namespaces du noyau)
Utilisation typiqueExécuter un OS différent de l’hôteEmpaqueter et déployer des applications
Outils courantsVMware, VirtualBox, KVMDocker, Podman, containerd

Machine virtuelle

Tu as besoin d’un OS complet différent de ton hôte (Linux sur Windows, par exemple), tu veux une isolation forte entre les environnements, ou tu dois tester des configurations au niveau du système d’exploitation (noyau, services système, réseau).

Conteneur

Tu veux empaqueter une application avec ses dépendances exactes, tu as besoin d’un démarrage rapide et d’une empreinte légère, ou tu travailles dans un pipeline de déploiement automatisé (CI/CD).

Si tu travailles sur Windows, tu as peut-être entendu parler de WSL2 (Windows Subsystem for Linux). C’est un outil de Microsoft qui intègre un noyau Linux directement dans Windows, dans une VM légère et transparente.

WSL2 n’est ni une VM classique ni un conteneur — c’est un hybride. Il utilise une VM légère gérée automatiquement par Windows pour exécuter un vrai noyau Linux, mais l’intégration est si fluide que tu ne vois pas la frontière (les fichiers sont accessibles des deux côtés, le terminal s’ouvre dans Windows Terminal).

La virtualisation te permet de simuler des environnements informatiques par logiciel. Dans le contexte du développement web, elle résout un problème fondamental : faire en sorte que ton environnement de développement soit identique à l’environnement de production.

Les machines virtuelles simulent un ordinateur complet avec son propre OS. Elles offrent une isolation forte mais consomment plus de ressources. C’est l’outil que tu vas utiliser dans le tutoriel VMware pour installer Linux et te familiariser avec un environnement serveur.

Les conteneurs isolent des applications en partageant le noyau de l’hôte. Ils sont plus légers et plus rapides, adaptés au déploiement d’applications. Tu les rencontreras plus tard dans le cours avec Docker.

Les deux technologies ne s’excluent pas — elles se complètent. Comprendre leurs différences et leurs cas d’usage est une compétence fondamentale en développement web moderne.

Introduction
1/8

Virtualisation

Quand tu développes une application web, tu la codes sur ton ordinateur personnel. Mais cette application finira par tourner sur un serveur — un ordinateur distant, sous Linux, avec une configuration différente de la tienne.

La virtualisation est l'ensemble des techniques qui te permettent de reproduire cet environnement serveur sur ta propre machine, sans acheter un deuxième ordinateur.

Ce module couvre deux approches : les machines virtuelles et les conteneurs.

Notes
Plus de 80% des serveurs web tournent sous Linux. Les commandes que tu apprendras dans ce cours sont les mêmes qu'en production.
Problème
« Ça marche sur ma machine » — les environnements dev et prod divergent.
Solution
La virtualisation aligne ton environnement local sur l'environnement serveur.