Aller au contenu
Conteneurs & Orchestration medium

Concepts Docker : images, conteneurs, layers, cycle de vie et architecture

21 min de lecture

logo docker

  • Image vs Conteneur : la différence fondamentale que tout débutant doit maîtriser
  • Cycle de vie : les états created, running, paused, stopped, dead
  • Layers : pourquoi Docker est si efficace (cache, partage, téléchargement)
  • Isolation : namespaces et cgroups sous le capot
  • Architecture : client, daemon, registry — comment tout s’articule
ConceptDéfinition express
ImageModèle immuable (read-only) composé de layers
ConteneurProcessus isolé + layer R/W (éphémère par défaut)
docker runCrée puis démarre un conteneur (create → start)
Étatscreated → running ↔ paused → exited → removed
Daemondockerd orchestre via API ; le client docker envoie des requêtes
LayersChaque instruction Dockerfile = une couche partagée et cachée

Quelle est la différence entre image et conteneur ?

Section intitulée « Quelle est la différence entre image et conteneur ? »

La distinction entre image et conteneur est la notion la plus importante à maîtriser. C’est la question que se posent tous les débutants — et la source de nombreuses confusions.

ImageConteneur
NatureModèle immuableInstance (processus)
ÉcritureRead-onlyLayer R/W
PersistanceStockée sur disqueÉphémère sans volume
Multiplicité1 image → N conteneurs1 conteneur = 1 exécution
AnalogieClasse (POO) / MouleObjet / Gâteau fabriqué

Une image Docker est un package en lecture seule contenant tout le nécessaire pour exécuter une application :

  • Système de fichiers de base (OS minimal)
  • Dépendances et bibliothèques
  • Code de l’application
  • Variables d’environnement
  • Commande de démarrage

Caractéristiques clés :

PropriétéDescription
ImmuableUne fois créée, une image ne change jamais
VersionnéeIdentifiée par un tag (ex: nginx:1.25)
PortableFonctionne identiquement partout
Composée de layersChaque instruction Dockerfile = une couche

Analogie : Une image est comme une classe en programmation orientée objet, ou un moule pour faire des gâteaux. Elle définit la structure mais ne s’exécute pas elle-même.

Fenêtre de terminal
# Lister les images locales
docker images
# Télécharger une image depuis Docker Hub
docker pull nginx:alpine
# Inspecter une image
docker inspect nginx:alpine

Un conteneur est une instance d’une image en cours d’exécution. C’est un processus isolé avec son propre :

  • Système de fichiers (copie de l’image + layer d’écriture)
  • Espace réseau
  • Arborescence de processus (PID)
  • Hostname

Caractéristiques clés :

PropriétéDescription
ÉphémèrePar défaut, les données disparaissent à la suppression
IsoléSéparé des autres conteneurs et de l’hôte
Layer R/WPeut écrire dans sa couche propre (non persistante)
LégerPartage le kernel avec l’hôte

Analogie : Un conteneur est comme un objet instancié depuis une classe, ou un gâteau fabriqué avec le moule.

Fenêtre de terminal
# Créer et démarrer un conteneur
docker run -d --name web nginx:alpine
# Lister les conteneurs en cours
docker ps
# Lister tous les conteneurs (y compris arrêtés)
docker ps -a

→ Pour manipuler images et conteneurs : Guide CLI Docker

Flux Image vers Conteneur : docker run crée une instance, docker commit crée une nouvelle image

Quand vous exécutez docker run nginx:alpine, Docker effectue plusieurs opérations en séquence :

  1. Recherche l’image localement, sinon la télécharge (docker pull)

  2. Crée un conteneur avec un layer R/W (docker create)

  3. Configure l’isolation : namespaces, cgroups, réseau

  4. Démarre le processus principal (docker start)

C’est pourquoi docker run = docker create + docker start.

Fenêtre de terminal
# Équivalent à docker run -d --name web nginx:alpine
docker create --name web nginx:alpine
docker start web

Un conteneur passe par plusieurs états au cours de sa vie. Comprendre ces états vous permet de diagnostiquer rapidement pourquoi un conteneur ne fonctionne pas comme prévu.

Cycle de vie d'un conteneur Docker : created, running, paused, exited, dead et les transitions entre ces états

Le conteneur est créé mais pas démarré. Le layer R/W existe, les ressources sont allouées, mais aucun processus ne tourne.

Fenêtre de terminal
# Créer sans démarrer
docker create --name myapp nginx:alpine
# Vérifier l'état
docker ps -a --filter "name=myapp"
# STATUS: Created

Cas d’usage : préparer un conteneur avec des configurations avant démarrage.

Le conteneur est actif, son processus principal (PID 1) s’exécute.

