Définition
La conteneurisation est une technique de virtualisation légère qui empaquete une application et toutes ses dépendances (code, runtime, librairies, configuration) dans un conteneur isole et portable.
Contrairement aux machines virtuelles qui virtualisent le hardware complet (avec un OS inviteé), les conteneurs partagent le noyau de l'OS hôte, les rendant beaucoup plus legers et rapides.
Conteneurs vs Machines Virtuelles
| Conteneur | Machine Virtuelle | |
|---|---|---|
| Taille | Mo (10-500 Mo) | Go (1-20 Go) |
| Démarrage | Secondes | Minutes |
| Isolation | Process-level (namespace, cgroup) | Hardware-level (hyperviseur) |
| Performance | Quasi-native | Overhead (5-15%) |
| OS | Partage le noyau hôte | OS complet par VM |
| Densite | 100+ conteneurs/serveur | 10-20 VM/serveur |
Comment fonctionne un conteneur ?
Les conteneurs Linux reposent sur deux mécanismes du noyau :
Namespaces (isolation)
Chaque conteneur à sa propre vue du système : PID, réseau, filesystem, utilisateurs.
Cgroups (limitations de ressources)
Limitent le CPU, la mémoire, le disque et le réseau que chaque conteneur peut utiliser.
Technologies de conteneurisation
| Technologie | Description |
|---|---|
| Docker | Standard de facto, CLI et daemon |
| Podman | Alternative sans daemon (rootless) |
| containerd | Runtime utilise par Kubernetes |
| CRI-O | Runtime léger pour Kubernetes |
| LXC/LXD | Conteneurs système (plus proche des VM) |
Exemple : Dockerfile
# Image de base
FROM node:22-alpine
# Dossier de travail
WORKDIR /app
# Dependances (cache layer)
COPY package*.json ./
RUN npm ci --production
# Code source
COPY . .
# Port expose
EXPOSE 3000
# Commande de demarrage
CMD ["node", "server.js"]
Bonnes pratiques
- Images minimales : utilisez Alpine ou distroless
- Multi-stage builds : séparer le build de la production
- Non-root : exécutez les conteneurs sans privileges root
- Health checks : définissez des HEALTHCHECK dans le Dockerfile
- Cache layers : ordonnez les instructions du plus stable au plus volatile
- .dockerignore : excluez node_modules, .git, etc.