Docker : les fondamentaux
Ce cours s'adresse à toute personne qui doit faire tourner du logiciel dans des conteneurs : développeur qui veut un environnement reproductible, administrateur qui hérite d'une application « dockerisée », futur ingénieur DevOps qui prépare Kubernetes. Il part de zéro sur les conteneurs, mais suppose que vous êtes à l'aise dans un terminal Linux : naviguer dans les répertoires, lire un fichier, lancer et arrêter un processus.
L'approche
Beaucoup d'introductions à Docker enseignent une liste de commandes. Ce cours fait l'inverse : il commence par expliquer ce qu'est un conteneur pour le noyau Linux, parce que presque tous les problèmes que vous rencontrerez ensuite (un conteneur qui ne s'arrête pas, un volume illisible, un port injoignable, un fichier qui disparaît) deviennent évidents une fois le mécanisme compris. Chaque commande est ensuite présentée avec sa sortie réelle, obtenue sur les versions indiquées en tête de leçon, et avec l'explication de chaque option.
Le fil conducteur est une petite application web en Python adossée à une base PostgreSQL : on la lance, on la casse, on la répare, on la persiste, on la relie en réseau, puis on la décrit entièrement dans un fichier Compose.
À la fin du cours
Vous saurez expliquer à un collègue pourquoi un conteneur n'est pas une machine virtuelle, faire tourner et diagnostiquer n'importe quelle image publique, écrire un Dockerfile simple, garder vos données à l'abri de la suppression d'un conteneur et décrire une application complète dans un fichier compose.yaml. Vous aurez aussi les réflexes de sécurité de base : ne pas exposer ce qui n'a pas à l'être, ne pas tourner en root sans raison, limiter les ressources.
La construction d'images optimisées (multi-étapes, cache BuildKit, images minimales, signatures) fait l'objet du cours suivant, Construire des images de conteneurs. L'exécution à l'échelle est traitée dans les cours Kubernetes.
Ce qu'il faut installer
- Une machine Linux (physique, virtuelle ou WSL 2), avec les droits
sudo. Les exemples ont été exécutés sur Ubuntu 24.04. - Docker Engine, installé à la leçon 4. Si vous êtes sur macOS ou Windows, Docker Desktop ou une alternative fonctionne aussi, avec les différences signalées dans le cours.
- Environ 2 Go d'espace disque pour les images utilisées.
Plan du cours
- Pourquoi les conteneurs existent
100 · Comprendre
Le problème que les conteneurs résolvent, ce qui les distingue d'une machine virtuelle, et les quarante ans d'histoire qui ont mené à Docker. - Un conteneur à la main : namespaces, cgroups, capabilities
100 · Comprendre
Construire un conteneur sans Docker, avec unshare, chroot et le système de fichiers des cgroups, pour voir exactement ce que fait un moteur de conteneurs. - L'architecture de Docker, du client à runc
100 · Comprendre
Qui fait quoi quand vous tapez docker run : le client, l'API, dockerd, containerd, le shim et runc, et pourquoi ce découpage compte en exploitation et en sécurité. - Installer Docker Engine proprement
200 · Pratiquer
Choisir sa source de paquets, installer Docker Engine depuis le dépôt officiel, régler les droits d'accès en connaissance de cause et poser une configuration de démon saine dès le premier jour. - docker run décortiqué
200 · Pratiquer
La commande la plus utilisée de Docker, option par option : ce que l'image fournit par défaut, ce que vous remplacez, les modes interactif et détaché, l'environnement, l'utilisateur et les politiques de redémarrage. - Cycle de vie et diagnostic d'un conteneur
200 · Pratiquer
Observer, interroger et arrêter proprement un conteneur : journaux, exec, inspect, signaux et PID 1, vérifications de santé, et déboguer une image qui n'a même pas de shell. - Les images : couches, étiquettes, empreintes et registres
200 · Pratiquer
Ce que contient réellement une image, comment ses couches se partagent et s'empilent, pourquoi une étiquette peut mentir et une empreinte jamais, et comment fonctionne un registre. - Un premier Dockerfile, propre dès le départ
200 · Pratiquer
Empaqueter l'application du fil conducteur : instructions essentielles, contexte de construction, .dockerignore, ordre des étapes et cache, forme exec, utilisateur non privilégié. - Persister les données : volumes, montages et tmpfs
200 · Pratiquer
Où vivent les données d'un conteneur, comment les garder au-delà de sa suppression, et comment éviter les pièges de droits, de chemins et de sauvegarde qui font perdre des données en production. - Relier et exposer : les réseaux Docker
200 · Pratiquer
Comment les conteneurs se trouvent et se parlent, comment on les expose à l'extérieur, ce que Docker fait au pare-feu de l'hôte, et pourquoi UFW ne vous protège pas des ports publiés. - Décrire une application complète avec Docker Compose
200 · Pratiquer
Remplacer les commandes docker run par un fichier versionné : services, réseaux, volumes, ordre de démarrage fondé sur la santé, variables, environnement de développement, profils et secrets. - Sécuriser et limiter ses conteneurs
200 · Pratiquer
Durcir l'exécution d'un conteneur, couche par couche : ressources, utilisateur, capabilities, no-new-privileges, système de fichiers, user namespaces et mode rootless, analyse des images. Avec la grille de l'ANSSI.