Aller au contenu
TAAF-OPS --:-- UTC

Docker — conteneurs, images et ce qu'on peut en faire

Un conteneur est un processus isolé, pas une machine virtuelle. Il partage le noyau du système hôte, mais vit dans son propre monde : son système de fichiers, son réseau, ses limites de ressources. Là où une VM embarque un OS complet (des Go, des minutes de démarrage), un conteneur embarque uniquement l’application et ses dépendances (des Mo, des millisecondes).

Machine virtuelle (Vagrant)Conteneur (Docker)
IsoleUn OS complet avec son noyauUn processus sur le noyau de l’hôte
PoidsGoMo
DémarrageMinutesMillisecondes
Bon pourSimuler des machines (un parc, un réseau)Empaqueter des applications

Les deux se complètent : dans les TP, Vagrant fabrique les machines, Docker fait tourner les services dans ces machines.

L’isolation repose sur deux mécanismes du noyau Linux — les namespaces (chaque conteneur voit ses propres processus, son propre réseau, ses propres utilisateurs) et les cgroups (limites CPU/RAM). Retenez la conséquence sécurité : un conteneur n’est pas une frontière aussi solide qu’une VM — le noyau est partagé, le durcissement reste nécessaire (utilisateur non-root, capabilities réduites, image minimale).

2. Image, conteneur, registre — le vocabulaire qui suffit

Section intitulée « 2. Image, conteneur, registre — le vocabulaire qui suffit »
TermeC’est…Analogie
ImageLe paquet figé : système de fichiers + métadonnées, construit en couchesLa classe
ConteneurUne instance en cours d’exécution d’une imageL’objet
DockerfileLa recette texte qui construit l’imageLe code source de l’image
RegistreLe serveur qui stocke et distribue les images (Docker Hub, GitLab Registry)Le dépôt de paquets
# Une application 12-factor se conteneurise en quelques lignes :
FROM node:22-alpine # partir d'une image de base minimale
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev # facteur II : dépendances déclarées, installées au build
COPY . .
USER node # durcissement : jamais root si le process n'en a pas besoin
EXPOSE 3000 # facteur VII : l'application expose son port
CMD ["node", "server.js"]

Chaque instruction crée une couche mise en cache : ne changez que votre code, et seule la couche COPY . . se reconstruit. C’est ce qui rend les builds rapides — et c’est pour ça que l’ordre des instructions (le stable d’abord, le volatil ensuite) n’est pas cosmétique.

3. Compose — décrire plusieurs services ensemble

Section intitulée « 3. Compose — décrire plusieurs services ensemble »

Une application réelle, c’est rarement un conteneur : c’est une API plus sa base plus son cache. docker-compose.yml décrit l’ensemble — services, réseaux, volumes — dans un fichier versionné, et docker compose up -d monte le tout.

services:
api:
build: .
ports: ["8000:8000"]
environment:
DATABASE_URL: postgresql://app:app@db:5432/app # facteur III et IV
depends_on: [db]
db:
image: postgres:16
volumes:
- db-data:/var/lib/postgresql/data # l'état vit dans un volume, pas dans le conteneur
volumes:
db-data:

Trois idées à retenir :

  • Le fichier EST la documentation de l’architecture — même vertu que le Vagrantfile.
  • Les services se joignent par leur nom (db:5432) : Compose crée un réseau et son DNS.
  • Les conteneurs sont jetables (facteur IX), les volumes ne le sont pas : tout ce qui doit survivre à un docker compose down vit dans un volume nommé.
UsageCe que Docker apporteExemple dans la formation
Poste de devLe service tourne pareil chez toute la promo, sans rien installer sur l’hôteLa stack Postgres + Redis d’un TP
Environnements jetablesMonter/détruire un service en secondes pour un essaiTester une version de Grafana sans rien casser
CIChaque job tourne dans une image propre et reproductibleLes runners GitLab — cf. CI/CD
DéploiementLa même image du build à la prod (facteur V)Dokploy, GitOps
ExploitationLogs, métriques et cycle de vie uniformes quel que soit le langageDockhand pour piloter tout ça
Fenêtre de terminal
docker ps # ce qui tourne
docker logs -f <conteneur> # suivre les logs
docker exec -it <conteneur> sh # entrer dans le conteneur
docker compose up -d # monter la stack du dossier courant
docker compose down # la démonter (les volumes survivent)
docker system df # qui mange mon disque ?