Docker
Acte 1 · La fondation : le WordPress de la petite entreprise vit sans armure sur sa machine. On l'emballe dans des conteneurs.
420-5A4-MT · Serveurs évolutifs · DockerQu'est-ce qu'un conteneur ?
Un conteneur est une unité standard de logiciel qui regroupe une application et toutes ses dépendances (bibliothèques, configuration, exécutables), afin qu'elle s'exécute de façon fiable sur n'importe quelle machine : votre portable, une machine virtuelle, un serveur infonuagique.
Comme le conteneur de bateau : peu importe le contenu, la boîte a un format standard que tous les ports du monde savent manipuler.
Vu de la machine, un conteneur est un simple processus, mais enfermé : il ne voit que ses propres fichiers, processus et réseau. C'est le cloisonnement.
Conteneur ou machine virtuelle ?
- Un hyperviseur émule du matériel complet.
- Chaque VM embarque son propre système d'exploitation et son noyau.
- Lourde (gigaoctets), lente à démarrer (minutes), mais isolation très forte.
- Tous les conteneurs partagent le noyau Linux de la machine hôte.
- L'isolation est faite par le noyau lui-même, pas par du matériel émulé.
- Léger (mégaoctets), démarre en secondes, on en met des dizaines par machine.
Les deux ne se font pas concurrence : dans ce cours, vos conteneurs tourneront dans une machine virtuelle. L'emballage dans l'emballage, et c'est très courant en production.
L'image et le conteneur
- La recette : un modèle figé, en lecture seule.
- Se télécharge depuis un registre comme Docker Hub (ubuntu, mysql, wordpress...).
- Se partage : la même image donne le même résultat partout.
- Le plat cuisiné : une instance vivante de l'image.
- On peut en lancer dix à partir de la même image.
- Jetable : on le détruit et on le recrée sans remords.
Le cycle de vie et les journaux
Un conteneur naît, vit, s'arrête, repart, meurt. Six commandes pour tout piloter :
Les journaux (logs) sont vos yeux : un conteneur qui refuse de démarrer s'explique toujours dans ses journaux.
Les volumes et la redirection de ports
Un conteneur est jetable : à sa destruction, tout ce qu'il contenait disparaît. Deux ponts le relient au monde réel :
Un répertoire qui survit au conteneur. Les données de la base et les fichiers du site y vivent en sécurité, hors de la boîte.
Le conteneur a son propre réseau. La redirection 80:80 relie le port de la machine à celui du conteneur pour que les visiteurs entrent.
Pour creuser avec des diagrammes et des exemples : le diaporama Volumes et ports.
L'adresse selon votre instance
L'adresse à ouvrir dans le navigateur, c'est toujours : l'adresse IP de la machine où Docker tourne, suivie du port externe choisi avec -p.
Moteur Docker installé sur votre Linux, ou DinD : la machine, c'est votre poste : http://localhost:8080.
Docker tourne dans la machine virtuelle : utiliser son adresse IP : http://192.168.56.2:8080. Avec -p "80:80" : http://192.168.56.2 tout court.
L'adresse IP publique du serveur : http://adresse-du-vps:8080 (port ouvert dans le pare-feu).
localhost n'est vrai que si Docker tourne sur votre poste : partout ailleurs, remplacer localhost par l'adresse IP de l'instance.
Piraté ? On jette, on redéploie
Le WordPress de la petite entreprise vient de se faire pirater. Nettoyer un serveur compromis à la main prend des heures, sans jamais être certain qu'il ne reste pas une porte dérobée. Docker change complètement cette situation.
L'image est en lecture seule : le pirate a modifié le conteneur, pas la recette. Relancer depuis l'image redonne un serveur propre, identique au premier jour.
docker rm du conteneur compromis, docker run d'un neuf : le site revient en ligne pendant que la concurrence répare encore. Les données, elles, vivent dans les volumes.
La nuance qui compte : redéployer efface l'intrusion, pas la faille. Il faut aussi corriger ce qui a laissé entrer le pirate (plugin à jour, bonnes permissions), sinon il revient par la même porte. (Cette correction ne fait pas partie du scénario du devoir.)
Une compartimentation... et le débat rootless
Le conteneur est déjà une compartimentation de protection : le processus enfermé ne voit que ses fichiers, ses processus et son réseau. Une brèche dans WordPress reste dans la boîte, loin du reste de la machine.
- Le démon Docker (dockerd) tourne en root.
- Être membre du groupe docker = root de facto sur la machine.
- Un montage imprudent (-v /:/hote) ou une évasion de conteneur expose toute la machine.
- Podman : mêmes commandes, mais sans démon et rootless par conception.
- Les conteneurs tournent avec les droits de votre usager, rien de plus.
- Docker a riposté avec son mode rootless : le débat a fait avancer tout le monde.
La compartimentation est réelle, mais elle n'est pas magique : elle protège d'autant mieux qu'on donne au conteneur le moins de privilèges possible.