← Retour au portail

Module V4 – Conteneurisation avec Docker

📘 Fiche de cours ⏱️ 4h 🎯 Bloc 2 – SISR
Objectifs : comprendre la conteneurisation, installer Docker, gérer les images, les conteneurs, les volumes, les réseaux et docker-compose.

📖 Introduction

Docker est la plateforme de conteneurisation la plus populaire. Elle permet d'empaqueter une application et ses dépendances dans un conteneur isolé, facilitant le déploiement et la portabilité.

🎯

À l'issue de ce module, vous serez capable de :

  • Installer Docker sur Linux.
  • Gérer les images (pull, build, push).
  • Exécuter et gérer des conteneurs.
  • Configurer et isoler les réseaux Docker (bridge personnalisé, DNS interne).
  • Utiliser Docker Compose pour les applications multi-conteneurs.

📐 Conteneur vs VM

CaractéristiqueConteneurVM
IsolationNiveau OS (namespace, cgroups)Niveau matériel (hyperviseur)
DémarrageQuelques millisecondesPlusieurs secondes
EmpreinteLégère (Mo)Lourde (Go)
PortabilitéTrès bonneBonne

⚙️ Installation de Docker

Docker fournit un script d'installation officiel (convenience script) qui détecte la distribution et installe automatiquement Docker Engine, la CLI et le plugin Compose. Recommandé pour les tests et environnements de formation (à éviter en production, où l'installation via le dépôt APT/YUM officiel est préférable).

  • Téléchargement du script : curl -fsSL https://get.docker.com -o install-docker.sh
  • Exécution : sudo sh install-docker.sh
  • Vérification : docker --version et docker compose version
  • Démarrer le service : systemctl enable docker && systemctl start docker
  • Utiliser Docker sans sudo : usermod -aG docker $USER puis se reconnecter.
⚠️

Bon réflexe avant d'exécuter un script tiers

Toujours inspecter un script avant de l'exécuter en root : cat install-docker.sh ou less install-docker.sh. C'est une bonne pratique de sécurité à faire acquérir aux étudiants, même pour un script officiel Docker.

📦 Images et conteneurs

  • Image : modèle en lecture seule pour créer des conteneurs.
  • Conteneur : instance exécutable d'une image.
  • Commandes : docker pull, docker run, docker ps, docker stop, docker rm

📄 Dockerfile

  • Définition : fichier texte décrivant comment construire une image.
  • Instructions : FROM, RUN, COPY, CMD, ENV, EXPOSE
  • Exemple : FROM python:3.9-slim ; COPY app.py /app.py ; CMD ["python", "/app.py"]

💾 Volumes

  • Principe : persister les données au-delà du cycle de vie du conteneur.
  • Types : volumes, bind mounts, tmpfs.
  • Commande : docker volume create, docker run -v volume:/chemin

🌐 Réseaux Docker

Chaque conteneur possède sa propre interface réseau virtuelle. Docker s'appuie sur les fonctionnalités réseau du noyau Linux (bridges virtuels, iptables, network namespaces) pour interconnecter, isoler et exposer les conteneurs.

7.1 – Les drivers réseau

DriverPrincipeCas d'usage
bridge (défaut)Réseau virtuel privé sur l'hôte, NAT vers l'extérieur.Cas général, conteneurs sur une même machine.
hostLe conteneur partage directement la pile réseau de l'hôte (pas d'isolation).Performance maximale, pas de NAT.
noneAucune interface réseau (hors loopback).Conteneurs totalement isolés du réseau.
overlayRéseau virtuel multi-hôtes (via Swarm/Kubernetes).Clusters, communication entre plusieurs hôtes Docker.
macvlanLe conteneur reçoit une adresse MAC/IP propre sur le réseau physique.Le conteneur doit apparaître comme un hôte à part entière du LAN.

