Outils pour utilisateurs

Outils du site


informatique:docker

Table des matières

Docker

Date de création : 2025/11/23 00:06

 

MODULE 1 — INTRODUCTION À DOCKER

1.0 Présentation générale

Docker est une plateforme de virtualisation légère basée sur les conteneurs. Son objectif principal est de permettre d'embarquer une application, ses dépendances, sa configuration et son environnement dans un paquet isolé, reproductible et portable : le conteneur.

Docker résout les problèmes majeurs rencontrés dans les environnements de développement et de production :

  • « Chez moi ça marche, chez toi non »
  • Conflits de versions entre bibliothèques
  • Déploiements manuels longs et risqués
  • Différences entre serveurs (OS, configurations, dépendances)

Docker garantit que le même code fonctionne exactement de la même manière partout.


1.1 Historique rapide

  • 2013 : Docker, Inc. publie la première version open-source.
  • Docker popularise l’usage des namespaces et cgroups du noyau Linux.
  • 2014–2020 : adoption massive et industrialisation DevOps.
  • Aujourd’hui : Docker est le standard mondial de la conteneurisation.

1.2 Concepts clés à connaître

IMAGE

Un modèle immuable contenant l’environnement complet nécessaire à une application.

CONTENEUR

Une instance vivante d’une image, équivalente à un processus isolé.

DOCKER ENGINE

Le moteur responsable des images, conteneurs, réseaux et volumes.

REGISTRY

Dépôt d’images (Docker Hub, GitHub Container Registry…).


1.3 Pourquoi Docker ?

  • Portabilité totale
  • Performances élevées
  • Isolation forte
  • Standardisation
  • Déploiement rapide
  • Scalabilité microservices
  • Réduction des coûts

1.4 Différences Docker vs Machine Virtuelle

Caractéristique Docker VM
Démarrage <1 sec 30 sec à plusieurs minutes
RAM Faible Élevée
Isolation Processus OS complet
Taille Mo / centaines de Mo Go
Performances Natives Réduites
Migration Très simple Complexe

Schéma :

      MACHINE VIRTUELLE                          CONTENEUR

+—————————+ +——————————–+

Application Application

+—————————+ +——————————–+

Bibliothèques de l'app Bibliothèques de l'app

+—————————+ +——————————–+

OS COMPLET (Ubuntu…) LIBRAIRIES SYSTÈME MINIMALES

+—————————+ +——————————–+

Hyperviseur (VMWare…) Noyau de l'hôte partagé

+—————————+ +——————————–+

Matériel physique Matériel physique

+—————————+ +——————————–+


1.5 Installation Docker

macOS

brew install –cask docker

Linux

sudo apt update sudo apt install docker.io -y sudo systemctl enable –now docker

Windows

Installation via Docker Desktop Windows (WSL2 requis).


1.6 Vérification de l’installation

docker version docker run hello-world


1.7 Premier vrai conteneur : Nginx

docker run -d -p 8080:80 –name monnginx nginx

Tester sur : http://localhost:8080


1.8 Cycle de vie d’un conteneur

docker stop docker start docker rm docker logs docker exec

Schéma : docker run → création → exécution → arrêt → suppression


1.9 Exercices pratiques

Exercice 1

Tester installation avec hello-world.

Exercice 2

Lancer Nginx et afficher la page depuis navigateur.

Exercice 3

Explorer un conteneur via : docker exec -it <id> sh


1.10 Résumé du Module 1

  • Docker = conteneurisation légère
  • Un conteneur = une instance isolée
  • Une image = un template immuable
  • Avantages : portabilité, rapidité, simplicité
  • Nginx permet un premier test concret

MODULE 2 — ARCHITECTURE DOCKER (VERSION ULTRA COMPLÈTE)

2.0 Objectif du module

Comprendre en profondeur le fonctionnement interne de Docker :

  • Docker CLI
  • Docker Daemon (dockerd)
  • Images & layers
  • Conteneurs & file systems copy-on-write
  • Cgroups & Namespaces
  • Storage drivers (overlay2…)
  • Registries
  • Interaction complète entre les composants

Ce module développe chaque concept avec des schémas, explications détaillées et exercices pratiques.


2.1 Vue d'ensemble de l’architecture

Schéma conceptuel :

[ Docker CLI ] → (API HTTP) → [ Docker Daemon ]

                        ↓
                 [ Images / Layers ]
                        ↓
                  [ Containers ]
                        ↓
                 [ Registries ]

Docker est construit autour d’une architecture client/serveur.

Docker CLI

L’outil en ligne de commande utilisé par l’utilisateur :

  • docker run
  • docker build
  • docker ps
  • docker logs
  • docker network …

Il ne fait que transmettre des commandes au daemon via une API REST.

Docker Daemon (dockerd)

Le cœur de Docker. Il gère :

  • création et exécution de conteneurs
  • téléchargement et construction d’images
  • gestion des réseaux
  • volumes
  • sécurité
  • stockage

Tout passe par le daemon.


2.2 Les images Docker

Une image est un ensemble de couches immuables (layers). Chaque instruction Dockerfile produit une nouvelle couche.

Structure :

  • Layer 5 — CMD / ENTRYPOINT
  • Layer 4 — Code source
  • Layer 3 — Dépendances
  • Layer 2 — Paquets système supplémentaires
  • Layer 1 — Base OS (alpine, debian, python:slim…)

Caractéristiques clés

  • immuable
  • versionnable
  • portable
  • optimisée via un cache

Commande pour voir les layers :

docker history nginx


2.3 Le système de fichiers Copy-On-Write

Docker utilise un mécanisme CoW (copy-on-write).

Schéma :

IMAGE (read-only)

 ▲ layers immuables
 |

CONTAINER (read-write)

Lorsqu’un fichier est modifié dans le conteneur :

1. Docker copie le fichier dans la couche RW du conteneur.
2. La modification s'applique uniquement au conteneur.

Cela rend les conteneurs légers et rapides.


2.4 Les conteneurs

Un conteneur est :

  • une instance d’une image
  • un processus isolé
  • un système de fichiers minimal
  • un ensemble d’espaces d’exécution indépendants

Cycle de vie :

docker create docker start docker stop docker restart docker kill docker rm

Commande pour inspecter un conteneur :

docker inspect mon_container


2.5 Namespaces Linux

Les namespaces fournissent l’isolation au niveau du noyau. Chaque conteneur a son propre ensemble de namespaces.

Types de namespaces

  • PID — processus
  • NET — réseau
  • MNT — systèmes de fichiers
  • IPC — communications inter-processus
  • UTS — hostname
  • USER — utilisateurs
  • CGROUP — ressources

Schéma :

[ Host OS ] ├─ Namespace A → Container 1 ├─ Namespace B → Container 2 └─ Namespace C → Container 3


2.6 Cgroups (control groups)

Les cgroups limitent les ressources :

  • CPU
  • RAM
  • I/O disque
  • Réseau

Exemples :

docker run –memory=“512m” nginx docker run –cpus=“1.5” nginx

On peut donc isoler les ressources de chaque conteneur.


2.7 Storage drivers