Fenêtre de terminal
# Démarrer un conteneur créé
docker start myapp
# Ou créer et démarrer directement
docker run -d --name web nginx:alpine
# Vérifier
docker ps
# STATUS: Up 5 seconds

Le processus est suspendu (signal SIGSTOP). Le conteneur reste en mémoire mais ne consomme plus de CPU.

Fenêtre de terminal
# Mettre en pause
docker pause myapp
# Reprendre
docker unpause myapp

Cas d’usage : debugging, snapshot mémoire, migration live.

Le processus principal s’est terminé (normalement ou avec erreur). Le conteneur et son layer R/W existent toujours.

Fenêtre de terminal
# Arrêter proprement (SIGTERM puis SIGKILL après 10s)
docker stop myapp
# Arrêter immédiatement (SIGKILL)
docker kill myapp
# Voir le code de sortie
docker inspect myapp --format '{{.State.ExitCode}}'
CommandeSignalDélaiUsage
docker stopSIGTERM → SIGKILL10s par défautArrêt propre (graceful)
docker killSIGKILLImmédiatForcer l’arrêt

Règle : utilisez toujours docker stop sauf si le conteneur ne répond plus.

Comment savoir pourquoi un conteneur est en Exited (137) ?

Section intitulée « Comment savoir pourquoi un conteneur est en Exited (137) ? »
Code de sortieSignification
0Succès — le processus s’est terminé normalement
1-125Erreur application
126Commande non exécutable
127Commande non trouvée
137SIGKILL (OOM killer ou docker kill)
143SIGTERM (docker stop)
Fenêtre de terminal
# Diagnostiquer un exit 137
docker logs myapp # Voir les derniers logs
docker inspect myapp | grep -i oom # Vérifier si OOM
dmesg | grep -i "killed process" # Vérifier OOM killer

→ Pour approfondir le troubleshooting : Commandes Docker CLI

État d’erreur où le conteneur ne peut pas être redémarré ni supprimé normalement. Généralement causé par un problème de ressources ou de driver de stockage.

Fenêtre de terminal
# Forcer la suppression
docker rm -f myapp
CommandeTransition
docker create→ created
docker startcreated/exited → running
docker run→ created → running
docker pauserunning → paused
docker unpausepaused → running
docker stoprunning → exited
docker killrunning → exited
docker restartrunning → exited → running
docker rmexited → removed

Docker utilise un système de couches (layers) pour les images, optimisant le stockage et les téléchargements. C’est ce qui rend Docker si efficace.

Chaque instruction d’un Dockerfile crée une couche :

FROM ubuntu:22.04 # Layer 1 : image de base
RUN apt-get update # Layer 2 : cache apt
RUN apt-get install nginx # Layer 3 : nginx installé
COPY app/ /var/www/ # Layer 4 : fichiers application

Système de layers Docker : chaque instruction Dockerfile crée une couche, avec un layer R/W au sommet pour le conteneur

AvantageDescriptionImpact
PartageLes layers communs sont partagés entre imagesÉconomie disque
CacheLes layers inchangés sont réutilisés lors du buildBuilds rapides
TéléchargementSeuls les layers manquants sont téléchargésRéseau optimisé
ImmutabilitéChaque layer a un hash uniqueReproductibilité

Exemple de partage :

Fenêtre de terminal
# Ces deux images partagent le layer Ubuntu
docker pull ubuntu:22.04 # Télécharge Ubuntu (~77 Mo)
docker pull nginx:ubuntu # Réutilise Ubuntu, télécharge nginx (~30 Mo)
# Total : ~107 Mo au lieu de ~154 Mo

→ Pour optimiser vos builds : Écrire un Dockerfile

Quand un conteneur modifie un fichier d’un layer en lecture seule :

  1. Docker copie le fichier dans le layer R/W du conteneur
  2. Les modifications s’appliquent à la copie
  3. Le layer original reste intact

→ Pour la persistance des données : Volumes Docker

Pourquoi les données disparaissent quand je supprime un conteneur ?

Section intitulée « Pourquoi les données disparaissent quand je supprime un conteneur ? »

Le layer R/W (lecture/écriture) du conteneur est éphémère. Quand vous supprimez le conteneur (docker rm), ce layer disparaît avec toutes les données écrites.

Solutions pour persister les données :

MéthodeUsageCommande
Volume nomméBases de données, fichiers importants-v mydata:/var/lib/data
Bind mountDéveloppement (code source)-v ./src:/app
docker commitSauvegarder l’état (rarement recommandé)docker commit container image
Fenêtre de terminal
# Voir les layers d'une image
docker history nginx:alpine
# Détails avec tailles
docker history --no-trunc nginx:alpine
# Inspecter le système de fichiers
docker inspect nginx:alpine --format '{{json .RootFS.Layers}}'

