Comprendre les conteneurs Linux, construire des images Docker reproductibles, gérer volumes et réseaux selon les bonnes pratiques 2026.
Cette leçon suppose une connaissance basique de la ligne de commande Linux (cd, ls, cat, grep, sudo), un éditeur de texte (vim, nano, VS Code) et la notion de processus (ps, kill, top). Installation Docker Desktop (Windows/macOS) ou Docker Engine (Linux) recommandée — version Docker 26.x+ (2026).
Docker est une plateforme de conteneurisation publiée en open-source en 2013 par Solomon Hykes (dotCloud). Construite sur des primitives Linux existantes (namespaces, cgroups, OverlayFS), elle popularise la conteneurisation et change radicalement le déploiement d'applications. En 2026, plus de 90% des entreprises tech utilisent Docker en production selon le CNCF Annual Survey 2024.
La différence fondamentale avec une machine virtuelle tient à la couche d'isolation : la VM virtualise un OS complet via un hyperviseur (KVM, VMware ESXi, Hyper-V), avec un coût RAM/CPU significatif (1-2 GB minimum par VM). Le conteneur, lui, partage le noyau de l'hôte et s'isole uniquement par namespaces (PID, NET, UTS, IPC, USER, MNT) et cgroups (limitation ressources). Résultat : démarrage en millisecondes, empreinte mémoire de quelques Mo, densité 10-50x supérieure par hôte.
Cette efficacité a permis l'essor des microservices : décomposition d'une application monolithique en dizaines de services indépendants, chacun packagé dans son conteneur. Le déploiement devient reproductible (« it works on my machine » disparaît), la CI/CD s'accélère, et l'isolation sécuritaire s'améliore. Docker s'est imposé comme standard de facto, OCI (Open Container Initiative) en a normalisé les formats (image-spec, runtime-spec) en 2017.
| Composant | Rôle |
|---|---|
| Docker Engine (dockerd) | Daemon principal, écoute /var/run/docker.sock |
| containerd | Runtime de haut niveau (CNCF) |
| runc | Runtime OCI bas niveau (création namespace) |
| Docker CLI | Interface utilisateur ($ docker ...) |
| Docker Hub / Registry | Stockage et distribution d'images |
| OverlayFS / devicemapper | Storage driver layered FS |
docker run -d --name nginx -p 8080:80 nginx:alpine — démarrerdocker ps -a — lister tous conteneursdocker logs -f nginx — suivre logsdocker exec -it nginx /bin/sh — shell interactifdocker stop nginx && docker rm nginx — arrêt + suppressiondocker system prune -a --volumes — nettoyage completFROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM nginx:1.27-alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
HEALTHCHECK --interval=30s CMD wget -q -O- http://localhost/ || exit 1
CMD ["nginx", "-g", "daemon off;"]
.dockerignore : exclure node_modules, .git, secretsFROM nginx:1.27-alpine et non nginx:latestUSER node à la findocker history image:tag pour voir le poids de chaque couche. dive image:tag (https://github.com/wagoodman/dive) offre un explorateur interactif des layers. Objectif : image finale < 100 MB pour app web standard.
| Type | Syntaxe | Usage |
|---|---|---|
| Named volume | -v db_data:/var/lib/mysql | Production, gestion par Docker |
| Bind mount | -v $(pwd):/app | Développement, accès direct FS hôte |
| tmpfs | --tmpfs /tmp | Données temporaires en RAM |
| Volume readonly | -v cfg:/etc/cfg:ro | Config immutable |
Commandes :
docker volume create db_datadocker volume inspect db_datadocker volume lsdocker run -d -v db_data:/var/lib/mysql --name db mysql:8Création réseau custom :
docker network create --driver bridge --subnet 172.30.0.0/16 app_net
docker run -d --net app_net --name api nginx:alpine
docker run -d --net app_net --name db mysql:8
# Le conteneur api peut résoudre 'db' via DNS interne Docker
Pour les apps multi-conteneurs, Docker Compose orchestre via un fichier YAML déclaratif :
version: '3.9'
services:
web:
image: nginx:1.27-alpine
ports: ['8080:80']
depends_on: [api]
api:
build: ./api
environment:
DATABASE_URL: postgres://db:5432/app
depends_on: [db]
db:
image: postgres:16-alpine
volumes: ['pgdata:/var/lib/postgresql/data']
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_pw
secrets: [db_pw]
volumes:
pgdata:
secrets:
db_pw:
file: ./secrets/db_pw.txt
Démarrage : docker compose up -d ; arrêt : docker compose down -v. (Détails complets en leçon 2.)
Selon Docker Inc. : « Containers are lightweight, standalone executable packages that include everything needed to run an application — code, runtime, system tools, libraries and settings. » (docker.com, 2024).
npm init -y && npm i expressGET /health → 200 OKdocker build -t my-api:v1 .docker run -d -p 3000:3000 --name api my-api:v1curl http://localhost:3000/healthdocker logs apidocker images my-api:v1 (objectif < 80 MB)Livrable : Dockerfile commité Git, capture taille image, screenshot 200 OK curl.
docker run sans --rm ni --name → conteneurs zombies, disque saturéubuntu:latest → image 1 GB+ pour héberger node app de 50 MBnpm install → cache layer invalidé à chaque commitdocker inspectUSER node/ → conteneur a accès complet à l'hôteLa leçon suivante est également gratuite. Découvrez-la sans inscription.
Leçon 2 — Continuer →Choisis quels cookies tu acceptes — modifiable à tout moment.