Architecture Docker
Docker n'est pas un programme monolithique. Il est composé de plusieurs éléments qui communiquent entre eux. Comprendre cette architecture aide à diagnostiquer les problèmes et à sécuriser le déploiement.
Les composants
graph LR
CLI[Docker CLI
client]
API[Docker API
REST]
D[Docker Daemon
dockerd]
C[containerd]
R[runc
OCI runtime]
IMG[Images
/var/lib/docker]
REG[Registry
Docker Hub / privé]
CLI -->|docker run| API
API --> D
D --> C
C --> R
R -->|crée| CNT[Conteneur]
D <-->|pull/push| REG
D --> IMG
- Docker CLI : le client en ligne de commande (
docker run,docker ps...). Envoie des requêtes à l'API. - Docker Daemon (dockerd) : le service principal. Gère les images, conteneurs, volumes, réseaux.
- containerd : runtime de conteneurs de haut niveau (géré par la CNCF, utilisé aussi par Kubernetes).
- runc : runtime de bas niveau qui crée réellement les conteneurs (namespaces/cgroups).
- Registry : dépôt d'images (Docker Hub = registre public, possibilité d'un registre privé).
Images vs conteneurs
Image = template en lecture seule (recette)
Conteneur = instance en cours d'exécution d'une image (plat cuisiné)
Une image est composée de layers (couches) en lecture seule. Quand un conteneur démarre, Docker ajoute une couche d'écriture par-dessus.
┌──────────────────┐ ← Couche R/W du conteneur (éphémère)
├──────────────────┤ ← Layer app (votre code)
├──────────────────┤ ← Layer Python 3.11
├──────────────────┤ ← Layer Ubuntu 22.04 base
└──────────────────┘ ← Layer scratch (vide)
Ce système de layers est ce qui rend Docker efficace : si deux images partagent la même base Ubuntu, cette couche n'est téléchargée qu'une seule fois.
Commandes de base
# Vérifier que Docker fonctionne
docker version
docker info
# Tester avec l'image hello-world
docker run hello-world
# Lister les conteneurs en cours
docker ps
# Lister TOUS les conteneurs (y compris arrêtés)
docker ps -a
# Lister les images locales
docker images
Erreurs fréquentes
- Confondre image et conteneur : une image peut donner des dizaines de conteneurs. Un conteneur n'existe que le temps de son exécution.
- Lancer Docker sans démarrer le daemon :
Cannot connect to the Docker daemon= le service dockerd n'est pas démarré (sudo systemctl start docker). - Permissions : sur Linux, l'utilisateur doit être dans le groupe
dockerpour éviter d'utilisersudoà chaque commande (sudo usermod -aG docker $USER, puis reconnexion).
À retenir
- CLI → API → daemon (dockerd) → containerd → runc → conteneur.
- Image = template layers en lecture seule.
- Conteneur = image + couche R/W éphémère.
- Les layers partagés ne sont téléchargés qu'une seule fois → économie d'espace.