Chapitre 113 minIntermédiaire
C'est quoi Docker ? Conteneur, image et machine virtuelle
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- définir image, conteneur, Dockerfile et registre, et les relier dans un cycle ;
- comparer un conteneur et une machine virtuelle, et choisir selon le besoin ;
- expliquer le rôle des espaces de noms, des cgroups et d'OverlayFS ;
- décrire l'architecture de Docker : client, démon, containerd, runc et registre.
3 exercices corrigés2 schémas
Un conteneur est un processus isolé qui embarque une application et tout ce dont elle a besoin pour fonctionner, tout en partageant le noyau du système hôte. Docker est la plateforme qui construit les images de conteneurs, les stocke, les distribue et les exécute. Ce chapitre pose le vocabulaire (image, conteneur, registre, Dockerfile), compare le conteneur à la machine virtuelle et montre sur quels mécanismes du noyau Linux repose l'isolation.
Le problème que Docker résout
Une application ne tourne jamais seule. L'API de notes de frais de Sorbier a besoin de Node.js 24 et pas d'une autre version, de ses dépendances npm, d'une base MySQL 8.4, de variables de configuration et de certificats. Sur le poste de la développeuse, tout est en place. Sur le serveur, il manque une bibliothèque, Node.js est en version 20, un paquet système diffère : l'application plante. C'est le fameux « ça marche sur ma machine ».
La réponse classique, installer à la main sur chaque serveur en suivant une procédure, est lente et fragile : le moindre écart de version casse tout, et deux applications qui exigent deux versions différentes de la même bibliothèque ne cohabitent pas sur le même serveur.
Docker règle le problème en livrant l'application avec son environnement, dans une boîte standard. La boîte contient la bonne version de Node.js, les bonnes bibliothèques et le code. Elle tourne à l'identique sur le PC de la développeuse, sur le serveur de recette et sur srv-gestion. L'analogie qui a donné son nom à Docker est celle du conteneur maritime : peu importe ce qu'il transporte, il a toujours les mêmes dimensions et se charge sur n'importe quel navire.
Image, conteneur, registre : le vocabulaire
Quatre mots reviennent dans tout le cours.
| Terme | Définition | Analogie |
|---|---|---|
| Image | Un modèle figé, en lecture seule : un système de fichiers minimal (bibliothèques, binaires, code de l'application) et des métadonnées (commande de démarrage, port, variables). | Le moule, ou la classe en programmation objet |
| Conteneur | Une instance d'une image en cours d'exécution, avec sa propre couche inscriptible, son réseau et ses processus. Une image peut lancer autant de conteneurs qu'on veut. | La pièce sortie du moule, ou l'objet créé à partir de la classe |
| Dockerfile | Un fichier texte qui décrit, instruction par instruction, comment construire une image. | La recette |
| Registre (registry) | Un serveur qui stocke et distribue des images : Docker Hub (le registre public par défaut), GitHub Container Registry, ou un registre privé de l'entreprise. | L'entrepôt |
Ces quatre éléments forment un cycle : tu écris un Dockerfile, tu le construis (docker build) en une image, tu pousses (docker push) l'image dans un registre, puis un serveur la récupère (docker pull) et la lance (docker run) en conteneur.
Conteneur et machine virtuelle : les différences
Une machine virtuelle (VM) émule un ordinateur complet : un hyperviseur (Proxmox VE, VMware ESXi, Hyper-V) lui attribue des processeurs, de la mémoire, des disques et des cartes réseau virtuels, et elle fait tourner son propre système d'exploitation, noyau compris. Un conteneur n'émule rien : c'est un groupe de processus ordinaires de l'hôte, que le noyau isole des autres. Tous les conteneurs d'un hôte partagent le même noyau.
| Critère | Machine virtuelle | Conteneur |
|---|---|---|
| Ce qui est isolé | Un ordinateur entier, avec son noyau | Des processus, sur le noyau de l'hôte |
| Démarrage | De quelques secondes à une minute (démarrage d'un système) | Moins d'une seconde (lancement d'un processus) |
| Taille typique | Plusieurs gigaoctets (système complet) | De quelques mégaoctets à quelques centaines |
| Systèmes possibles | N'importe lequel : Windows sur un hôte Linux, par exemple | Le même noyau que l'hôte : des conteneurs Linux sur un noyau Linux |
| Isolation | Forte : une faille doit traverser l'hyperviseur | Plus faible : une faille du noyau touche tous les conteneurs |
| Densité | Quelques dizaines de VM par serveur | Des centaines de conteneurs par serveur |
| Usage type | Héberger des serveurs complets, séparer des environnements, faire tourner des systèmes différents | Livrer et faire tourner des applications, des microservices, des pipelines CI |
Les deux ne s'opposent pas : en entreprise, on fait presque toujours tourner Docker dans une VM. C'est le cas chez Sorbier : srv-gestion est une VM Debian 13 sur Proxmox VE, et Docker y fait tourner les applications internes. La VM apporte l'isolation forte et la sauvegarde complète par l'hyperviseur, les conteneurs apportent la facilité de déploiement. Le chapitre 13 détaille ce choix, et le cours Virtualisation explique les hyperviseurs.
Comment Linux isole un conteneur
Docker n'a pas inventé l'isolation : il assemble des fonctions du noyau Linux qui existent depuis des années.
Les espaces de noms (namespaces) limitent ce qu'un processus voit. Chaque conteneur reçoit ses propres espaces de noms :
| Espace de noms | Ce que le conteneur voit à part |
|---|---|
pid | Ses processus seulement ; le premier processus du conteneur porte le numéro 1 |
net | Ses interfaces réseau, sa table de routage, ses ports |
mnt | Son arborescence de fichiers, à partir de la racine de l'image |
uts | Son nom d'hôte |
ipc | Ses files de messages et sa mémoire partagée |
user | Ses propres numéros d'utilisateurs (utilisé par le mode rootless) |
cgroup | Sa propre vue de la hiérarchie des cgroups |
Les groupes de contrôle (cgroups) limitent ce qu'un processus consomme : mémoire, processeur, nombre de processus, débit disque. Sans limite, un conteneur peut occuper toute la mémoire de l'hôte. Docker 29 s'appuie sur les cgroups v2, ceux de Debian 13 ; la prise en charge des anciens cgroups v1 est dépréciée.
Le système de fichiers en couches (OverlayFS) superpose les couches en lecture seule de l'image et une couche inscriptible propre à chaque conteneur (chapitre 4).
Les capacités (capabilities) et le filtre seccomp retirent au root du conteneur une bonne partie des pouvoirs du root de l'hôte : par défaut, un conteneur ne peut ni charger un module du noyau, ni modifier l'horloge, ni monter un système de fichiers.
Tu peux le constater toi-même. Dans un conteneur, la commande ps ne voit que les processus du conteneur :
docker run --rm alpine:3.24 ps
PID USER TIME COMMAND
1 root 0:00 ps
Sur l'hôte, le même processus existe, avec un autre numéro : c'est un processus ordinaire, simplement isolé.
L'architecture de Docker
Quand tu tapes une commande docker, plusieurs programmes travaillent à la suite.
| Composant | Rôle |
|---|---|
Le client docker | La commande que tu tapes. Elle n'exécute rien elle-même : elle envoie des requêtes à l'API du démon. |
Le démon dockerd | Le service qui tourne en permanence (root par défaut). Il gère les images, les réseaux, les volumes et reçoit les requêtes par le socket /var/run/docker.sock. |
containerd | Le gestionnaire de conteneurs de bas niveau : il télécharge et stocke les images, et supervise les conteneurs. Depuis Docker Engine 29, il stocke aussi les images des nouvelles installations. |
runc | Le petit programme qui crée réellement le conteneur : il prépare les espaces de noms, les cgroups et lance le processus. |
| Le registre | Le serveur distant qui fournit les images (Docker Hub par défaut). |
Ces formats sont normalisés par l'OCI (Open Container Initiative) : une image construite avec Docker se lance avec Podman, avec Kubernetes ou en conteneur LXC sur Proxmox VE 9, et inversement (chapitre 14).
Docker Engine, Docker Desktop et les autres
- Docker Engine est le moteur libre (le démon, le client, Compose) que tu installes sur un serveur Linux. Il est gratuit pour tous les usages : c'est lui qui tourne sur srv-gestion.
- Docker Desktop est l'application pour poste de travail Windows, macOS ou Linux. Elle fait tourner Docker Engine dans une petite VM Linux (WSL 2 sous Windows) et ajoute une interface graphique. Elle est gratuite pour un usage personnel, pour l'enseignement et pour les entreprises de moins de 250 salariés et de moins de 10 millions de dollars de chiffre d'affaires ; au-delà, l'entreprise doit payer un abonnement.
- Podman, containerd avec
nerdctl, ou les conteneurs LXC sont des alternatives présentées au chapitre 14.
Docker au BTS SIO
| Où | Ce qu'on attend de toi |
|---|---|
| E5, bloc 1 (les deux options) | Mettre un service à disposition : déployer une application ou un outil (GLPI, un wiki, une supervision) dans des conteneurs, le documenter, le sauvegarder |
| E6 SISR | Une réalisation professionnelle qui déploie des services conteneurisés, les publie derrière un reverse proxy, les supervise (épreuve E6 SISR) |
| E6 SLAM | Livrer ton application avec un Dockerfile et un compose.yaml, la faire tourner avec sa base pendant l'heure de réalisation (épreuve E6 SLAM) |
| E7 (les deux options) | Analyser la sécurité d'un déploiement : image vulnérable, secret dans une image, port exposé, conteneur privilégié |
Exercices
Exercice 1 sur 3 Image ou conteneur ? Réussi À revoir
Pour chaque phrase, dis s'il s'agit d'une image, d'un conteneur, d'un Dockerfile ou d'un registre.
nginx:1.30-alpine, téléchargé une fois et réutilisé dix fois.- Le serveur web qui tourne depuis ce matin sur srv-gestion et écrit ses journaux.
ghcr.io, où la CI de Sorbier déposesorbier-frais.- Le fichier qui commence par
FROM node:24-slim. - Ce qui disparaît, avec les fichiers écrits dedans, quand on tape
docker rm.
Voir la réponseMasquer la réponse de l'exercice 1
- Une image : un modèle figé qu'on télécharge une fois et dont on lance autant de conteneurs qu'on veut.
- Un conteneur : une instance en cours d'exécution.
- Un registre : le serveur qui stocke et distribue les images.
- Un Dockerfile : la recette de construction ;
FROMdonne l'image de départ. - Le conteneur et sa couche inscriptible. L'image, elle, reste intacte, et les données rangées dans un volume aussi.
Tu avais trouvé ?
Exercice 2 sur 3 VM ou conteneur ? Réussi À revoir
Le responsable informatique de Sorbier, Antoine Mercier, te demande de choisir, pour chaque besoin, entre une machine virtuelle et un conteneur. Justifie en une phrase.
- Installer un second contrôleur de domaine Windows Server 2025.
- Faire tourner l'API de notes de frais, mise à jour plusieurs fois par semaine par la CI.
- Tester pendant une heure la nouvelle version de l'outil de supervision avant de l'installer.
- Héberger un logiciel métier ancien qui exige Debian 11 et un module noyau particulier.
Voir la réponseMasquer la réponse de l'exercice 2
- Machine virtuelle : un contrôleur de domaine est un Windows Server complet, qui ne peut pas tourner dans un conteneur Linux.
- Conteneur : chaque nouvelle version est une image qu'on remplace en quelques secondes, avec un retour arrière immédiat vers l'image précédente.
- Conteneur : il démarre en quelques secondes, se supprime sans laisser de traces sur le serveur et n'oblige pas à préparer une VM.
- Machine virtuelle : un conteneur partage le noyau de l'hôte, il ne peut pas charger son propre module noyau. Une VM a son propre noyau, donc le logiciel y retrouve exactement son environnement.
Tu avais trouvé ?
Exercice 3 sur 3 Les mécanismes d'isolation Réussi À revoir
Associe chaque besoin au mécanisme du noyau qui le satisfait : espace de noms pid, espace de noms net, cgroups, OverlayFS.
- Empêcher un conteneur de consommer plus de 512 Mo de mémoire.
- Faire tourner deux conteneurs qui écoutent tous les deux sur le port 80.
- Partager les couches d'une même image entre dix conteneurs sans les copier.
- Empêcher un conteneur de voir, et donc d'arrêter, les processus des autres.
Voir la réponseMasquer la réponse de l'exercice 3
- Les cgroups, qui limitent les ressources consommées.
- L'espace de noms
net: chaque conteneur a ses propres interfaces et ses propres ports, donc deux conteneurs peuvent écouter sur leur port 80 sans conflit. Pour les joindre depuis l'extérieur, il faudra les publier sur deux ports différents de l'hôte (chapitre 7). - OverlayFS : les couches de l'image sont en lecture seule et partagées, chaque conteneur n'a en propre que sa couche inscriptible.
- L'espace de noms
pid: le conteneur ne voit que ses propres processus.
Tu avais trouvé ?