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