7.2 – Bridge par défaut vs réseau bridge personnalisé

  • Réseau bridge par défaut : tous les conteneurs y sont connectés si aucun réseau n'est précisé, mais aucune résolution DNS par nom entre eux (seule l'IP fonctionne).
  • Réseau bridge personnalisé (docker network create) : Docker fournit un DNS interne automatique — les conteneurs peuvent se joindre par leur nom (ping web au lieu d'une IP).
  • Bonne pratique : toujours créer un réseau dédié par application plutôt que d'utiliser le bridge par défaut.

7.3 – Commandes essentielles

  • Lister les réseaux : docker network ls
  • Créer un réseau : docker network create mon-reseau
  • Inspecter un réseau (IP, conteneurs connectés) : docker network inspect mon-reseau
  • Connecter/déconnecter un conteneur à chaud : docker network connect mon-reseau conteneur / docker network disconnect
  • Supprimer un réseau inutilisé : docker network rm mon-reseau
  • Réseau interne (sans accès à Internet) : docker network create --internal reseau-prive
🔒

Lien avec la sécurité réseau

Un réseau Docker personnalisé permet de segmenter une application : par exemple, une base de données peut être placée sur un réseau --internal non joignable depuis l'extérieur, et seul le conteneur applicatif y a accès — un principe proche de la segmentation VLAN vue en architecture réseau.

7.4 – Docker Compose et réseaux

  • Docker Compose crée automatiquement un réseau bridge dédié pour chaque projet (nommé <dossier>_default).
  • Tous les services déclarés dans le docker-compose.yml peuvent se joindre par leur nom de service (ex. un conteneur app peut contacter db via db:5432).
  • Il est possible de définir plusieurs réseaux personnalisés dans la clé networks: pour isoler certains services entre eux.

📦 Docker Compose

  • Principe : définir et exécuter des applications multi-conteneurs.
  • Fichier : docker-compose.yml (services, réseaux, volumes).
  • Commandes : docker compose up -d, docker compose down

🛠️ Mise en pratique

9.1 – Lancer un conteneur Nginx

Exécuter un conteneur Nginx :

docker run -d --name web -p 8080:80 nginx:alpine
  • -d : détaché (arrière-plan).
  • --name web : nom du conteneur.
  • -p 8080:80 : redirige le port 8080 de l'hôte vers le 80 du conteneur.
  • nginx:alpine : image légère de Nginx.

9.2 – Construire une image avec Dockerfile

Créer une image pour une application Python simple :

# Dockerfile
FROM python:3.9-slim
COPY app.py /app.py
CMD ["python", "/app.py"]
  • FROM : image de base.
  • COPY : copie le fichier.
  • CMD : commande par défaut.

9.3 – Créer un réseau personnalisé et tester la résolution DNS

Objectif : vérifier que deux conteneurs peuvent se joindre par leur nom sur un réseau bridge personnalisé.

docker network create appnet
docker run -d --name serveur --network appnet nginx:alpine
docker run -it --name client --network appnet alpine ping -c 3 serveur
  • docker network create appnet : crée un réseau bridge personnalisé avec DNS interne.
  • Les deux conteneurs sont attachés à appnet via --network.
  • Le conteneur client peut résoudre et joindre serveur par son nom — impossible avec le réseau bridge par défaut.
  • À comparer : relancer le test avec docker run sans --network (bridge par défaut) pour observer l'échec du ping par nom.

9.4 – Isoler une base de données sur un réseau interne

Objectif : placer une base de données sur un réseau interne inaccessible depuis l'extérieur, joignable uniquement par le conteneur applicatif.

docker network create --internal backend-net
docker network create frontend-net

docker run -d --name db --network backend-net -e POSTGRES_PASSWORD=secret postgres:16-alpine
docker run -d --name app --network backend-net --network frontend-net -p 8080:8080 mon-app:latest
  • --internal : le réseau backend-net n'a pas de sortie vers Internet ni d'accès direct depuis l'hôte.
  • Le conteneur db n'est joignable que depuis backend-net, donc uniquement par app.
  • Le conteneur app est connecté aux deux réseaux : backend-net pour parler à la base, frontend-net pour exposer le port 8080.
  • Cette architecture reproduit le principe d'une DMZ : seul le service exposé est accessible, la donnée reste isolée.

📝 Exercices d'application

Exercice 1 – Commandes Docker

Quelle commande permet de lister les conteneurs en cours d'exécution ?

docker ps

Exercice 2 – Docker Compose

Quelle commande démarre une application Docker Compose en arrière-plan ?

docker compose up -d

Exercice 3 – Réseaux Docker

Pourquoi est-il recommandé de créer un réseau bridge personnalisé plutôt que d'utiliser le réseau bridge par défaut ?

Un réseau personnalisé fournit une résolution DNS automatique par nom de conteneur, ce que ne permet pas le réseau bridge par défaut (seule l'adresse IP y fonctionne). Il permet aussi de mieux isoler les applications entre elles.

🎯 Quiz d'auto‑évaluation

1. Un conteneur Docker utilise les fonctionnalités du noyau Linux :

2. La commande docker run permet de :

3. Un Dockerfile contient des instructions pour :

4. Les volumes Docker permettent de :

5. Docker Compose utilise un fichier :

6. Sur quel type de réseau les conteneurs peuvent-ils se résoudre entre eux par leur nom ?

7. L'option --internal d'un réseau Docker sert à :

📚 Ressources et liens utiles