🐳 Conteneurisation avec Docker

Bloc 2 Module 2.4 BTS SIO SISR
FormationBTS SIO option SISR — IRIS Mediaschool
BlocB2 — Administration Systèmes & Cloud
ModuleM2.4 — Virtualisation & Cloud
PrérequisNotions 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èreMachine virtuelleConteneur
IsolationComplète (OS complet)Au niveau processus (partage du kernel)
TaillePlusieurs Go (OS + application)Quelques Mo à centaines de Mo
DémarrageMinutesSecondes
PerformanceOverhead de l'hyperviseurQuasi-native
PortabilitéFormat spécifique (VMDK, VHD)Image standardisée (OCI)
DensitéDizaines de VM par hôteCentaines 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.

💡 Astuce

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 :

InstructionDescriptionExemple
FROMImage de baseFROM node:20-alpine
RUNExécuter une commande (build time)RUN apt update && apt install -y curl
COPYCopier des fichiers du host vers l'imageCOPY . /app
WORKDIRDéfinir le répertoire de travailWORKDIR /app
EXPOSEDéclarer un port (documentation)EXPOSE 3000
CMDCommande par défaut au démarrageCMD ["node", "server.js"]
ENTRYPOINTPoint d'entrée fixe du conteneurENTRYPOINT ["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.

TypeDescriptionSyntaxe
Named volumeGéré par Docker, stocké dans /var/lib/docker/volumes/-v mon_volume:/data
Bind mountMonte un répertoire de l'hôte dans le conteneur-v /chemin/hote:/data
tmpfsStockage 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 :

DriverDescriptionUsage
bridgeRéseau isolé par défaut pour les conteneursCommunication entre conteneurs sur un même hôte
hostLe conteneur partage le réseau de l'hôtePerformances maximales (pas de NAT)
noneAucun réseauConteneur totalement isolé
overlayRé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 root dans 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 :latest en 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, Snyk ou Docker Scout pour détecter les vulnérabilités
  • Limiter les ressources : utiliser --memory et --cpus pour é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)
⚠️ Attention

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

  1. Qu'est-ce que Docker ?
  2. Quelle est la différence entre un conteneur et une VM ?
  3. Que contient un Dockerfile ?
  4. Quelle commande lance un conteneur Docker ?
  5. Qu'est-ce que Docker Compose ?
  6. Où sont stockées les images Docker ?
📝 Afficher les corrections
  1. Une plateforme de conteneurisation d'applications — Docker permet d'empaqueter une application et ses dépendances dans un conteneur léger et portable.
  2. 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.
  3. Les instructions pour construire une image Docker — Le Dockerfile décrit les couches de l'image : FROM, COPY, RUN, EXPOSE, CMD.
  4. docker run — docker run crée et démarre un conteneur à partir d'une image (ex: docker run -d nginx).
  5. Un outil pour définir des applications multi-conteneurs — Docker Compose utilise un fichier docker-compose.yml pour orchestrer plusieurs conteneurs liés.
  6. 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).
💡 À retenir

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.

← Cours précédent Cours suivant →