Sommaire
Module V4 – Conteneurisation avec Docker
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éristique | Conteneur | VM |
|---|---|---|
| Isolation | Niveau OS (namespace, cgroups) | Niveau matériel (hyperviseur) |
| Démarrage | Quelques millisecondes | Plusieurs secondes |
| Empreinte | Légère (Mo) | Lourde (Go) |
| Portabilité | Très bonne | Bonne |
⚙️ 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 --versionetdocker compose version - Démarrer le service :
systemctl enable docker && systemctl start docker - Utiliser Docker sans sudo :
usermod -aG docker $USERpuis 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
| Driver | Principe | Cas 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. |
| host | Le conteneur partage directement la pile réseau de l'hôte (pas d'isolation). | Performance maximale, pas de NAT. |
| none | Aucune interface réseau (hors loopback). | Conteneurs totalement isolés du réseau. |
| overlay | Réseau virtuel multi-hôtes (via Swarm/Kubernetes). | Clusters, communication entre plusieurs hôtes Docker. |
| macvlan | Le 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 à
appnetvia--network. - Le conteneur
clientpeut résoudre et joindreserveurpar son nom — impossible avec le réseau bridge par défaut. - À comparer : relancer le test avec
docker runsans--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éseaubackend-netn'a pas de sortie vers Internet ni d'accès direct depuis l'hôte.- Le conteneur
dbn'est joignable que depuisbackend-net, donc uniquement parapp. - Le conteneur
appest connecté aux deux réseaux :backend-netpour parler à la base,frontend-netpour 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 à :