🐳 Module V4 – Conteneurisation avec Docker

📘 Cours complet ⏱️ 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).

⚠️

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

📄 Dockerfile

💾 Volumes

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

7.3 – Commandes essentielles

🔒

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

🛠️ 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


← Retour au portail
BTS SIO – Lycée NDLP Avranches – Module V4 v1.1