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 :

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


1.1 Historique rapide


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 ?


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

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

2.0 Objectif du module

Comprendre en profondeur le fonctionnement interne de Docker :

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 :

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

Docker Daemon (dockerd)

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

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 :

Caractéristiques clés

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 :

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

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 :

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

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

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 :

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

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

3.0 Objectif du module

Comprendre en profondeur :

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 :

Schéma structurel :

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


3.2 Les Layers (couches)

Chaque instruction Dockerfile crée une couche :

Commande :

Analyse typique :


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


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 :


WORKDIR

Définit le répertoire de travail.

WORKDIR /app

Avantages :


COPY

Copie des fichiers dans l’image.

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

Points importants :


RUN

Exécute des commandes lors du build.

RUN apt update && apt install -y curl

Bonnes pratiques :


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 :

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 :


3.7 Sécurité des images

Bonnes pratiques 2025 :

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

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

Optimiser le build


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

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

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 :


4.1 Qu’est-ce qu’un conteneur ?

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

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

Commandes de base :


4.3 Les états possibles d’un conteneur

Les états visibles via :

docker ps -a

États courants :


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 :

Obtenir uniquement l’IP

docker inspect -f 'networksettings.ipaddress' moncontainer


4.7 Voir les logs

docker logs moncontainer docker logs -f moncontainer

Options utiles :


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

→ mauvais CMD / erreur au démarrage

  
  docker logs
  

→ le port hôte est occupé

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

→ 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

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 :

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 :

Donc sans volume :

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 :


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 :

Inconvénients :


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


5.11 Atelier pratique complet (avec CORRIGÉS)

EXERCICE 1 : Persister MySQL

Objectif :

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

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

6.0 Objectif du module

Ce module ultra complet couvre :

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 :

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 :


6.5 Inspecter le réseau

Inspecter un réseau

docker network inspect bridge

Inspecter un conteneur

docker inspect moncontainer

Sections importantes :


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 :

Avantage → perf maximale Inconvénient → aucune isolation


6.9 Le réseau None

docker run –network none alpine

Résultat :

Idéal pour :


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 :


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 :


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

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 :

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 :

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 :


7.3 Définir un service

Exemple :

services:

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

Options courantes :


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 :

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

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 :

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 :

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 :

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 :

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 :

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 —-

—- 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 :

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é :


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

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 :

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


9.1 Portainer — L’interface graphique N°1

Portainer permet :

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 :

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 :

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 :


9.5 Netshoot — Le couteau suisse du diagnostic réseau

docker run –rm -it nicolaka/netshoot

Inclut :

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 :


9.8 Dive — Analyse de la taille d’image

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

Dive analyse :


9.9 LazyDocker — Interface Terminal Ultime

Installation :

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

Interface :

lazydocker

Fonctions :


9.10 Buildx — Build avancé multi-architecture

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

Pratique pour :


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 :


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

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 :

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 :

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


10.2 Choix des images professionnelles

Images recommandées :

Éviter :

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 :

Logging driver :

docker run –log-driver json-file myapp


10.5 Monitoring complet

Outils essentiels :

Exemple cAdvisor :

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


10.6 Reverse proxy professionnel

Traefik :

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 :

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 :


10.10 Docker Swarm — haute disponibilité simple

docker swarm init docker service create –replicas 3 nginx

Fonctions :


10.11 Kubernetes — introduction

Kubernetes permet :

Idéal pour :


10.12 Sécurité renforcée en production

Checklist :

Exemple :

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


10.13 Architectures réseau professionnelles

Séparer les réseaux :

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 :


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

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: