1. Qu'est-ce que Docker ?
Docker est une plateforme open-source de conteneurisation qui permet d'empaqueter une application avec toutes ses dépendances dans une unité standardisée appelée conteneur. Lancé en 2013 par Solomon Hykes, Docker a révolutionné le déploiement logiciel avec le principe "Build once, run anywhere".
Pourquoi Docker ?
Le problème classique du développement : "Ça marche sur ma machine !". Docker résout cela en encapsulant l'environnement complet — OS libs, runtime, config — dans une image portable.
| Problème | Sans Docker | Avec Docker |
|---|---|---|
| Dépendances conflictuelles | Python 2 vs Python 3 sur la même machine | Chaque conteneur a son propre env |
| Déploiement reproductible | "Works on my machine" | Même image, même comportement partout |
| Isolation des services | Processus partagent le même OS | Namespaces + cgroups isolent tout |
| Démarrage rapide | VM : 30–60 secondes | Conteneur : < 1 seconde |
| Portabilité | Config spécifique à l'OS | Tourne sur Linux/Mac/Windows/Cloud |
2. Architecture Docker
Docker utilise une architecture client-serveur :
Docker CLI (client)
│ REST API
▼
Docker Daemon (dockerd) — tourne en arrière-plan
│
├── Images — templates read-only
├── Conteneurs — instances en cours d'exécution
├── Volumes — stockage persistant
└── Réseaux — communication inter-conteneurs
Docker Hub / Registry — stockage distant des images
Composants clés
- Docker Client — La CLI (
docker) que vous utilisez au terminal. - Docker Daemon (dockerd) — Le service qui gère réellement les conteneurs.
- Images — Modèles immuables en couches (layers) pour créer des conteneurs.
- Conteneurs — Instances en cours d'exécution d'une image.
- Registry — Dépôt d'images. Docker Hub est le registre public par défaut.
# Flux typique
docker pull nginx # Télécharge l'image depuis Docker Hub
docker run nginx # Crée et démarre un conteneur
docker ps # Liste les conteneurs actifs
docker stop container_id # Arrête le conteneur
3. Conteneurs vs Machines Virtuelles
Les conteneurs et les VMs offrent toutes deux de l'isolation, mais de façon fondamentalement différente.
╔═══════════════════════════╗ ╔═══════════════════════════╗
║ Machine Virtuelle (VM) ║ ║ Conteneur Docker ║
╠═══════════════════════════╣ ╠═══════════════════════════╣
║ App A ║ App B ║ ║ App A ║ App B ║
║ Bins/Libs║ Bins/Libs ║ ║ Bins ║ Bins ║
║ Guest OS ║ Guest OS ║ ╠═════════╩═════════════════╣
╠═══════════╩════════════════╣ ║ Docker Engine ║
║ Hyperviseur ║ ╠═══════════════════════════╣
╠════════════════════════════╣ ║ OS Hôte (Linux kernel) ║
║ OS Hôte ║ ╠═══════════════════════════╣
╠════════════════════════════╣ ║ Infrastructure ║
║ Infrastructure ║ ╚═══════════════════════════╝
╚════════════════════════════╝
| Critère | VM | Conteneur |
|---|---|---|
| Démarrage | 30–120 s | < 1 s |
| Taille | Plusieurs Go | Quelques Mo |
| Isolation | Complète (kernel dédié) | Process-level (namespaces) |
| Performance | Overhead hyperviseur | Quasi-natif |
| Portabilité | Image lourde | Image légère, rapide |
| Cas d'usage | OS différents, isolation forte | Microservices, CI/CD |
Technologies sous-jacentes
Docker exploite les primitives Linux :
- Namespaces — Isolation PID, réseau, montages, utilisateurs, IPC
- cgroups — Limitation CPU, mémoire, I/O par conteneur
- Union FS — Layers en overlay (OverlayFS) pour les images
4. Installation & Vérification
Docker Desktop (Windows/Mac)
# Télécharger depuis docs.docker.com/get-docker/
# Installer Docker Desktop — inclut Docker Engine + CLI + Compose
# Vérifier l'installation
docker --version
# Docker version 24.0.x, build xxxxxxx
docker compose version
# Docker Compose version v2.x.x
docker info
# Détails complets du daemon : version, OS, CPUs, mémoire...
Linux (Ubuntu/Debian)
# Mise à jour apt et installation des dépendances
sudo apt-get update
sudo apt-get install ca-certificates curl
# Ajout de la clé GPG officielle Docker
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
# Ajout du dépôt Docker
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Installation
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Ajouter votre user au groupe docker (éviter sudo)
sudo usermod -aG docker $USER
newgrp docker
Premier test
docker run hello-world
# Hello from Docker!
# This message shows that your installation appears to be working correctly.
5. Premières commandes essentielles
Gérer les images
docker pull ubuntu:22.04 # Télécharger une image
docker images # Lister les images locales
docker image ls # Identique à docker images
docker image rm ubuntu:22.04 # Supprimer une image
docker image prune # Supprimer toutes les images inutilisées
Gérer les conteneurs
# Lancer un conteneur interactif
docker run -it ubuntu:22.04 bash
# Lancer en arrière-plan (detached)
docker run -d --name mon-nginx nginx
# Lister les conteneurs actifs
docker ps
# Lister tous les conteneurs (incluant arrêtés)
docker ps -a
# Arrêter / Démarrer / Supprimer
docker stop mon-nginx
docker start mon-nginx
docker rm mon-nginx
docker rm -f mon-nginx # Force stop + remove
Inspecter et déboguer
docker logs mon-nginx # Voir les logs
docker logs -f mon-nginx # Suivre les logs en temps réel
docker inspect mon-nginx # JSON détaillé de la config
docker exec -it mon-nginx bash # Shell dans le conteneur actif
docker stats # Métriques CPU/RAM en temps réel
6. Cycle de vie d'un conteneur
docker create
─────────────────────────→ [CREATED]
│ docker start
▼
[EXITED] ←────────────── [RUNNING]
│ docker stop │ docker pause
│ ▼
│ docker start [PAUSED]
└──────────────────→ │ docker unpause
▼
[RUNNING]
docker rm ↓
[DELETED]
Options importantes de docker run
docker run \
--name mon-app # Nom du conteneur
-d # Mode détaché (background)
-it # Interactif + pseudo-TTY
-p 8080:80 # Port hôte:port conteneur
-e NODE_ENV=prod # Variable d'environnement
-v /data:/app/data # Volume (bind mount)
--rm # Supprimer à l'arrêt
--restart unless-stopped # Politique de redémarrage
nginx:alpine # Image:tag
Nettoyage rapide :
docker system prune supprime tous les conteneurs
arrêtés, toutes les images non utilisées et les réseaux orphelins. Ajouter -a pour
supprimer aussi les images sans tag.