← Retour au cours
▶ Aperçu gratuit · Leçon offerte

Leçon 1 — Docker fondamentaux : images, Dockerfile, volumes, réseaux

⏱ 30 min · 🎬 Lecon · 🏆 15 XP
🎬
Vidéo en production
Notre équipe pédagogique tourne actuellement cette leçon avec un·e formateur·rice expert·e. Le contenu textuel ci-dessous est complet et utilisable dès maintenant.

Leçon 1 — Docker fondamentaux

Comprendre les conteneurs Linux, construire des images Docker reproductibles, gérer volumes et réseaux selon les bonnes pratiques 2026.

Objectifs pédagogiques

  • Distinguer conteneur Linux et machine virtuelle (namespaces, cgroups, OverlayFS)
  • Écrire un Dockerfile optimisé (multi-stage, .dockerignore, layer caching)
  • Gérer le cycle de vie des conteneurs (run, stop, exec, logs, prune)
  • Maîtriser les volumes Docker (named, bind mounts, tmpfs)
  • Configurer les réseaux Docker (bridge, host, overlay, macvlan)

Prérequis

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).

Introduction contextuelle

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.

1. Architecture Docker

1.1 Composants

ComposantRôle
Docker Engine (dockerd)Daemon principal, écoute /var/run/docker.sock
containerdRuntime de haut niveau (CNCF)
runcRuntime OCI bas niveau (création namespace)
Docker CLIInterface utilisateur ($ docker ...)
Docker Hub / RegistryStockage et distribution d'images
OverlayFS / devicemapperStorage driver layered FS

1.2 Commandes essentielles

  • docker run -d --name nginx -p 8080:80 nginx:alpine — démarrer
  • docker ps -a — lister tous conteneurs
  • docker logs -f nginx — suivre logs
  • docker exec -it nginx /bin/sh — shell interactif
  • docker stop nginx && docker rm nginx — arrêt + suppression
  • docker system prune -a --volumes — nettoyage complet

2. Dockerfile — construire ses images

2.1 Instructions de base

FROM 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;"]

2.2 Bonnes pratiques Dockerfile 2026

  • Préférer images alpine ou distroless (5-50 MB vs 1 GB pour ubuntu)
  • Multi-stage build : séparer compilation et runtime → image finale légère
  • .dockerignore : exclure node_modules, .git, secrets
  • Pinning version : FROM nginx:1.27-alpine et non nginx:latest
  • Utilisateur non-root : USER node à la fin
  • HEALTHCHECK obligatoire pour orchestrateurs
  • Layer caching : COPY package.json AVANT COPY .
Optimisation taille : utiliser docker 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.

3. Volumes — persistance des données

TypeSyntaxeUsage
Named volume-v db_data:/var/lib/mysqlProduction, gestion par Docker
Bind mount-v $(pwd):/appDéveloppement, accès direct FS hôte
tmpfs--tmpfs /tmpDonnées temporaires en RAM
Volume readonly-v cfg:/etc/cfg:roConfig immutable

Commandes :

  • docker volume create db_data
  • docker volume inspect db_data
  • docker volume ls
  • docker run -d -v db_data:/var/lib/mysql --name db mysql:8

4. Réseaux Docker

  • bridge (défaut) : conteneurs isolés mais connectés via veth-pair
  • host : partage stack réseau hôte (perf max, mais pas d'isolation)
  • overlay : multi-hôte, base de Docker Swarm
  • macvlan : adresse MAC dédiée par conteneur
  • none : aucun réseau, isolation totale

Cré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

5. Docker Compose — intro

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).

Cas pratique — Containeriser une API Node.js

  1. Créer un projet Node.js simple : npm init -y && npm i express
  2. Ajouter app.js avec route GET /health → 200 OK
  3. Créer Dockerfile multi-stage (build + runtime)
  4. Créer .dockerignore (node_modules, .git, .env)
  5. docker build -t my-api:v1 .
  6. docker run -d -p 3000:3000 --name api my-api:v1
  7. Tester : curl http://localhost:3000/health
  8. docker logs api
  9. Vérifier taille : docker images my-api:v1 (objectif < 80 MB)

Livrable : Dockerfile commité Git, capture taille image, screenshot 200 OK curl.

Pièges fréquents :
  • docker run sans --rm ni --name → conteneurs zombies, disque saturé
  • FROM ubuntu:latest → image 1 GB+ pour héberger node app de 50 MB
  • COPY . . avant npm install → cache layer invalidé à chaque commit
  • Stocker secrets en variables d'env Dockerfile → visible dans docker inspect
  • Conteneur root par défaut → privilege escalation possible. Toujours USER node
  • Bind-mount / → conteneur a accès complet à l'hôte

Synthèse — points-clés à retenir

  • Conteneur = namespaces + cgroups + OverlayFS (pas une VM)
  • OCI normalise image-spec et runtime-spec
  • Multi-stage Dockerfile = image finale optimisée
  • Alpine ou distroless < 100 MB recommandé
  • Named volumes pour prod, bind mounts pour dev
  • Réseau bridge custom + DNS interne Docker
  • HEALTHCHECK + USER non-root + version pinning = production-ready
  • Docker Compose pour orchestration locale multi-services

Pour aller plus loin

Continuez le parcours 🚀

La leçon suivante est également gratuite. Découvrez-la sans inscription.

Leçon 2 — Continuer →
🍪 Nous utilisons des cookies essentiels et, avec ton accord, des cookies analytiques. En savoir plus

⚙️ Préférences cookies

Choisis quels cookies tu acceptes — modifiable à tout moment.

🔐 Essentiels (obligatoires)Authentification, session, sécurité. Toujours actifs.
📊 Analytics anonymesMesure d'audience anonymisée — aucune donnée personnelle.
📣 MarketingPublicités ITAG pertinentes sur d'autres sites.
💬 Contactez-nous sur WhatsApp