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èmeSans DockerAvec Docker
Dépendances conflictuellesPython 2 vs Python 3 sur la même machineChaque conteneur a son propre env
Déploiement reproductible"Works on my machine"Même image, même comportement partout
Isolation des servicesProcessus partagent le même OSNamespaces + cgroups isolent tout
Démarrage rapideVM : 30–60 secondesConteneur : < 1 seconde
PortabilitéConfig spécifique à l'OSTourne 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èreVMConteneur
Démarrage30–120 s< 1 s
TaillePlusieurs GoQuelques Mo
IsolationComplète (kernel dédié)Process-level (namespaces)
PerformanceOverhead hyperviseurQuasi-natif
PortabilitéImage lourdeImage légère, rapide
Cas d'usageOS différents, isolation forteMicroservices, 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.