Introduction aux Containers et Docker
Docker est la technologie de conteneurisation la plus populaire au monde. Elle a révolutionné la façon de développer et déployer les applications.
Qu'est-ce que Docker ?
- Plateforme de conteneurisation open source
- Permet aux développeurs de packager des applications dans des containers
- Les containers existaient avant Docker — Docker les a rendus populaires et accessibles
Qu'est-ce qu'un container ?
Un container = une façon de packager une application avec toutes ses dépendances et sa configuration dans un seul artifact portable.
Application
+ dépendances (Node.js, Java, libs...)
+ configuration (variables d'env, fichiers config)
= Container (artifact portable standardisé)
Avantages :
- Portable : fonctionne identiquement sur n'importe quelle machine
- Standardisé : même format pour toutes les applications
- Efficace : développement et déploiement simplifiés
Les containers sont stockés dans des container repositories (dépôts) :
- Public : Docker Hub (images officielles Postgres, Redis, Nginx, Node.js...)
- Privé : AWS ECR, Azure Container Registry, Nexus...
Avant et après Docker — Développement
Avant les containers
Développeur Mac Développeur Linux
──────────────── ──────────────────
Installe PostgreSQL Installe PostgreSQL
v15.3 + Redis v7.0 v15.3 + Redis v7.0
→ Commandes différentes selon l'OS
→ Risque d'erreur à chaque étape
→ "Ça marche sur ma machine !"
Après les containers
docker run postgres:15.3 ← 1 seule commande
docker run redis:7.0 ← identique sur Mac et Linux
- Environnement isolé : chaque container a sa propre config
- 1 commande pour installer et lancer l'application
- Possible de faire tourner 2 versions différentes côte à côte
Avant et après Docker — Déploiement
Avant les containers
Développeur Ops
────────────── ──────────────────────────
Livre: JAR + doc textuelle Configure le serveur manuellement
Installe les dépendances
→ Conflits de versions
→ Malentendus possibles
→ Configurations diff entre envs
Après les containers
Dev + Ops ensemble → Container (app + config + deps)
→ Ops fait juste : docker run mon-app
- Aucune configuration de l'environnement côté serveur (sauf Docker lui-même)
- Dev et Ops collaborent pour packager l'application en container
- Déploiement reproductible et fiable
Docker Image vs Docker Container
| Docker Image | Docker Container | |
|---|---|---|
| Nature | Fichier (artifact) | Environnement en cours d'exécution |
| État | Pas en cours d'exécution | Application démarrée |
| Structure | Plusieurs couches (layers) | Système de fichiers virtuel |
| Déplacement | Peut être copié/partagé | Lié à la machine hôte |
| Analogie | Plan d'architecture | Bâtiment construit |
Docker Image ──────────────► Docker Container
(artifact statique) docker run (processus vivant)
Structure d'une image (layers) :
┌────────────────────────────────┐
│ postgres:15.3 (app layer) │ ← Layer applicatif
├────────────────────────────────┤
│ Layer 3 (config) │
├────────────────────────────────┤
│ Layer 2 (deps) │
├────────────────────────────────┤
│ alpine:3.17 (base layer) │ ← Linux base image
└────────────────────────────────┘
Containers vs Machines Virtuelles (VM)
Les deux sont des outils de virtualisation, mais à des niveaux différents.
CONTAINERS MACHINES VIRTUELLES
────────────────── ──────────────────────────
App A App B App C App D │VM A│ │VM B│ │VM C│
──────────────────────── │AppA│ │AppB│ │AppC│
Docker │OS │ │OS │ │OS │
──────────────────────── ├────────────────────┤
Host Operating System Hyperviseur
──────────────────────── ────────────────────────
Infrastructure Infrastructure
| Containers | Machines Virtuelles | |
|---|---|---|
| Abstraction | Au niveau de l'application | Au niveau du hardware |
| OS partagé | Oui — partagent le kernel de l'hôte | Non — chaque VM a son propre OS |
| Taille | Petite (MB) | Grande (GB) |
| Démarrage | Rapide (secondes) | Lent (minutes) |
| Isolation | Forte (namespace Linux) | Complète |
Compatibilité : un container Linux ne peut pas tourner directement sur un kernel Windows. → Pour cela, utiliser Docker Desktop (installe une VM Linux légère sous le capot).
Architecture Docker
Docker Engine est composé de 3 composants :
┌─────────────────────────────────────┐
│ Docker Engine │
│ │
│ ┌─────────┐ ┌─────┐ ┌────────┐ │
│ │ Server │ │ API │ │ CLI │ │
│ └─────────┘ └─────┘ └────────┘ │
└─────────────────────────────────────┘
| Composant | Rôle |
|---|---|
| Server | Tire les images, gère le cycle de vie des containers |
| API | Interface pour interagir avec le Server |
| CLI | Interface en ligne de commande pour exécuter les commandes Docker |
Le Server contient :
Server
├── Container Runtime → pull images, gère le cycle de vie des containers
├── Volumes → persiste les données
├── Network → configure la communication entre containers
└── Build Images → construit des images depuis un Dockerfile
Alternatives à Docker
| Besoin | Alternative |
|---|---|
| Container runtime seulement | containerd, cri-o |
| Builder des images seulement | buildah |
| Tout-en-un | Docker (recommandé) |
Installation de Docker
| OS | Méthode |
|---|---|
| Linux | Support natif — installer le package docker-ce |
| Mac | Docker Desktop (installe une VM Linux légère) |
| Windows | Docker Desktop (idem) |
# Linux (Ubuntu/Debian)
apt update
apt install docker.io -y
systemctl start docker
systemctl enable docker
# Vérifier
docker --version
docker run hello-world
À retenir
- Docker = plateforme de conteneurisation open source, la plus populaire
- Container = application + dépendances + config dans 1 seul artifact portable
- Docker Image = artifact statique (fichier) ; Docker Container = image en cours d'exécution
- Containers vs VMs : containers partagent le kernel → plus légers, plus rapides
- Docker Engine = Server (runtime + volumes + network + build) + API + CLI
- Avant Docker : install manuelle différente sur chaque OS, conflits de versions
- Après Docker : 1 commande, même environnement partout, déploiement simplifié