Docker utilise deux mécanismes du kernel Linux pour isoler les conteneurs. Comprendre ces mécanismes vous aide à diagnostiquer les problèmes et à renforcer la sécurité.

MécanismeRôleAnalogie
NamespacesIsolent ce que le conteneur voitMurs entre appartements
CgroupsLimitent ce que le conteneur consommeCompteurs d’eau/électricité

Les namespaces créent des vues isolées des ressources système :

NamespaceIsoleEffet
PIDProcessusLe conteneur voit ses propres PIDs (1, 2, 3…)
NetworkRéseauInterface réseau, IP, ports propres
MountFilesystemPoints de montage indépendants
UTSHostnameHostname et domainname propres
IPCIPCMémoire partagée, sémaphores isolés
UserUtilisateursMapping UID/GID (rootless mode)

Visualisation :

Fenêtre de terminal
# PID dans le conteneur
docker run --rm alpine ps aux
# PID 1 = processus principal
# PID vu depuis l'hôte
docker top <container_id>
# PID réel sur l'hôte (ex: 12345)

Dans un conteneur, le processus principal devient PID 1 grâce au namespace PID. Ce processus :

  • Reçoit les signaux (SIGTERM, SIGKILL)
  • Doit gérer les processus orphelins (reaping)
  • Sa mort = arrêt du conteneur

Les cgroups (control groups) limitent et comptabilisent les ressources :

RessourceOption docker runExemple
CPU--cpus--cpus 0.5 (50% d’un CPU)
Mémoire--memory--memory 256m
I/O--device-read-bpsLimiter lecture disque
PIDs--pids-limitNombre max de processus
Fenêtre de terminal
# Limiter les ressources
docker run -d --memory 128m --cpus 0.5 nginx:alpine
# Voir les limites d'un conteneur
docker stats --no-stream
CritèreConteneurVM
IsolationKernel partagé (namespaces/cgroups)Hyperviseur (isolation matérielle)
DémarrageSecondesMinutes
TailleMoGo
OverheadMinimalSignificatif (OS complet)
SécuritéSurface d’attaque plus largeIsolation plus forte

→ Pour renforcer l’isolation : Sécuriser Docker

Docker utilise une architecture client-serveur où le client communique avec le daemon via une API REST.

Architecture Docker : client CLI communique avec le daemon via API REST, qui gère conteneurs et images, et interagit avec le registry

Le daemon Docker (dockerd) est le cœur du système :

  • Écoute sur le socket Unix /var/run/docker.sock
  • Gère les images, conteneurs, réseaux et volumes
  • S’exécute en root par défaut (attention sécurité)
  • Communique avec containerd pour l’exécution
Fenêtre de terminal
# Vérifier que le daemon tourne
sudo systemctl status docker
# Voir les logs du daemon
sudo journalctl -u docker.service
# Le processus
ps aux | grep dockerd

Le client est l’outil en ligne de commande que vous utilisez :

  • Envoie des requêtes au daemon via l’API REST
  • Peut se connecter à un daemon distant
  • Configuration dans ~/.docker/config.json
Fenêtre de terminal
# Communiquer avec un daemon distant
export DOCKER_HOST=tcp://remote-host:2376
docker ps
# Voir la configuration client
cat ~/.docker/config.json

Un registry stocke et distribue les images Docker :

RegistryTypeUsage
Docker HubPublicRegistry par défaut, images officielles
GitHub Container RegistryPublic/PrivéIntégré à GitHub
HarborPrivéEnterprise, on-premise
AWS ECRPrivéAWS natif
Google Artifact RegistryPrivéGCP natif
Fenêtre de terminal
# Télécharger depuis Docker Hub (par défaut)
docker pull nginx
# Télécharger depuis un autre registry
docker pull ghcr.io/owner/image:tag
# Pousser vers un registry
docker push myregistry.com/myimage:v1

Ce diagramme synthétise l’écosystème Docker : les images (templates), les conteneurs (instances), les volumes (persistance), le daemon qui orchestre le tout, et le kernel Linux partagé qui rend cette légèreté possible.

Vue d'ensemble Docker : Image, Conteneur et Volume interagissent via le daemon qui s'appuie sur namespaces et cgroups du kernel Linux

  1. Image = modèle immuable : template read-only composé de layers
  2. Conteneur = instance éphémère : processus isolé avec son propre layer R/W
  3. docker run = create + start : recherche l’image, crée le conteneur, démarre
  4. Cycle de vie : created → running ↔ paused → exited → removed
  5. Layers : chaque instruction Dockerfile = une couche partagée et cachée
  6. Namespaces : isolation des vues système (PID, network, mount…)
  7. Cgroups : limitation des ressources (CPU, mémoire, I/O)
  8. Socket Docker = root : protégez /var/run/docker.sock

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
8 min.
70%

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre