🐳 Conteneurisation avec Docker
| Formation | BTS SIO option SISR — IRIS Mediaschool |
|---|---|
| Bloc | B2 — Administration Systèmes & Cloud |
| Module | M2.4 — Virtualisation & Cloud |
| Prérequis | Notions de virtualisation, commandes Linux de base |
🎯 Objectifs
- Comprendre les différences entre virtualisation et conteneurisation
- Maîtriser l'architecture Docker et ses composants
- Savoir créer des images Docker avec un Dockerfile
- Gérer les volumes et le réseau Docker
- Appliquer les bonnes pratiques de sécurité des conteneurs
📖 Virtualisation vs Conteneurisation
Différences fondamentales
La virtualisation crée des machines virtuelles complètes, chacune avec son propre système d'exploitation. La conteneurisation partage le noyau (kernel) du système hôte et isole uniquement les processus applicatifs. Les conteneurs sont donc beaucoup plus légers et rapides à démarrer.
| Critère | Machine virtuelle | Conteneur |
|---|---|---|
| Isolation | Complète (OS complet) | Au niveau processus (partage du kernel) |
| Taille | Plusieurs Go (OS + application) | Quelques Mo à centaines de Mo |
| Démarrage | Minutes | Secondes |
| Performance | Overhead de l'hyperviseur | Quasi-native |
| Portabilité | Format spécifique (VMDK, VHD) | Image standardisée (OCI) |
| Densité | Dizaines de VM par hôte | Centaines de conteneurs par hôte |
📖 Architecture Docker
Composants principaux
Docker repose sur une architecture client-serveur :
- Docker Daemon (
dockerd) : le processus serveur qui gère les images, conteneurs, volumes et réseaux - Docker Client (
docker) : l'outil en ligne de commande qui communique avec le daemon via l'API REST - Images : modèles en lecture seule contenant l'application et ses dépendances
- Conteneurs : instances exécutables d'une image (ajout d'une couche d'écriture)
- Registries : dépôts d'images Docker (Docker Hub, registres privés)
Installation de Docker
Sur Linux (Ubuntu/Debian) :
sudo apt update
sudo apt install docker.io
sudo systemctl enable docker --now
sudo usermod -aG docker $USER
Sur Windows : installer Docker Desktop qui inclut Docker Engine, Docker CLI et Docker Compose. Docker Desktop utilise WSL 2 (Windows Subsystem for Linux) comme backend par défaut.
Après l'ajout au groupe docker, déconnectez-vous et reconnectez-vous pour que la modification prenne effet. Cela évite d'utiliser sudo devant chaque commande Docker.
📖 Images Docker
Concept de layers (couches)
Une image Docker est constituée de couches empilées, chacune représentant une instruction du Dockerfile. Les couches sont en lecture seule et partagées entre les images qui ont une base commune, ce qui optimise l'espace disque et les temps de téléchargement.
Dockerfile
Le Dockerfile est le fichier de recette qui décrit comment construire une image. Voici les instructions principales :
| Instruction | Description | Exemple |
|---|---|---|
FROM | Image de base | FROM node:20-alpine |
RUN | Exécuter une commande (build time) | RUN apt update && apt install -y curl |
COPY | Copier des fichiers du host vers l'image | COPY . /app |
WORKDIR | Définir le répertoire de travail | WORKDIR /app |
EXPOSE | Déclarer un port (documentation) | EXPOSE 3000 |
CMD | Commande par défaut au démarrage | CMD ["node", "server.js"] |
ENTRYPOINT | Point d'entrée fixe du conteneur | ENTRYPOINT ["python"] |
Exemple de Dockerfile multi-stage
# Étape 1 : Build
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Étape 2 : Production
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Le multi-stage build permet de produire une image finale légère en ne conservant que les artefacts de production, sans les outils de build.
📖 Commandes essentielles
# Gestion des conteneurs
docker run -d -p 8080:80 --name web nginx # Lancer un conteneur
docker ps # Lister les conteneurs actifs
docker ps -a # Lister tous les conteneurs
docker exec -it web bash # Ouvrir un shell interactif
docker logs web # Afficher les logs
docker stop web # Arrêter un conteneur
docker rm web # Supprimer un conteneur
# Gestion des images
docker images # Lister les images
docker pull ubuntu:22.04 # Télécharger une image
docker build -t monapp:v1 . # Construire une image
docker push monrepo/monapp:v1 # Pousser vers un registry
📖 Volumes Docker
Par défaut, les données d'un conteneur sont éphémères : elles disparaissent quand le conteneur est supprimé. Les volumes permettent de persister les données.
| Type | Description | Syntaxe |
|---|---|---|
| Named volume | Géré par Docker, stocké dans /var/lib/docker/volumes/ | -v mon_volume:/data |
| Bind mount | Monte un répertoire de l'hôte dans le conteneur | -v /chemin/hote:/data |
| tmpfs | Stockage temporaire en mémoire (RAM) | --tmpfs /tmp |
# Créer et utiliser un volume nommé
docker volume create db_data
docker run -d -v db_data:/var/lib/mysql mysql:8
📖 Réseau Docker
Docker crée des réseaux virtuels pour connecter les conteneurs entre eux et avec l'extérieur :
| Driver | Description | Usage |
|---|---|---|
| bridge | Réseau isolé par défaut pour les conteneurs | Communication entre conteneurs sur un même hôte |
| host | Le conteneur partage le réseau de l'hôte | Performances maximales (pas de NAT) |
| none | Aucun réseau | Conteneur totalement isolé |
| overlay | Réseau multi-hôte (Docker Swarm / K8s) | Communication entre conteneurs sur des hôtes différents |
# Créer un réseau personnalisé
docker network create mon_reseau
# Lancer des conteneurs sur le même réseau
docker run -d --name api --network mon_reseau monapp_api
docker run -d --name db --network mon_reseau mysql:8
# Les conteneurs se trouvent par nom DNS : api peut joindre db
📖 Docker Hub et registries privés
Docker Hub est le registry public par défaut. Il héberge des millions d'images officielles et communautaires. En entreprise, on utilise souvent un registry privé pour contrôler les images déployées :
- Harbor : registry open source avec scanning de vulnérabilités
- Azure Container Registry (ACR)
- Amazon ECR
- GitLab Container Registry
📖 Bonnes pratiques
- Images minimales : utiliser des images de base légères (
alpine,distroless) plutôt que des images complètes - Utilisateur non-root : ne jamais exécuter l'application en tant que
rootdans le conteneur - .dockerignore : exclure les fichiers inutiles (
node_modules,.git,.env) pour réduire le contexte de build - Multi-stage builds : séparer les étapes de build et de production
- Tags explicites : ne pas utiliser
:latesten production — toujours spécifier une version - Une seule responsabilité : un conteneur = un processus = un service
📖 Sécurité des conteneurs
- Scanner les images : utiliser des outils comme
Trivy,SnykouDocker Scoutpour détecter les vulnérabilités - Limiter les ressources : utiliser
--memoryet--cpuspour éviter qu'un conteneur ne consomme toutes les ressources de l'hôte - Réseau restreint : isoler les conteneurs dans des réseaux dédiés
- Secrets : ne jamais stocker de mots de passe ou clés dans l'image — utiliser des variables d'environnement ou Docker Secrets
- Read-only filesystem : monter le système de fichiers en lecture seule quand c'est possible (
--read-only)
Un conteneur qui tourne en tant que root avec un accès au socket Docker (/var/run/docker.sock) a potentiellement un contrôle total sur l'hôte. C'est une faille de sécurité critique à éviter absolument en production.
📝 QCM — Testez vos connaissances
- Qu'est-ce que Docker ?
- Quelle est la différence entre un conteneur et une VM ?
- Que contient un Dockerfile ?
- Quelle commande lance un conteneur Docker ?
- Qu'est-ce que Docker Compose ?
- Où sont stockées les images Docker ?
📝 Afficher les corrections
- Une plateforme de conteneurisation d'applications — Docker permet d'empaqueter une application et ses dépendances dans un conteneur léger et portable.
- Le conteneur partage le noyau de l'hôte, la VM a son propre OS — Les conteneurs sont plus légers et démarrent en secondes car ils partagent le kernel Linux.
- Les instructions pour construire une image Docker — Le Dockerfile décrit les couches de l'image : FROM, COPY, RUN, EXPOSE, CMD.
- docker run — docker run crée et démarre un conteneur à partir d'une image (ex: docker run -d nginx).
- Un outil pour définir des applications multi-conteneurs — Docker Compose utilise un fichier docker-compose.yml pour orchestrer plusieurs conteneurs liés.
- Dans un registre (registry), par défaut Docker Hub — Docker Hub est le registre public par défaut, on peut aussi utiliser des registres privés (Harbor, GitLab Registry).
Docker permet d'empaqueter une application avec toutes ses dépendances dans un conteneur léger et portable. Les Dockerfiles multi-stage, les volumes pour la persistance, et les bonnes pratiques de sécurité sont essentiels pour un usage professionnel.
