infra / docker
Images et conteneurs : les fondamentaux
Explication
Un peu d'histoire
Docker est lancé par Solomon Hykes chez la startup dotCloud, et présenté publiquement en mars 2013 à la conférence PyCon. Docker n'invente pas la conteneurisation : des mécanismes noyau comme les cgroups et les namespaces existaient déjà depuis des années dans Linux, et des outils comme LXC les exploitaient. Ce que Docker apporte, c'est une interface en ligne de commande simple et un format d'image standardisé, ce qui rend cette technologie enfin accessible à tous les développeurs — pas seulement aux spécialistes système. Cette simplicité déclenche une adoption fulgurante dans toute l'industrie du logiciel dès 2013-2014.
Pourquoi apprendre Docker aujourd'hui
Avant Docker, une phrase revenait sans cesse dans les équipes : "ça marche sur ma machine". Une application développée dans un environnement ne se comportait pas forcément pareil une fois déployée ailleurs, à cause de différences de versions, de dépendances ou de configuration. Docker résout ce problème en empaquetant une application avec absolument tout ce dont elle a besoin pour fonctionner, dans une unité reproductible à l'identique partout. C'est devenu une compétence de base pour presque tout poste de développeur ou d'ingénieur DevOps, et le socle sur lequel reposent des outils plus avancés comme Docker Compose ou Kubernetes.
Ce que vous allez apprendre
- Distinguer précisément une image (modèle figé) d'un conteneur (instance vivante de cette image)
- Comprendre les deux mécanismes noyau (namespaces, cgroups) qui rendent l'isolation possible
- Lancer, arrêter, redémarrer et supprimer un conteneur avec les bonnes options (
-d,-p,-it) - Distinguer
docker ps(conteneurs actifs) dedocker ps -a(tous, y compris arrêtés) - Nettoyer régulièrement conteneurs et images inutilisés pour éviter d'accumuler de l'espace disque perdu
Dans quel contexte ?
Un développeur rejoint une équipe qui lui dit simplement "clone le repo et lance docker run -d -p 8080:80 nginx". Sans jamais avoir installé nginx lui-même, ni configuré quoi que ce soit sur sa machine, il obtient exactement le même comportement que ses collègues, sur Windows, macOS ou Linux. C'est cette promesse de reproductibilité qui explique pourquoi Docker est devenu incontournable dès le premier jour dans la plupart des équipes techniques.
Image et conteneur : la distinction fondamentale
Une image est un modèle figé, en lecture seule : un peu comme la recette ou le moule. Elle contient un système de fichiers minimal, les dépendances, le code et la commande à exécuter au démarrage. Un conteneur, lui, est une instance vivante de cette image : un processus isolé qui tourne réellement, avec son propre système de fichiers modifiable, sa mémoire, son réseau. On peut lancer plusieurs conteneurs différents à partir d'une même image, exactement comme on peut faire plusieurs gâteaux avec le même moule.
Cette isolation entre le conteneur et le reste de la machine repose sur deux mécanismes du noyau Linux : les namespaces (qui cloisonnent ce qu'un processus peut voir : ses propres fichiers, son propre réseau, ses propres autres processus) et les cgroups (qui limitent les ressources — CPU, mémoire — qu'il peut consommer). Contrairement à une machine virtuelle, il n'y a pas de système d'exploitation complet dupliqué : les conteneurs partagent le noyau de la machine hôte, ce qui les rend beaucoup plus légers et rapides à démarrer.
| Concept | Rôle | Analogie |
|---|---|---|
| Image | Modèle figé, en lecture seule | Un moule à gâteau |
| Conteneur | Instance vivante d'une image | Un gâteau sorti du moule |
| Namespace | Isole ce qu'un processus peut voir | Des murs entre appartements |
| Cgroup | Limite les ressources consommées | Un compteur électrique par appartement |
Prérequis
Aucune connaissance préalable de Docker n'est nécessaire. Un simple accès à un terminal avec Docker installé (docker --version) suffit pour suivre les exemples de cette leçon.
Le piège du débutant
Le réflexe classique est de confondre docker ps (qui ne montre que les conteneurs en cours d'exécution) et l'oubli des conteneurs arrêtés, qui continuent d'occuper de l'espace disque tant qu'ils ne sont pas supprimés.
Bonne pratique
Prends l'habitude de lancer docker ps -a avant de conclure qu'un conteneur "a disparu" — il est probablement simplement arrêté. Et pense à nettoyer régulièrement avec docker system prune pour éviter d'accumuler des images et conteneurs inutilisés qui occupent de l'espace disque pour rien.
Commandes & code
Images et conteneurs : les fondamentaux
Une image est un modèle en lecture seule ; un conteneur est une instance en cours d'exécution de cette image.
docker --version # vérifie que Docker est installé
docker info # infos détaillées sur l'installation Docker
# Lancer un premier conteneur
docker run hello-world # télécharge l'image si absente, puis l'exécute
docker run nginx # lance nginx au premier plan (bloque le terminal)
docker run -d nginx # -d = detached, tourne en arrière-plan
docker run -d --name mon-nginx nginx # nomme le conteneur explicitement
docker run -d -p 8080:80 nginx # mappe le port 80 du conteneur sur 8080 de l'hôte
docker run -it ubuntu bash # -it = interactif + TTY, ouvre un shell dans le conteneur
# Cycle de vie d'un conteneur
docker ps # conteneurs en cours d'exécution
docker ps -a # tous les conteneurs, y compris arrêtés
docker stop mon-nginx # arrêt propre (SIGTERM puis SIGKILL après un délai)
docker start mon-nginx # redémarre un conteneur arrêté
docker restart mon-nginx # arrête puis relance
docker rm mon-nginx # supprime un conteneur arrêté
docker rm -f mon-nginx # force la suppression même s'il tourne
# Images
docker images # liste les images téléchargées localement
docker pull redis:7-alpine # télécharge une image sans la lancer
docker rmi redis:7-alpine # supprime une image locale
# Nettoyage
docker container prune # supprime tous les conteneurs arrêtés
docker image prune # supprime les images non utilisées ("dangling")
docker system prune -a # nettoyage complet (images, conteneurs, réseaux inutilisés)Résumé
- Une image = modèle immuable ; un conteneur = instance vivante d'une image, isolée par des namespaces/cgroups Linux.
docker runtélécharge (si besoin) puis lance ;-ddétache,-pmappe des ports,-itouvre un terminal interactif.docker ps -amontre TOUT (y compris arrêtés) ; penser à nettoyer régulièrement (system prune).
Exercices pratiques
Mission : traquer l'espace disque perdu par des conteneurs fantômes
Objectif : Diagnostiquer pourquoi des conteneurs arrêtés continuent d'occuper de l'espace disque, et relancer un service correctement configuré.
Contexte
Le serveur de build d'une petite équipe est signalé "disque plein" alors que docker ps n'affiche presque rien. Personne n'a pensé à vérifier les conteneurs arrêtés ni les images téléchargées mais jamais nettoyées. Tu dois diagnostiquer la situation puis relancer un service nginx nommé, détaché, avec le bon mapping de port.