1 : Architecture, Concepts et CLI

1.1. Introduction : Pourquoi Docker ?

Avant Docker, le déploiement d’applications était souvent synonyme de “l’enfer des dépendances” (Dependency Hell). Une application fonctionnait sur la machine du développeur, mais échouait en production à cause d’une version différente de bibliothèque ou d’OS.

Virtualisation vs Conteneurisation

C’est la distinction fondamentale à comprendre.

  • Machine Virtuelle (VM) : Émule un ordinateur complet (matériel). Chaque VM possède son propre Système d’Exploitation (OS) complet (Lourd, lent au démarrage).

  • Conteneur : Partage le noyau (Kernel) de l’hôte. Il n’embarque que les binaires et librairies nécessaires à l’application. (Léger, démarrage instantané).

@startuml
!theme sunlust
skinparam componentStyle rectangle

package "Virtualisation Classique (VM)" {
  [App A] - [Libs A]
  [App B] - [Libs B]
  [Guest OS A] -- [App A]
  [Guest OS B] -- [App B]
  [Hyperviseur] -- [Guest OS A]
  [Hyperviseur] -- [Guest OS B]
  [Infrastructure / Host OS] -- [Hyperviseur]
}

package "Conteneurisation (Docker)" {
  [Container A (App + Libs)] 
  [Container B (App + Libs)]
  [Docker Engine] -- [Container A (App + Libs)]
  [Docker Engine] -- [Container B (App + Libs)]
  [Infrastructure / Host OS] -- [Docker Engine]
}
@enduml

Analogie : Une VM est comme une maison individuelle (autonome mais coûteuse en terrain). Un conteneur est comme un appartement (partage les fondations et la plomberie de l’immeuble, mais l’intérieur est privé).


1.2. Architecture de Docker

Docker fonctionne sur une architecture Client-Serveur.

  1. Le Client (Docker CLI) : C’est vous, dans le terminal (docker run...). Il envoie des requêtes à l’API.

  2. Le Daemon (Docker Engine) : Le “cerveau” en arrière-plan. Il écoute les requêtes, construit, et lance les conteneurs.

  3. Le Registry (Docker Hub) : L’entrepôt mondial où sont stockées les images.

@startuml
!theme sunlust
actor User
participant "Client CLI" as CLI
participant "Docker Daemon" as Daemon
database "Docker Hub" as Registry

User -> CLI : docker run nginx
CLI -> Daemon : Demande de lancement "nginx"
Daemon -> Daemon : Cherche l'image localement
alt Image non trouvée
    Daemon -> Registry : Pull image "nginx"
    Registry -> Daemon : Téléchargement...
end
Daemon -> Daemon : Création du conteneur
Daemon -> CLI : Retourne l'ID du conteneur
@enduml

1.3. Premiers pas et Concepts Clés

Image vs Conteneur

C’est la confusion la plus courante.

  • Image : Le modèle inerte, en lecture seule. (Le “Moule” ou la “Classe” en POO).

  • Conteneur : L’instance vivante de l’image. (Le “Gâteau” ou l'”Objet” en POO).

La commande rituelle

docker run hello-world

Que s’est-il passé ?

  1. Le daemon a cherché l’image hello-world en local.

  2. Pas trouvée ? Il l’a téléchargée (pull) depuis le Hub.

  3. Il a créé un conteneur à partir de cette image.

  4. Le conteneur a exécuté son programme (afficher du texte).

  5. Le programme fini, le conteneur s’est arrêté (mais existe encore !).


1.4. Le Cycle de vie (Commandes de base)

Maîtriser ces commandes est essentiel avant de passer à l’automatisation.

Démarrer un service

Pour lancer un serveur web (Nginx) en arrière-plan :

# -d : Detached mode (arrière-plan)
# -p : Port mapping (Hôte:Conteneur) -> Je tape sur 8080, ça arrive sur 80 dans le conteneur
# --name : Donner un petit nom sympa
docker run -d -p 8080:80 --name mon-serveur nginx

Accédez maintenant à http://localhost:8080.

Observer

# Voir les conteneurs ACTIFS
docker ps

# Voir TOUS les conteneurs (même les arrêtés)
docker ps -a

Arrêter et Supprimer

Un conteneur est jetable. On ne le “met pas à jour”, on le jette et on en recrée un neuf.

docker stop mon-serveur    # Arrêt propre (SIGTERM)
docker kill mon-serveur    # Arrêt brutal (si bloqué)
docker rm mon-serveur      # Suppression du conteneur (doit être stoppé avant)
docker rm -f mon-serveur   # Force delete (Stop + Rm)

1.5. Inspection et Debugging

C’est ici que vous passerez 50% de votre temps au début : comprendre pourquoi ça ne marche pas.

Lire les logs (Le journal de bord)

Si votre conteneur plante au démarrage, la réponse est ici.

docker logs mon-serveur
docker logs -f mon-serveur  # -f pour "follow" (suivre en direct)

Rentrer dans la matrice (exec)

Parfois, il faut aller voir les fichiers à l’intérieur.

# -it : Interactive TTY (simule un terminal)
# bash (ou sh) : La commande qu'on veut lancer dedans
docker exec -it mon-serveur bash

Note : Une fois dedans, vous êtes root dans le conteneur. Tapez exit pour sortir.

Tout savoir (inspect)

Pour récupérer l’IP interne, les volumes montés ou les variables d’environnement.

docker inspect mon-serveur

1.6. La Persistance des Données (Intro)

Par défaut, les données dans un conteneur sont éphémères. Si vous supprimez le conteneur (docker rm), les fichiers créés dedans sont perdus.

Pour garder les données (Base de données, logs), on utilise des Volumes.

Bind Mount (Le plus simple pour le dev)

On mappe un dossier de notre ordinateur vers l’intérieur du conteneur.

# Je lie le dossier "site-web" courant ($PWD) vers le dossier html de nginx
docker run -d -p 8080:80 -v $PWD/site-web:/usr/share/nginx/html nginx

Si vous modifiez un fichier index.html sur votre PC, il change instantanément dans le conteneur.


1.7. Gestion des Images

Tout comme les conteneurs, les images s’accumulent vite. Il est important de savoir les gérer.

Lister les images

Pour voir la liste des images téléchargées localement, leur taille et leur ID :

docker images

Télécharger une image (Pull)

Si vous voulez juste récupérer une image sans lancer de conteneur tout de suite (pour préparer le terrain) :

docker pull nginx:latest

Supprimer une image (rmi)

Pour libérer de l’espace disque.

# Supprimer par nom
docker rmi nginx

# Supprimer par Image ID (les 3 premiers caractères suffisent souvent)
docker rmi a87

Attention : Docker refusera de supprimer une image si un conteneur (même arrêté) l’utilise encore. Il faut d’abord supprimer le conteneur.

Nettoyage (prune)

La commande radicale pour supprimer toutes les images “orphelines” (dangling) qui ne servent plus :

docker image prune

1.8. Activité Ludique : “Le Cluedocker”

Transition : Vous connaissez maintenant les outils d’inspection (logs, inspect, exec). Il est temps de les utiliser pour résoudre un crime numérique.