Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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.

TermeDéfinitionAnalogie
ImageUn 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
ConteneurUne 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
DockerfileUn 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.

Machines virtuellesConteneursVM 1AppliDépendancesSystèmeinvité+ noyauVM 2AppliDépendancesSystèmeinvité+ noyauVM 3AppliDépendancesSystèmeinvité+ noyauHyperviseurProxmox VE, ESXi, Hyper-VMatérielConteneur 1AppliDépendancesConteneur 2AppliDépendancesConteneur 3AppliDépendancesMoteur DockerSystème hôte : un seul noyau LinuxMatérielChaque VM fait tourner son propre noyauTous les conteneurs partagent le noyau de l'hôte
La VM embarque un système complet ; le conteneur partage le noyau de l'hôte
CritèreMachine virtuelleConteneur
Ce qui est isoléUn ordinateur entier, avec son noyauDes processus, sur le noyau de l'hôte
DémarrageDe quelques secondes à une minute (démarrage d'un système)Moins d'une seconde (lancement d'un processus)
Taille typiquePlusieurs gigaoctets (système complet)De quelques mégaoctets à quelques centaines
Systèmes possiblesN'importe lequel : Windows sur un hôte Linux, par exempleLe même noyau que l'hôte : des conteneurs Linux sur un noyau Linux
IsolationForte : une faille doit traverser l'hyperviseurPlus faible : une faille du noyau touche tous les conteneurs
DensitéQuelques dizaines de VM par serveurDes centaines de conteneurs par serveur
Usage typeHéberger des serveurs complets, séparer des environnements, faire tourner des systèmes différentsLivrer 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 nomsCe que le conteneur voit à part
pidSes processus seulement ; le premier processus du conteneur porte le numéro 1
netSes interfaces réseau, sa table de routage, ses ports
mntSon arborescence de fichiers, à partir de la racine de l'image
utsSon nom d'hôte
ipcSes files de messages et sa mémoire partagée
userSes propres numéros d'utilisateurs (utilisé par le mode rootless)
cgroupSa 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 :

bash
docker run --rm alpine:3.24 ps
text
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.

ComposantRôle
Le client dockerLa 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 dockerdLe 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.
containerdLe 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.
runcLe petit programme qui crée réellement le conteneur : il prépare les espaces de noms, les cgroups et lance le processus.
Le registreLe serveur distant qui fournit les images (Docker Hub par défaut).
RegistreDocker Hub, ghcr.ioimagesClientdockerSocket Unix/var/run/docker.sockdockerddémon, en rootcontainerdimages, supervisionrunccrée chaque conteneurconteneurconteneurconteneurÉcrire sur ce socket,c'est être root sur l'hôtetapé parl'admin
Le client parle au démon, qui délègue à containerd et runc

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 SISRUne réalisation professionnelle qui déploie des services conteneurisés, les publie derrière un reverse proxy, les supervise (épreuve E6 SISR)
E6 SLAMLivrer 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.

  1. nginx:1.30-alpine, téléchargé une fois et réutilisé dix fois.
  2. Le serveur web qui tourne depuis ce matin sur srv-gestion et écrit ses journaux.
  3. ghcr.io, où la CI de Sorbier dépose sorbier-frais.
  4. Le fichier qui commence par FROM node:24-slim.
  5. 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
  1. Une image : un modèle figé qu'on télécharge une fois et dont on lance autant de conteneurs qu'on veut.
  2. Un conteneur : une instance en cours d'exécution.
  3. Un registre : le serveur qui stocke et distribue les images.
  4. Un Dockerfile : la recette de construction ; FROM donne l'image de départ.
  5. 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.

  1. Installer un second contrôleur de domaine Windows Server 2025.
  2. Faire tourner l'API de notes de frais, mise à jour plusieurs fois par semaine par la CI.
  3. Tester pendant une heure la nouvelle version de l'outil de supervision avant de l'installer.
  4. 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
  1. Machine virtuelle : un contrôleur de domaine est un Windows Server complet, qui ne peut pas tourner dans un conteneur Linux.
  2. 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.
  3. Conteneur : il démarre en quelques secondes, se supprime sans laisser de traces sur le serveur et n'oblige pas à préparer une VM.
  4. 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.

  1. Empêcher un conteneur de consommer plus de 512 Mo de mémoire.
  2. Faire tourner deux conteneurs qui écoutent tous les deux sur le port 80.
  3. Partager les couches d'une même image entre dix conteneurs sans les copier.
  4. 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
  1. Les cgroups, qui limitent les ressources consommées.
  2. 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).
  3. OverlayFS : les couches de l'image sont en lecture seule et partagées, chaque conteneur n'a en propre que sa couche inscriptible.
  4. L'espace de noms pid : le conteneur ne voit que ses propres processus.

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Installer Docker Engine sur Debian 13Revoir le sommaire du cours