Les drivers gèrent le système de fichiers interne des conteneurs.

Principaux drivers

  • overlay2 (recommandé)
  • aufs (ancien)
  • btrfs
  • zfs

Vérification du driver utilisé

docker info | grep Storage

Sous Linux (Ubuntu), Docker utilise overlay2.


2.8 Registries

Les registres stockent les images Docker.

Types

  • Docker Hub (public)
  • GitHub Container Registry
  • GitLab Registry
  • Azure Container Registry
  • Registres privés auto-hébergés

Commandes

docker pull nginx docker push johnben/monimage:1.0 docker login


2.9 Interaction CLI ↔ Daemon ↔ Conteneur

docker run nginx
  ↓
Docker CLI → API HTTP UNIX socket → Docker Daemon
  ↓
Daemon vérifie si l’image existe
  ↓
Image présente ? sinon → téléchargement
  ↓
Création du conteneur (RW layer)
  ↓
Lancement du processus principal (ENTRYPOINT/CMD)

2.10 Les logs du daemon

Sous Linux :

journalctl -u docker

Sous macOS : Docker Desktop → menu → Troubleshoot → logs


2.11 Exercices pratiques

Exercice 1 — Explorer une image

1. Télécharger nginx :

docker pull nginx

2. Inspecter ses layers :

docker history nginx

3. Inspecter l’image :

docker inspect nginx

Exercice 2 — Comprendre un conteneur

1. Lancer nginx :

docker run -d --name test-nginx nginx

2. Inspecter le conteneur :

docker inspect test-nginx

3. Analyser :

  • GraphDriver (overlay2)
  • NetworkSettings
  • HostConfig (cgroups)

Exercice 3 — Observer les namespaces

Depuis le conteneur :

docker exec -it test-nginx sh
Tester :
ps aux
hostname

2.12 Résumé du module 2

  • Docker CLI = interface utilisateur
  • Docker Daemon = moteur principal
  • Images = layers immuables
  • Conteneurs = instances isolées
  • Namespaces = isolation
  • Cgroups = contrôle des ressources
  • Overlay2 = système de fichiers CoW moderne
  • Registries = stockage des images
  • docker inspect = commande la plus puissante pour tout comprendre

MODULE 3 — IMAGES DOCKER & DOCKERFILE (VERSION ULTRA COMPLÈTE)

3.0 Objectif du module

Comprendre en profondeur :

  • la structure interne d’une image Docker
  • les layers et le mécanisme de cache
  • les bonnes pratiques modernes d’écriture d’un Dockerfile
  • l’optimisation (taille, sécurité, vitesse)
  • les multi-stage builds
  • les commandes avancées d’inspection d’image
  • les erreurs courantes
  • un atelier pratique complet

Ce module est fondamental pour produire des images professionnelles, propres et performantes.


3.1 Qu’est-ce qu’une image Docker ?

Une image est un ensemble immuable de couches (layers) représentant :

  • un OS minimal
  • des paquets système
  • des outils nécessaires
  • le code de votre application
  • les configurations finales (CMD/ENTRYPOINT)

Schéma structurel :

  • Layer 6 — CMD / ENTRYPOINT
  • Layer 5 — Application
  • Layer 4 — Dépendances applicatives
  • Layer 3 — Dépendances système
  • Layer 2 — Config système
  • Layer 1 — OS minimal (alpine, debian-slim…)

Les images sont read-only, les conteneurs ajoutent une couche RW.


3.2 Les Layers (couches)

Chaque instruction Dockerfile crée une couche :

  • FROM = nouvelle base
  • RUN = nouvelle couche
  • COPY = nouvelle couche
  • ADD = nouvelle couche
  • ENV = met à jour les métadonnées
  • CMD/ENTRYPOINT = pas une couche de fichiers, mais une couche de configuration

Commande :

  • docker history <image>

Analyse typique :

  • IMAGE CREATED BY SIZE
  • <id> CMD [“npm” “start”] 0B
  • <id> COPY . . 34kB
  • <id> RUN npm ci 55MB
  • <id> COPY package*.json . 1kB
  • <id> FROM node:20-alpine 7MB

3.3 Le cache Docker

Docker optimise fortement le build avec un cache basé sur les layers.

Principe

Si une instruction ne change pas, Docker réutilise le layer précédent → gain massif de temps.

Exemple :

COPY package*.json ./
RUN npm install
COPY . .

→ modifier seulement les fichiers sources n’invalide pas npm install.

Bonnes pratiques cache

  • mettre COPY package.json AVANT COPY .
  • grouper les RUN quand ils sont liés
  • éviter ADD (inefficace)
  • ne jamais copier tout le répertoire avant installation des dépendances

3.4 Le Dockerfile : syntaxe complète et moderne

Structure générale recommandée 2025 :

FROM ...
WORKDIR ...
COPY ... ...
RUN ...
COPY ... ...
EXPOSE ...
USER ...
ENTRYPOINT ...
CMD ...

3.5 Analyse détaillée de chaque instruction

FROM

Définit l’image de base. Exemples :

FROM node:20-alpine FROM python:3.12-slim FROM ubuntu:22.04

Meilleures pratiques :

  • toujours utiliser une base slim ou alpine
  • éviter ubuntu/debian pour les petits services
  • versionner TOUTES les images (pas de latest)

WORKDIR

Définit le répertoire de travail.

WORKDIR /app

Avantages :

  • évite les chemins relatifs
  • plus propre et lisible

COPY

Copie des fichiers dans l’image.

COPY . . COPY src/ /app/src/ COPY package*.json ./

Points importants :

  • l’ordre des COPY influence le cache
  • COPY est plus sûr que ADD

RUN

Exécute des commandes lors du build.

RUN apt update && apt install -y curl

Bonnes pratiques :

  • utiliser && pour réduire le nombre de layers
  • nettoyer les caches apt
  • ne pas mettre plusieurs RUN inutiles

ENV

Définit une variable d’environnement dans l’image.

ENV NODE_ENV=production


ENTRYPOINT vs CMD

CMD

Commande utilisée par défaut si aucune autre n’est fournie.

CMD [“npm”, “start”]

ENTRYPOINT

Commande forcée, non écrasable.

ENTRYPOINT [“python”] CMD [“app.py”]

Exécution : → python app.py


3.6 Multi-Stage Builds (professionnel)

Objectif :

  • réduire drastiquement la taille de l’image finale
  • éliminer les dépendances nécessaires uniquement au build

Exemple Node.js :

FROM node:20-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci –only=production COPY . .

FROM node:20-alpine AS runtime WORKDIR /app COPY –from=build /app . CMD [“node”, “server.js”]

Avantages :

  • sécurité accrue
  • rapidité
  • image finale très légère

3.7 Sécurité des images

Bonnes pratiques 2025 :

  • ne jamais exécuter en root :

RUN adduser -D appuser

  USER appuser
  
* limiter les outils installés
* scanner les images :
  
  docker scan monimage
  
* utiliser des bases officielles minimalistes (alpine, slim, distroless)

3.8 Optimisation des images

Réduire la taille

  • utiliser alpine (musl)
  • utiliser slim (glibc)
  • multi-stage
  • nettoyer les caches :

