← Réseaux

Docker — présentation

Sommaire

Première fiche du cours Docker. Avant de taper la moindre commande, il faut comprendre ce qu'est un conteneur et en quoi il diffère d'une machine virtuelle.

1. Qu'est-ce que Docker

Docker est une plateforme qui permet d'exécuter des applications dans des conteneurs : des environnements isolés, légers et reproductibles.

Le problème qu'il résout tient en une phrase entendue dans toutes les équipes : « chez moi ça marche ». Une application dépend d'une version de bibliothèque, d'une variable d'environnement, d'un paquet système. Sur le poste du développeur tout fonctionne ; sur le serveur, non.

Docker règle cela en embarquant l'application avec tout ce dont elle a besoin dans une image. Cette image s'exécute à l'identique sur n'importe quelle machine dotée de Docker : poste de développement, serveur de test, serveur de production.

ApportConcrètement
PortabilitéLa même image tourne partout, sans réinstaller de dépendances
IsolationDeux applications incompatibles cohabitent sur la même machine
LégèretéQuelques dizaines de mégaoctets, démarrage en millisecondes
ReproductibilitéL'environnement est décrit dans un fichier, versionné avec le code
DensitéBeaucoup plus de conteneurs que de VM sur un même serveur

2. Conteneur ou machine virtuelle

C'est la comparaison attendue systématiquement, à l'écrit comme à l'oral.

Machine virtuelleConteneur
ContientUn système d'exploitation completL'application et ses dépendances seulement
NoyauLe sienPartagé avec l'hôte
TaillePlusieurs gigaoctetsQuelques dizaines de mégaoctets
DémarrageDizaines de secondesQuelques millisecondes
IsolationForte, assurée par l'hyperviseurPlus faible : namespaces et cgroups du noyau
Systèmes possiblesN'importe lequelLe même noyau que l'hôte
Densité sur un serveurQuelques dizainesPlusieurs centaines
MACHINES VIRTUELLES                 CONTENEURS

┌──────┐ ┌──────┐ ┌──────┐          ┌──────┐ ┌──────┐ ┌──────┐
│ App  │ │ App  │ │ App  │          │ App  │ │ App  │ │ App  │
├──────┤ ├──────┤ ├──────┤          ├──────┴─┴──────┴─┴──────┤
│ OS   │ │ OS   │ │ OS   │          │    moteur Docker       │
├──────┴─┴──────┴─┴──────┤          ├────────────────────────┤
│      hyperviseur       │          │  système d'exploitation│
├────────────────────────┤          ├────────────────────────┤
│       matériel         │          │       matériel         │
└────────────────────────┘          └────────────────────────┘

Formulation à retenir : une VM virtualise le matériel, un conteneur virtualise le système d'exploitation. C'est pour cela que le conteneur est léger — il ne réembarque pas de noyau — et c'est aussi pour cela que son isolation est moins étanche.

Les deux ne s'opposent pas : en production, on exécute très souvent des conteneurs à l'intérieur de machines virtuelles, pour cumuler la souplesse des premiers et l'isolation des secondes. Voir la fiche Virtualisation.

3. Le vocabulaire

TermeDéfinition
Image Modèle en lecture seule contenant l'application et ses dépendances. Immuable.
Conteneur Instance en cours d'exécution d'une image, avec une couche d'écriture par-dessus.
Dockerfile Fichier texte décrivant la recette de construction d'une image.
Registry (registre) Dépôt d'images. Le plus connu est Docker Hub. On peut en héberger un privé.
Tag Version d'une image : nginx:1.25, ubuntu:22.04. Sans tag, Docker prend latest.
Volume Stockage persistant, indépendant du cycle de vie du conteneur.
Réseau Docker Réseau virtuel reliant plusieurs conteneurs entre eux.
Couche (layer) Chaque instruction du Dockerfile produit une couche, empilée et mise en cache.

Analogie à réutiliser en épreuve : l'image est à la classe ce que le conteneur est à l'objet. Une seule image, autant de conteneurs qu'on veut, chacun avec son état propre.

4. Comment ça fonctionne

Docker repose sur une architecture client / serveur.

ComposantRôle
Client (docker)La commande que tu tapes. Elle envoie des requêtes au démon.
Démon (dockerd)Le service qui construit les images, lance et surveille les conteneurs.
RegistreStocke et distribue les images.

Le client et le démon peuvent se trouver sur des machines différentes : c'est ce qui permet de piloter un serveur Docker distant depuis son poste.

Les briques du noyau Linux

MécanismeCe qu'il apporte
NamespacesL'isolation : chaque conteneur a sa vue des processus, du réseau, des points de montage, des utilisateurs
CgroupsLa limitation des ressources : CPU, mémoire, entrées-sorties
Union filesystemL'empilement des couches en lecture seule, avec une couche d'écriture au-dessus

Comprendre ces trois briques, c'est comprendre pourquoi un conteneur n'est pas une machine : c'est un ou plusieurs processus de l'hôte, simplement cloisonnés et bridés.

5. À quoi ça sert

UsageExemple concret
DéveloppementMonter une base MySQL en une commande, sans l'installer sur son poste
TestsRepartir d'un environnement vierge et identique à chaque exécution
DéploiementLivrer la même image du test à la production
MicroservicesDécouper une application en services indépendants, mis à l'échelle séparément
Intégration continueExécuter chaque étape du pipeline dans un conteneur jetable
LaboratoireMonter rapidement une maquette : serveur web, annuaire, outil de supervision

En BTS SIO, c'est le second usage qui te servira le plus : déployer un service (serveur web, base de données, outil de MDM, solution de sauvegarde) sans polluer la machine hôte, et pouvoir tout supprimer proprement.

6. Limites et précautions

LimiteConséquence
Isolation plus faible qu'une VM Une faille du noyau hôte affecte tous les conteneurs. Pour des charges non fiables, on isole dans une VM.
Même noyau que l'hôte Pas de conteneur Windows sur un hôte Linux, et réciproquement, sans couche de virtualisation.
Données éphémères Tout ce qui est écrit dans un conteneur disparaît avec lui → volumes obligatoires.
Images non maîtrisées Une image de Docker Hub peut contenir n'importe quoi. Privilégier les images officielles et vérifiées.
Exécution en root Par défaut, le processus tourne en root dans le conteneur. Utiliser l'instruction USER.
Groupe docker Y appartenir équivaut en pratique à être root sur l'hôte.

Le dernier point mérite d'être compris avant l'installation : un membre du groupe docker peut lancer un conteneur privilégié montant la racine de l'hôte, et donc tout lire et tout modifier. Ce n'est pas une commodité, c'est une élévation de privilèges à assumer et à documenter.

À retenir