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.
-
Le Client (Docker CLI) : C’est vous, dans le terminal (
docker run...). Il envoie des requêtes à l’API. -
Le Daemon (Docker Engine) : Le “cerveau” en arrière-plan. Il écoute les requêtes, construit, et lance les conteneurs.
-
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é ?
-
Le daemon a cherché l’image
hello-worlden local. -
Pas trouvée ? Il l’a téléchargée (
pull) depuis le Hub. -
Il a créé un conteneur à partir de cette image.
-
Le conteneur a exécuté son programme (afficher du texte).
-
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
exitpour 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.