RUN rm -rf /var/lib/apt/lists/*

Optimiser le build

  • structurer le Dockerfile autour du cache
  • éviter COPY . trop tôt

3.9 Inspection avancée d’une image

Inspecter métadonnées

docker inspect monimage

Voir les layers

docker history monimage

Explorer le contenu

docker run --rm -it monimage sh

3.10 Erreurs courantes

  • oublier .dockerignore → image énorme
  • mettre COPY . . avant COPY package.json
  • utiliser latest → builds non reproductibles
  • RUN multiple non optimisés
  • permissions root dangereuses
  • images trop grosses → déploiements lents

Exemple de .dockerignore recommandé :

node_modules
.git
.gitignore
Dockerfile
docker-compose.yml
dist
.env


3.11 Atelier pratique : construire une vraie image

Étapes :

1. Créer un répertoire

mkdir docker-app cd docker-app

2. Ajouter un fichier app.py

print(“Hello Johnny, Docker fonctionne en version ultra !”)

3. Créer un Dockerfile

FROM python:3.12-slim WORKDIR /app COPY . . CMD [“python”, “app.py”]

4. Builder l’image

docker build -t monpython:1.0 .

5. Lancer l’image

docker run monpython:1.0

Résultat attendu

Hello Johnny, Docker fonctionne en version ultra !


3.12 Résumé du module

  • Les images sont immuables et organisées en layers
  • Le cache Docker améliore massivement la vitesse de build
  • Le Dockerfile est le cœur de la création d’images
  • Multi-stage builds = standard moderne 2025
  • Optimisation = sécurité + rapidité + légèreté
  • docker history / docker inspect = outils essentiels
  • .dockerignore impératif

Le module 3 est crucial pour produire des images propres, rapides, petites et adaptées à la production.

MODULE 4 — LES CONTENEURS DOCKER (VERSION ULTRA COMPLÈTE)

4.0 Objectif du module

Ce module couvre en profondeur :

  • le cycle de vie complet d’un conteneur
  • les commandes essentielles et avancées
  • la gestion des processus internes
  • l’inspection, le debugging et le monitoring
  • la gestion des logs
  • la connexion interactive (shell)
  • le mapping des ports et des systèmes de fichiers
  • les redémarrages et les politiques de restart
  • les erreurs courantes
  • les exercices pratiques professionnels

4.1 Qu’est-ce qu’un conteneur ?

Un conteneur est une instance vivante d’une image Docker. Il représente :

  • un processus isolé
  • possédant son propre système de fichiers (layer RW)
  • son propre espace réseau (namespace)
  • ses propres ressources (cgroups)
  • ses propres variables d’environnement

Schéma :

IMAGE (read-only layers)

      │
      ▼

CONTAINER (read-write layer)

      │
      ▼

Processus principal (ENTRYPOINT/CMD)

Un conteneur vit tant que SON PROCESSUS PRINCIPAL est en vie.


4.2 Cycle de vie complet d’un conteneur

  • docker create → crée un conteneur (pas lancé)
  • docker start → démarre un conteneur arrêté
  • docker run → create + start
  • docker stop → arrêt propre (SIGTERM → SIGKILL)
  • docker kill → arrêt brutal (SIGKILL immédiat)
  • docker restart → stop + start
  • docker pause → suspend les processus
  • docker unpause → reprise
  • docker rm → supprime un conteneur
  • docker rm -f → supprime même s’il tourne

Commandes de base :

  • docker run nginx
  • docker stop nginx
  • docker rm nginx

4.3 Les états possibles d’un conteneur

Les états visibles via :

docker ps -a

États courants :

  • Up : en cours d’exécution
  • Exited (0) : terminé normalement
  • Exited (1) : erreur
  • Created : créé mais pas démarré
  • Paused : suspendu
  • Restarting : en boucle de redémarrage

4.4 Lancement d’un conteneur : options indispensables

Détaché (-d)

docker run -d nginx

Nom personnalisé (--name)

docker run –name web nginx

Ports (-p)

Mapping :

-p HOST:CONTAINER

Exemple :

docker run -d -p 8080:80 nginx

http://localhost:8080

Variables d’environnement (-e)

docker run -e APP_ENV=prod monapp

Mode interactif (-it)

docker run -it ubuntu bash

Volume (-v)

docker run -v /host/data:/container/data nginx

4.5 Les politiques de redémarrage

Docker peut redémarrer automatiquement un conteneur.

  --restart=no           (par défaut)
  --restart=on-failure   (si process error)
  --restart=always       (toujours)
  --restart=unless-stopped

Exemple :

docker run --restart=always myservice

Très utilisé en production hors orchestrateur.


4.6 Inspecter un conteneur

Métadonnées complètes

docker inspect moncontainer

Parties importantes :

  • HostConfig → cgroups, volumes, ports
  • NetworkSettings → IP du conteneur
  • GraphDriver → overlay2
  • Config.Env → variables

Obtenir uniquement l’IP

docker inspect -f 'networksettings.ipaddress' moncontainer


4.7 Voir les logs

docker logs moncontainer docker logs -f moncontainer

Options utiles :

  • -f → suivre en temps réel
  • –tail 100 → n'affiche que 100 lignes

4.8 Exécuter une commande dans un conteneur

Shell interactif

docker exec -it moncontainer bash

ou si bash n’existe pas :

docker exec -it moncontainer sh

Exécuter une commande simple

docker exec moncontainer ls -la

4.9 Processus internes d’un conteneur

Chaque conteneur n’a qu’un seul processus principal.

Vérifier :

docker top moncontainer

Dans un OS classique :

ps aux


4.10 Stopping : comment Docker arrête un conteneur

docker stop envoie :

1. SIGTERM (arrêt propre)
2. après 10 secondes → SIGKILL (forcé)

Changer le délai :

docker stop --time=3 moncontainer

4.11 Mapping des ports

Schéma :

HOST : 8080 → CONTAINER : 80

Commande :

docker run -p 8080:80 nginx

Lister les ports :

docker port moncontainer


4.12 Gestion des fichiers dans un conteneur

Le conteneur a son propre système :

docker exec -it moncontainer sh ls -la

Pour copier un fichier :

docker cp fichier.txt moncontainer:/tmp/ docker cp moncontainer:/etc/nginx/nginx.conf .


4.13 Nettoyage des conteneurs

docker rm id docker rm -f id docker container prune docker system prune


4.14 Erreurs courantes

  • container keeps restarting

→ mauvais CMD / erreur au démarrage

  
  docker logs
  
  • ports already in use

→ le port hôte est occupé

  • cannot exec: container not running

→ conteneur arrêté, vérifier avec docker ps -a

  • permission denied

→ volumes ou fichiers hôte non accessibles


4.15 Atelier pratique complet

1. Lancer un conteneur Nginx

docker run -d -p 8080:80 –name demo-nginx nginx

2. Explorer le conteneur

docker exec -it demo-nginx sh

3. Voir les logs

docker logs -f demo-nginx

4. Copier un fichier de configuration

docker cp demo-nginx:/etc/nginx/nginx.conf .

5. Redémarrer

docker restart demo-nginx

6. Supprimer

docker rm -f demo-nginx


4.16 Résumé du module 4

  • Un conteneur est une instance isolée et vivante d’une image
  • Commande clé : docker run (create + start)
  • docker exec permet d’entrer dans un conteneur
  • docker logs pour diagnostiquer
  • Les ports, volumes et variables sont essentiels
  • docker inspect révèle tout le fonctionnement interne
  • Les restart policies sont fondamentales pour la production
  • Les erreurs courantes sont faciles à corriger avec les bonnes commandes

Ce module donne toutes les bases nécessaires pour maîtriser les conteneurs de manière professionnelle.

MODULE 5 — VOLUMES & PERSISTANCE DOCKER (VERSION ULTRA COMPLÈTE)

5.0 Objectif du module

Ce module ultra complet couvre :

  • la persistance des données dans Docker
  • les différents types de volumes
  • les bind mounts vs volumes Docker
  • le fonctionnement interne du stockage
  • la gestion des permissions
  • les bonnes pratiques 2025
  • les commandes avancées : inspect, prune, backup
  • un atelier complet avec exercices + CORRIGÉS

Ce module est essentiel pour les bases de données, les CMS (WordPress), les APIs persistant des données, etc.


5.1 Pourquoi la persistance est indispensable ?

Par défaut, un conteneur Docker :

  • possède son propre système de fichiers isolé
  • qu’il PERD entièrement si le conteneur est supprimé

Donc sans volume :

  • une base MySQL perd tout
  • un WordPress perd ses uploads
  • une API perd ses fichiers

Il faut donc des volumes persistants.


5.2 Les 3 types de stockage dans Docker

Type Description Persistance Usage recommandé
Anonymous volumes créés automatiquement Oui cas rares
Named volumes gérés par Docker Oui base de données
Bind mounts mapping d’un dossier hôte Oui développement local

5.3 Les volumes nommés (Named Volumes)

Création :

docker volume create data-mysql

Utilisation :

docker run -d -v data-mysql:/var/lib/mysql mysql:8

Lister :

docker volume ls

Inspecter :

docker volume inspect data-mysql

Avantages :

  • totalement géré par Docker
  • portable
  • indépendant de l'hôte
  • parfait pour MySQL, PostgreSQL, MongoDB, Redis

5.4 Bind Mounts

Syntaxe :

-v /chemin/hote:/chemin/conteneur

Exemple :

docker run -d -v /home/johnny/site:/var/www/html php:8.2-apache

Avantages :

  • idéal en développement
  • permet d’éditer les fichiers en temps réel

Inconvénients :

  • dépend du système hôte
  • moins portable

5.5 Où Docker stocke les volumes ?

Sous Linux :

/var/lib/docker/volumes/

Sous macOS et Windows (Docker Desktop) : Stockés dans un disque virtuel interne.


5.6 Inspecter le contenu d’un volume

Depuis un conteneur temporaire :

docker run –rm -it -v data-mysql:/data alpine sh

Puis dans le conteneur :

ls -la /data


5.7 Permissions et utilisateurs

Dans un volume, les permissions dépendent du conteneur, pas de l’hôte (sauf bind mount).

Corriger une permission avec alpine :

docker run –rm -v data:/data alpine chown -R 1000:1000 /data


5.8 Sauvegarde d’un volume

Création d’une archive :

docker run –rm -v data-mysql:/source -v /backup:/backup alpine tar czvf /backup/mysql.tar.gz /source

Restauration :

docker run –rm -v data-mysql:/dest -v /backup:/backup alpine tar xzvf /backup/mysql.tar.gz -C /dest –strip 1


5.9 Suppression des volumes

Supprimer un volume spécifique :

docker volume rm data-mysql

Supprimer les volumes inutilisés :

docker volume prune


5.10 Bonnes pratiques 2025

  • toujours nommer ses volumes
  • utiliser bind mounts uniquement en dev
  • ne jamais stocker des données dans le conteneur
  • éviter les chemins relatifs
  • pour bases SQL → toujours volume dédié
  • versionner le dossier backup, pas le volume

5.11 Atelier pratique complet (avec CORRIGÉS)

EXERCICE 1 : Persister MySQL

Objectif :

  • lancer MySQL
  • vérifier la persistance
  • supprimer le conteneur
  • vérifier que les données existent encore

Commandes à exécuter :

docker volume create mysql-data docker run -d –name mydb -e MYSQL_ROOT_PASSWORD=1234 -v mysql-data:/var/lib/mysql mysql:8

Ajouter une table :

docker exec -it mydb mysql -u root -p1234 -e “CREATE DATABASE test;” docker exec -it mydb mysql -u root -p1234 -e “USE test; CREATE TABLE demo(id INT);”

Supprimer le conteneur :

docker rm -f mydb

CORRIGÉ

Vérification :

docker run –rm -it -v mysql-data:/data alpine ls -la /data

les fichiers .ibd et .frm sont présents → la base est bien persistée


EXERCICE 2 : Comprendre bind vs volume

Création bind mount :

mkdir ~/monapp echo “hello” > ~/monapp/test.txt

docker run –rm -it -v ~/monapp:/data alpine sh

Dans alpine :

cat /data/test.txt

MODIFIER depuis le conteneur :

echo “modifié” > /data/test.txt

Quitter, puis vérifier côté hôte :

cat ~/monapp/test.txt

CORRIGÉ

→ Le fichier local a été modifié → preuve que bind mount = partage natif


EXERCICE 3 : Sauvegarder un volume

Créer un volume :

docker volume create testdata

Ajouter des fichiers :

docker run –rm -v testdata:/data alpine sh -c “echo 'Johnny' > /data/name.txt”

Sauver :

mkdir ~/backup docker run –rm -v testdata:/source -v ~/backup:/backup alpine tar czvf /backup/archive.tar.gz /source

CORRIGÉ

Fichier créé :

ls -la ~/backup/archive.tar.gz

→ archive présente → backup réussi


5.12 Résumé du module 5

  • Docker perd les données sans volume
  • Volumes nommés = standard pour la production
  • Bind mounts = parfaits pour le développement
  • Les volumes sont indépendants du cycle de vie des conteneurs
  • docker inspect permet de comprendre la structure
  • Savoir faire un backup / restore est indispensable
  • Ce module est clé pour tout service nécessitant des données (SQL, NoSQL, uploads, logs)

MODULE 6 — RÉSEAU DOCKER (VERSION ULTRA COMPLÈTE)

6.0 Objectif du module

Ce module ultra complet couvre :

  • le fonctionnement réseau interne de Docker
  • les types de réseaux Docker (bridge, host, none)
  • les réseaux personnalisés
  • la résolution DNS interne entre conteneurs
  • l’isolation réseau et les namespaces
  • les ports, NAT et iptables
  • les drivers réseau avancés (overlay, macvlan)
  • Docker Compose et les réseaux
  • les outils de diagnostic réseau
  • les exercices pratiques AVEC réponses

Ce module est essentiel pour comprendre comment les conteneurs communiquent.


6.1 Introduction au réseau Docker

Lorsqu’un conteneur Docker est lancé, Docker lui attribue :

  • une interface réseau virtuelle
  • une adresse IP interne
  • un namespace réseau isolé
  • un accès éventuel au réseau hôte selon configuration

Schéma général :

[Host Network]

[Docker Engine]

[Bridge Network] — Conteneurs isolés + IP internes

Chaque conteneur vit dans un namespace réseau isolé.


6.2 Les drivers réseau disponibles

Type Description Usage
bridge par défaut, réseau isolé en NAT usage général
host partage le réseau du host performance, accès direct
none aucun réseau sécurité maximale
overlay réseau multi-hôte, Swarm/K8s clusters
macvlan donne une adresse MAC réelle intégration LAN
ipvlan similaire macvlan mais plus simple datacenters

6.3 Le réseau Bridge (par défaut)

Le réseau *bridge* est créé automatiquement :

docker network ls

On y voit :

bridge host none

IP par défaut :

172.17.0.0/16

Lorsqu’un conteneur démarre :

docker run -d nginx

Il reçoit une IP locale :

172.17.0.2


6.4 NAT, iptables et mapping de ports

Le mapping :

-p 8080:80

Signifie :

HÔTE port 8080 → CONTENEUR port 80

Docker configure automatiquement :

  • NAT (iptables MASQUERADE)
  • Forward de ports
  • Routage interne

6.5 Inspecter le réseau

Inspecter un réseau

docker network inspect bridge

Inspecter un conteneur

docker inspect moncontainer

Sections importantes :

  • IPAddress
  • Networks
  • MacAddress
  • Gateway

6.6 Réseaux personnalisés

Créer :

docker network create monreseau

Lancer deux conteneurs :

docker run -d –name web –network monreseau nginx docker run -d –name api –network monreseau alpine sleep 9999

Tester la communication :

docker exec -it api ping web

Résultat attendu :

PING web (172.x.x.x): 56 data bytes

Docker crée automatiquement un DNS interne.


6.7 Aliases DNS

Créer un alias :

docker run -d –network monreseau –network-alias backend nginx

Tester :

docker exec -it api ping backend


6.8 Le réseau Host

docker run –network host nginx

Le conteneur :

  • partage l’interface réseau du host
  • n’a pas de NAT
  • expose directement ses ports

Avantage → perf maximale Inconvénient → aucune isolation


6.9 Le réseau None

docker run –network none alpine

Résultat :

  • aucun accès réseau
  • seulement `lo`

Idéal pour :

  • batch sécurisés
  • environnements isolés

6.10 Macvlan

Macvlan permet d’attribuer une vraie adresse MAC.

Exemple de création :

docker network create -d macvlan –subnet=192.168.1.0/24 –gateway=192.168.1.1 -o parent=eth0 pubnet

Les conteneurs apparaissent comme des machines réelles sur le LAN.


6.11 Overlay

Utilisé pour Swarm ou Kubernetes.

Permet à des conteneurs :

  • situés sur plusieurs serveurs physiques
  • d’être sur un même réseau virtuel

6.12 Docker Compose

Exemple :

version: “3.9” services:

web:
  image: nginx
  networks:
    - backend
api:
  image: alpine
  command: sleep 9999
  networks:
    - backend

networks:

backend:
  driver: bridge

Test DNS :

docker compose exec api ping web


6.13 Outils de diagnostic réseau

Tester DNS

docker exec -it conteneur nslookup web

Sniffer

docker run –rm -it –net=host nicolaka/netshoot

Netshoot contient :

  • tcpdump
  • dig
  • nslookup
  • ip route
  • netstat

6.14 Exercices pratiques + CORRIGÉS

EXERCICE 1 : Trouver l’IP d’un conteneur

Commandes :

docker run -d –name test-nginx nginx docker inspect -f 'networksettings.ipaddress' test-nginx

RÉPONSE ATTENDUE : → Une IP interne `172.17.x.x`


EXERCICE 2 : Ping entre deux conteneurs

Création réseau :

docker network create reseau-test

Lancement conteneurs :

docker run -d –name c1 –network reseau-test alpine sleep 9999 docker run -d –name c2 –network reseau-test alpine sleep 9999

Ping :

docker exec -it c1 ping -c 2 c2

RÉPONSE ATTENDUE : → Ping OK grâce au DNS Docker


EXERCICE 3 : Conteneur sans réseau

docker run –network none alpine ip a

RÉPONSE ATTENDUE : → Seule interface disponible : `lo`


6.15 Résumé du module 6

  • Docker utilise un réseau bridge NAT par défaut
  • Chaque conteneur reçoit une IP interne
  • Docker inclut un DNS interne très puissant
  • Le mapping de ports passe par iptables NAT
  • host = réseau partagé
  • none = aucun réseau
  • macvlan = conteneur visible sur LAN
  • overlay = multi-nœuds
  • docker network inspect = outil clé

Ce module permet de maîtriser tous les aspects réseau indispensables en production.

MODULE 7 — DOCKER COMPOSE (VERSION ULTRA COMPLÈTE)

7.0 Objectif du module

Ce module ultra complet couvre :

  • le fonctionnement de Docker Compose
  • la syntaxe complète du fichier docker-compose.yml
  • les services, réseaux, volumes et dépendances
  • la gestion du scaling (réplication de services)
  • l'override, les profils, les variables d'environnement
  • les commandes avancées
  • un atelier complet avec exercices + réponses corrigées
  • exemples professionnels utilisés en production

Docker Compose est l’outil indispensable pour gérer des environnements multi-conteneurs.


7.1 Qu’est-ce que Docker Compose ?

Docker Compose permet de :

  • définir plusieurs services dans un fichier unique
  • lancer toute une stack en une seule commande
  • gérer réseaux, volumes, dépendances automatiquement
  • simplifier les environnements de dev, test et staging

Commande principale :

docker compose up -d


7.2 Structure d’un fichier docker-compose.yml

Structure générale :

version: “3.9” services:

service1:
  ...
service2:
  ...

networks:

...

volumes:

...

Les sections principales :

  • services
  • networks
  • volumes
  • configs (avancé)
  • secrets (avancé)

7.3 Définir un service

Exemple :

services:

web:
  image: nginx
  ports:
    - "8080:80"

Options courantes :

  • image
  • build
  • ports
  • environment
  • volumes
  • depends_on
  • restart
  • command
  • networks

7.4 Build d’une image via Compose

services:

api:
  build: .
  ports:
    - "3000:3000"

Compose exécutera automatiquement :

docker build .


7.5 Variables d’environnement

Dans le fichier

environment:

  1. APP_ENV=prod
  2. DB_HOST=mysql

Via .env

Fichier `.env` :

APP_ENV=prod PORT=8080

Compose :

ports:

  1. “${PORT}:80”

7.6 Volumes dans Docker Compose

Exemple :

services:

db:
  image: mysql
  volumes:
    - dbdata:/var/lib/mysql

volumes:

dbdata:

Permet la persistance automatique.


7.7 Réseaux dans Docker Compose

Définir un réseau :

networks:

backend:
  driver: bridge

Assigner un service :

services:

api:
  image: myapi
  networks:
    - backend

Par défaut, Compose crée un réseau :

<dossier>_default


7.8 depends_on (ordre de démarrage)

services:

web:
  depends_on:
    - db

IMPORTANT : depends_on ne garantit PAS que db soit prêt, seulement qu'il démarre avant.

Pour vérifier la santé :

healthcheck:

test: ["CMD", "curl", "-f", "http://localhost"]
interval: 5s
timeout: 3s
retries: 5

7.9 Commande, entrypoint

services:

app:
  image: node
  command: ["npm", "start"]

Override ENTRYPOINT :

entrypoint: [“python3”] command: [“app.py”]


7.10 Restart policies

restart: always restart: on-failure restart: unless-stopped


7.11 Scaling (réplication)

docker compose up -d –scale web=3

Limites :

  • fonctionne uniquement si le service n’a pas de ports mappés fixes

Exemple correct :

ports:

  1. “80”

(= port dynamique)


7.12 Commandes essentielles

docker compose up -d docker compose down docker compose ps docker compose logs -f docker compose exec <service> <commande> docker compose restart docker compose up -d –build


7.13 Exemple complet : Nginx + PHP + MySQL

version: “3.9” services:

web:
  image: nginx
  ports:
    - "8080:80"
  volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf
  depends_on:
    - php
php:
  image: php:8.2-fpm
  volumes:
    - ./app:/var/www/html
db:
  image: mysql:8
  environment:
    MYSQL_ROOT_PASSWORD: root
  volumes:
    - dbdata:/var/lib/mysql

volumes:

dbdata:

7.14 Exemple professionnel : API Node + Redis cache

version: “3.9” services:

api:
  build: ./api
  ports:
    - "3000:3000"
  depends_on:
    - redis
redis:
  image: redis:7
  command: ["redis-server", "--appendonly", "yes"]
  volumes:
    - redisdata:/data

volumes:

redisdata:

7.15 Exercices pratiques AVEC corrigés

EXERCICE 1 : Lancer un Nginx avec Compose

docker-compose.yml :

version: “3.9” services:

web:
  image: nginx
  ports:
    - "8080:80"

Commande :

docker compose up -d

RÉPONSE : http://localhost:8080 affiche Nginx.


EXERCICE 2 : Créer un réseau partagé

docker-compose.yml :

services:

c1:
  image: alpine
  command: sleep 9999
c2:
  image: alpine
  command: sleep 9999

Test :

docker compose exec c1 ping -c 2 c2

RÉPONSE : Le ping fonctionne grâce au DNS interne Docker.


EXERCICE 3 : Ajouter une base MySQL persistante

docker-compose.yml :

version: “3.9” services:

db:
  image: mysql:8
  environment:
    MYSQL_ROOT_PASSWORD: 1234
  volumes:
    - mysqldata:/var/lib/mysql

volumes:

mysqldata:

Test :

docker compose exec db mysql -uroot -p1234 -e “CREATE DATABASE testdb;” docker compose down docker compose up -d docker compose exec db mysql -uroot -p1234 -e “SHOW DATABASES;”

RÉPONSE : La base testdb apparaît → la persistance fonctionne.


7.16 Résumé du module 7

  • Docker Compose orchestre plusieurs services dans un seul fichier
  • sections principales : services, volumes, networks
  • depend_on aide à orchestrer le démarrage
  • persistence gérée via volumes
  • réseaux automatiques + DNS interne
  • scaling possible avec –scale
  • docker compose up / down / logs / exec sont les commandes essentielles

Ce module est indispensable pour déployer des stacks multi-services (WordPress, Laravel, Django, Node.js, Next.js…).

MODULE 8 — SÉCURITÉ DOCKER (VERSION ULTRA COMPLÈTE)

8.0 Objectif du module

Ce module ultra complet couvre :

  • les risques liés aux conteneurs Docker
  • les meilleures pratiques de sécurité 2025
  • la configuration des utilisateurs non-root
  • la signature et le scanning d’images
  • les capabilities Linux
  • seccomp, AppArmor & SELinux
  • la gestion des secrets
  • la sécurité réseau
  • la sécurité des images et des registres
  • exercises complets AVEC réponses

Ce module est essentiel pour un usage professionnel de Docker.


8.1 Pourquoi la sécurité est importante ?

Docker apporte une isolation, mais pas une sécurité absolue.

Risques courants :

  • conteneur exécuté en root → très dangereux
  • mauvaise isolation réseau
  • images non fiables
  • secrets stockés dans les fichiers
  • volumes mal configurés
  • ports exposés inutilement

Objectif : Protéger l’hôte, les conteneurs et les données.


8.2 Principe de base : NE PAS exécuter en root

Le conteneur tourne par défaut en root, ce qui permettrait :

  • d'écrire partout dans les volumes
  • d’accéder à des fichiers sensibles
  • d’échapper potentiellement au conteneur

Solution recommandée : Créer un utilisateur interne.

Exemple dans Dockerfile :

RUN adduser -D appuser USER appuser

Pour vérifier :

docker exec -it monapp id


8.3 Capabilities Linux

Docker retire la majorité des capabilities, mais certaines restent.

Lister les capabilities disponibles :

docker run –rm alpine capsh –print

Désactiver TOUTES les capabilities :

docker run –cap-drop=ALL myapp

N’en autoriser qu’une :

docker run –cap-drop=ALL –cap-add=NET_ADMIN myapp


8.4 Seccomp

Seccomp = sandbox de syscalls Linux.

Voir le profil par défaut :

/usr/share/docker/seccomp.json

Exécuter un conteneur sans seccomp :

docker run –security-opt seccomp=unconfined myapp

→ DÉCONSEILLÉ en production.


8.5 AppArmor / SELinux

AppArmor (Ubuntu / Debian)

Voir profils :

aa-status

Activer un profil :

docker run –security-opt apparmor=monprofil myapp

SELinux (CentOS / RHEL)

Mode permissif :

setenforce 0

Mode enforcing :

setenforce 1

Label SELinux pour Docker :

docker run -v data:/data:Z myapp


8.6 Scanner la sécurité d’une image

Docker propose un scan natif :

docker scan monimage

Sortie :

  • CVE détectées
  • Niveau de sévérité
  • Packages vulnérables
  • Correctifs recommandés

Autre outil : Trivy

docker run aquasec/trivy image monimage


8.7 Signature des images (Docker Content Trust)

Activer la confiance :

export DOCKER_CONTENT_TRUST=1

Signer une image :

docker trust sign monrepo/monimage:1.0

Valider une signature :

docker trust inspect monrepo/monimage


8.8 Sécuriser les images Docker

Bonnes pratiques 2025 :

  • utiliser images officielles (docker.io/library/)
  • préférer alpine, slim ou distroless
  • éviter latest
  • limiter les packages installés
  • utiliser multi-stage builds
  • supprimer les outils sensibles :

RUN apk del curl git build-base


8.9 Sécuriser les conteneurs

Isoler les processus

docker run –pids-limit 100 myapp

Limiter mémoire

docker run –memory=512m myapp

Limiter CPU

docker run –cpus=“1.0” myapp

Lire-only filesystem

docker run –read-only myapp

Désactiver nouveau processus

docker run –security-opt no-new-privileges myapp


8.10 Sécurité réseau

—- Réduire la surface d'exposition —-

  • éviter d'exposer tous les ports
  • privilégier des réseaux internes
  • utiliser un reverse proxy (Traefik, Nginx Proxy Manager)

—- Exemple : Nginx accessible seulement via backend —-

networks:

backend:
public:

services:

nginx:
  networks:
    - public
    - backend
api:
  networks:
    - backend

—- Firewall interne —-

docker run –cap-add NET_ADMIN alpine iptables -L


8.11 Gestion sécurisée des secrets

Ne jamais mettre les secrets dans :

  • Dockerfile
  • docker-compose.yml
  • .env versionné

Docker Compose secrets

secrets:

db_pass:
  file: ./db_pass.txt

Usage

services:

db:
  secrets:
    - db_pass

Dans le conteneur :

/run/secrets/db_pass


8.12 Sécuriser les registres

Authentification :

docker login registry.example.com

Limiter le push :

docker push registry.example.com/secure/image:1.0

Registry privé sécurisé :

  • HTTPS obligatoire
  • tokens d’accès
  • scanning automatique CI/CD

8.13 Exercices pratiques AVEC corrigés

EXERCICE 1 : Lancer un conteneur non-root

Objectif : Créer un conteneur avec un utilisateur non-root.

Solution :

docker run -it –user 1000:1000 alpine id

RÉPONSE : Le conteneur affiche :

uid=1000 gid=1000


EXERCICE 2 : Désactiver toutes les capabilities

Commandes :

docker run –cap-drop=ALL alpine sh -c “ping 8.8.8.8”

RÉSULTAT ATTENDU :

ping: socket: Operation not permitted

→ NORMAL : capability supprimée.


EXERCICE 3 : Scanner une image

docker scan nginx

RÉSULTAT ATTENDU : Liste de CVE + niveaux critique/haut/moyen.


EXERCICE 4 : Fichier système en mode read-only

docker run –read-only -it alpine touch /test

RÉPONSE ATTENDUE :

touch: /test: Read-only file system


8.14 Résumé du module 8

  • Ne jamais exécuter en root
  • Limiter les capabilities Linux
  • Utiliser seccomp, AppArmor, SELinux
  • Scanner les images (Docker Scan, Trivy)
  • Utiliser des bases minimales (alpine, slim, distroless)
  • Sécuriser l’accès réseau et les secrets
  • Protéger les registres privés
  • Limiter ressources CPU / RAM / PIDs
  • Activer rootless si possible
  • Réduire la surface d’attaque au strict minimum

Ce module est indispensable pour un déploiement professionnel sécurisé.

MODULE 9 — OUTILS & ENVIRONNEMENT DOCKER (VERSION ULTRA COMPLÈTE)

9.0 Objectif du module

Ce module ultra complet couvre :

  • les outils essentiels pour gérer, surveiller et optimiser Docker
  • les interfaces graphiques (Portainer, DockStation…)
  • le monitoring réseau & système (Netshoot, cAdvisor…)
  • les reverse-proxy modernes (Traefik, Nginx Proxy Manager)
  • les outils de mise à jour (Watchtower)
  • les environnements de développement optimisés
  • les outils de build & analyse
  • EXERCICES COMPLETS + réponses

C’est le module le plus pratique pour travailler comme un professionnel.


9.1 Portainer — L’interface graphique N°1

Portainer permet :

  • de visualiser les conteneurs
  • de voir logs, stats, CPU/RAM
  • de gérer réseaux, volumes, stacks
  • de déployer Docker Compose depuis UI
  • de gérer un cluster Swarm

Installation :

docker volume create portainer_data docker run -d -p 9443:9443 –name portainer –restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

Accès :

https://localhost:9443


9.2 Nginx Proxy Manager (NPM) — Reverse Proxy Simple

Permet :

  • HTTPS avec Let’s Encrypt en un clic
  • gestion multi-sites
  • redirections
  • proxy vers conteneurs

Compose complet :

version: “3.9” services:

npm:
  image: jc21/nginx-proxy-manager:latest
  ports:
    - "80:80"
    - "81:81"
    - "443:443"
  volumes:
    - npm-data:/data
    - npm-letsencrypt:/etc/letsencrypt

volumes:

npm-data:
npm-letsencrypt:

9.3 Traefik — Reverse Proxy Professionnel

Traefik permet :

  • proxy dynamique
  • SSL automatique
  • dashboards
  • labels Docker
  • load balancing

Exemple service avec labels :

services:

api:
  image: myapi
  labels:
    - "traefik.enable=true"
    - "traefik.http.routers.api.rule=Host(`api.example.com`)"

9.4 Watchtower — Mise à jour automatique des conteneurs

docker run -d –name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower

Fonctions :

  • vérifie les images mises à jour
  • redéploie automatiquement
  • idéal pour les serveurs auto-hébergés

9.5 Netshoot — Le couteau suisse du diagnostic réseau

docker run –rm -it nicolaka/netshoot

Inclut :

  • curl
  • dig
  • tcpdump
  • nslookup
  • mtr
  • netstat
  • iperf

Ex : résolution DNS interne →

dig web


9.6 cAdvisor — Monitoring CPU / RAM / I/O

docker run -d -p 8080:8080 –name cadvisor –volume=/:/rootfs:ro –volume=/var/run:/var/run:ro –volume=/sys:/sys:ro –volume=/var/lib/docker/:/var/lib/docker:ro gcr.io/cadvisor/cadvisor

Interface :

http://localhost:8080


9.7 DockStation — GUI moderne (alternative Portainer)

Fonctions :

  • gestion projets multi-conteneurs
  • interface visuelle intuitive
  • logs en temps réel
  • gestion Docker Compose

9.8 Dive — Analyse de la taille d’image

docker run –rm -it wagoodman/dive:latest <image>

Dive analyse :

  • les layers
  • la taille de chaque layer
  • les fichiers dupliqués
  • optimisation possible

9.9 LazyDocker — Interface Terminal Ultime

Installation :

curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash

Interface :

lazydocker

Fonctions :

  • vue conteneurs
  • vue logs CPU/RAM
  • vue réseau
  • gestion volumes
  • restart/stop en temps réel

9.10 Buildx — Build avancé multi-architecture

docker buildx create –use docker buildx build –platform linux/arm64,linux/amd64 -t image:latest .

Pratique pour :

  • Raspberry Pi
  • clusters ARM
  • images cross-platform

9.11 Stern — Logs multi-conteneurs

stern “api-*”

Similaire à :

docker compose logs -f

Mais avec filtrage avancé.


9.12 Atelier pratique — OUTILS DOCKER (avec réponses)

EXERCICE 1 : Installer Portainer

Commandes :

docker volume create portainer_data docker run -d -p 9443:9443 –name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

RÉPONSE : Accès → https://localhost:9443


EXERCICE 2 : Tester Netshoot pour diagnostiquer DNS

Commandes :

docker run -d –name web nginx docker run -d –name api –network bridge alpine sleep 9999 docker exec -it api apk add bind-tools docker exec -it api dig web

RÉSULTAT ATTENDU : web.docker resolve vers → 172.17.x.x


EXERCICE 3 : Utiliser Dive pour analyser une image

Commande :

docker run –rm -it wagoodman/dive:latest nginx

RÉSULTAT ATTENDU :

  • layers listés
  • taille optimisée
  • suggestions de réduction

EXERCICE 4 : Activer Watchtower et vérifier une mise à jour

Commande :

docker run -d –name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower –interval 30

RÉPONSE ATTENDUE : Watchtower surveille les images toutes les 30 secondes.


9.13 Résumé du module 9

  • Portainer = meilleure interface graphique
  • Nginx Proxy Manager = HTTPS facile
  • Traefik = reverse proxy moderne en production
  • Watchtower = mise à jour automatique
  • Netshoot = diagnostic réseau ultime
  • cAdvisor = monitoring CPU/RAM/I/O
  • Dive = analyse taille images
  • LazyDocker = gestion terminal avancée
  • Buildx = builds multi-architectures

Ce module fournit l’ensemble des outils nécessaires à une gestion pro et simplifiée de Docker.

MODULE 10 — DOCKER EN PRODUCTION (VERSION ULTRA COMPLÈTE)

10.0 Objectif du module

Ce module ultra complet couvre :

  • les bonnes pratiques professionnelles pour déployer Docker en production
  • l’optimisation des images, conteneurs et réseaux
  • la supervision, la gestion des logs et des ressources
  • les stratégies de mise à jour et de rollback
  • la haute disponibilité (Swarm / K8s introduction)
  • la CI/CD avec Docker
  • la sécurité renforcée
  • les patterns de déploiement modernes
  • exercices complets + réponses corrigées

Ce module est la conclusion professionnelle de toute la formation.


10.1 Préparer Docker pour la production

Une stack Docker prête pour la production doit respecter :

  • images légères (alpine/slim/distroless)
  • utilisateurs non-root
  • ressources limitées (CPU/RAM/PIDs)
  • logs externes (ELK / Loki / Splunk)
  • reverse proxy sécurisé (Traefik / NPM)
  • monitoring complet (cAdvisor, Prometheus, Grafana)
  • backups automatiques (volumes)
  • stratégie de mises à jour maîtrisée

Le mot d’ordre : minimalisme + sécurité + observabilité.


10.2 Choix des images professionnelles

Images recommandées :

  • alpine
  • debian-slim
  • python:slim
  • node:alpine
  • distroless

Éviter :

  • latest
  • ubuntu “full”
  • images non officielles

Bonne pratique :

FROM node:20-alpine RUN adduser -D appuser USER appuser


10.3 Optimisation des conteneurs

Limiter CPU

docker run –cpus=“1.0” myapp

Limiter RAM

docker run –memory=“512m” myapp

Limiter PIDs

docker run –pids-limit=100 myapp

Système de fichier read-only

docker run –read-only myapp


10.4 Logs en production

Ne jamais stocker les logs DANS le conteneur.

Solutions recommandées :

  • Loki (Grafana)
  • ELK Stack
  • Promtail
  • Splunk

Logging driver :

docker run –log-driver json-file myapp


10.5 Monitoring complet

Outils essentiels :

  • cAdvisor — CPU, RAM, IO
  • Prometheus — métriques
  • Grafana — dashboards
  • Netshoot — diagnostic réseau

Exemple cAdvisor :

docker run -d -p 8080:8080 gcr.io/cadvisor/cadvisor


10.6 Reverse proxy professionnel

Traefik :

  • SSL automatique
  • autodiscovery Docker
  • redirections
  • load balancing

Exemple labels :

labels:

  1. “traefik.enable=true”
  2. “traefik.http.routers.web.rule=Host(`site.com`)”
  3. “traefik.http.routers.web.tls.certresolver=myresolver”

10.7 Stratégies de mises à jour

Rolling Update

Déployer progressif → réduire risques.

Blue/Green

2 versions en parallèle → switch instantané.

Canary

Un petit pourcentage du trafic teste la nouvelle version.


10.8 Gestion des backups

Toujours sauvegarder :

  • volumes SQL
  • configurations
  • certificats SSL
  • images privées

Backup modèle :

docker run –rm -v data:/source -v /backup:/backup alpine tar czvf /backup/data.tar.gz /source


10.9 CI/CD avec Docker

Pipeline GitHub Actions :

name: Deploy on: push jobs:

build:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v3
    - run: docker build -t myapp .
    - run: docker login -u $USER -p $PASS
    - run: docker push myapp

Pipeline complet :

  • build
  • tests
  • scanning sécurité
  • push registry
  • déploiement automatique

10.10 Docker Swarm — haute disponibilité simple

docker swarm init docker service create –replicas 3 nginx

Fonctions :

  • load balancing natif
  • scaling automatique
  • secrets sécurisés
  • rollback intégré

10.11 Kubernetes — introduction

Kubernetes permet :

  • orchestration avancée
  • autoscaling
  • stratégies de déploiement sophistiquées
  • stockage dynamique
  • observabilité complète

Idéal pour :

  • les infrastructures complexes
  • les microservices
  • la haute disponibilité

10.12 Sécurité renforcée en production

Checklist :

  • utilisateur non-root
  • seccomp actif
  • pas de capabilities inutiles
  • no-new-privileges activé
  • réseaux internes privés
  • pas de secrets dans Dockerfile

Exemple :

docker run –security-opt no-new-privileges –cap-drop=ALL myapp


10.13 Architectures réseau professionnelles

Séparer les réseaux :

  • public (reverse proxy)
  • backend (API)
  • database (privé)

Exemple Compose :

networks:

public:
internal:

services:

web:
  networks:
    - public
    - internal
db:
  networks:
    - internal

10.14 EXERCICES COMPLETS + RÉPONSES

EXERCICE 1 : Limiter un conteneur

Commande :

docker run –cpus=“0.5” –memory=“256m” nginx

RÉPONSE : Le conteneur ne peut utiliser que :

  • 50% d’un CPU
  • 256 Mo RAM

EXERCICE 2 : Scanner une image

docker scan nginx

RÉPONSE : La liste des CVE s’affiche → corrigées avant mise en prod.


EXERCICE 3 : Tester read-only

docker run –read-only -it alpine touch /test

RÉSULTAT ATTENDU :

touch: /test: Read-only file system


10.15 Résumé du module 10

  • Production = sécurité, optimisation, monitoring, CI/CD
  • Ne jamais exécuter en root
  • Utiliser images optimisées
  • Limiter ressources des conteneurs
  • Utiliser reverse proxies professionnels
  • Logging & monitoring externes obligatoires
  • CI/CD avec scanning sécurité intégré
  • Swarm & Kubernetes pour haute disponibilité

Ce module final clôture toute la formation en vous donnant les standards industriels actuels.


Cette page a pour source partielle ou intégrale la ou les page(s) suivante(s):


Page dans la catégorie:

informatique/docker.txt · Dernière modification : de john

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki