Definition
La conteneurisation est une technique de virtualisation legere qui empaquete une application et toutes ses dependances (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 hote, les rendant beaucoup plus legers et rapides.
Conteneurs vs Machines Virtuelles
| Conteneur | Machine Virtuelle | |
|---|---|---|
| Taille | Mo (10-500 Mo) | Go (1-20 Go) |
| Demarrage | Secondes | Minutes |
| Isolation | Process-level (namespace, cgroup) | Hardware-level (hyperviseur) |
| Performance | Quasi-native | Overhead (5-15%) |
| OS | Partage le noyau hote | OS complet par VM |
| Densite | 100+ conteneurs/serveur | 10-20 VM/serveur |
Comment fonctionne un conteneur ?
Les conteneurs Linux reposent sur deux mecanismes du noyau :
Namespaces (isolation)
Chaque conteneur a sa propre vue du systeme : PID, reseau, filesystem, utilisateurs.
Cgroups (limitations de ressources)
Limitent le CPU, la memoire, le disque et le reseau 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 leger pour Kubernetes |
| LXC/LXD | Conteneurs systeme (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 : separer le build de la production
- Non-root : executez les conteneurs sans privileges root
- Health checks : definissez des HEALTHCHECK dans le Dockerfile
- Cache layers : ordonnez les instructions du plus stable au plus volatile
- .dockerignore : excluez node_modules, .git, etc.