Semaine 1 · Laboratoire

Le conteneur
from scratch

Construire une prison applicative à la main, sans Docker. Quand vous verrez docker run la semaine prochaine, vous saurez exactement ce qu'il vous épargne.

420-5A4-MT · Expérimentation · 1 point bonus
Semaine 1 · Contexte Client Cornucopia

Cornucopia · Le Projet Maraîcher

Flora et Hazel dirigent Cornucopia, une ferme maraîchère éco-responsable produisant des paniers bios de saison. Elles souhaitent numériser la distribution directe de leurs récoltes.
Mission de l'Entreprise

Rapprocher les consommateurs locaux de la terre grâce à un portail de commande transparent et réactif.

Semaine 1 · Le Produit Web

Le Produit : Premier Catalogue Bio

Nouveauté sur le Site

Mise en ligne d'un premier site vitrine avec fiches conseils de plantation et formulaire de réservation de paniers hebdomadaires.

Semaine 1 · Achalandage & Risque

Achalandage (100 vis/j) & Serveur Artisanal

Niveau de Fréquentation

10 à 100 visiteurs par jour

Les voisins et clients du marché découvrent le site vitrine.

⚠️ Incident / Risque Système

Le site repose sur un serveur LAMP artisanal hébergé sur une vieille tour dans la grange, sans isolation ni sauvegarde récurrente.

Semaine 1 · Mission du Laboratoire

Problème Technique & Solution From Scratch

Le Problème Système

Aucune isolation applicative. Si le serveur hôte plante ou subit un incident, tout le commerce de la ferme est perdu.

✅ Objectif du Laboratoire

Construire manuellement la toute première prison applicative (chroot, unshare, cgroups) from scratch pour isoler le site de Cornucopia avant d'adopter Docker !

L'esprit du laboratoire

Pourquoi à la main ?

1979 : la commande chroot enferme un processus dans un répertoire. 2013 : Docker conquiert le monde. Entre les deux, rien de magique : Docker ne fait qu'assembler élégamment des mécanismes que Linux possède depuis longtemps. Aujourd'hui, premier jour du cours, vous touchez ces mécanismes un par un, à main levée. C'est le seul laboratoire de la session sans Docker, et c'est voulu : on ne peut pas apprécier un service qu'on n'a jamais rendu soi-même.

Le format est celui d'une expérimentation : la présence sur la période est évaluée (1 point), le fonctionnement final est souhaitable mais pas obligatoire. On explore, on se trompe, on démonte, on recommence. Seul prérequis : votre Linux.

La mission du jour

À la fin de la séance, vous aurez :

Défi de l'expérimentation : votre prison exécute une commande simple de votre choix, autre que nano. Montrez-la avant de partir, ou montrez vos ruines : les deux comptent.

Étape 1

L'image : un système de fichiers dans un fichier

Tout le système de la prison vivra dans un seul fichier ordinaire, formaté puis monté sur un répertoire. Retenez ce mot : une image. Docker emploiera exactement le même.

cd
MOUNTPOINT='conteneurfs'
IMAGE='conteneurimage'
BLOCKS=100000
# un fichier de zeros, assez grand pour contenir un monde
dd if=/dev/zero of=$IMAGE bs=8192 count=$BLOCKS
mkfs.ext4 $IMAGE
mkdir $MOUNTPOINT
sudo mount $IMAGE $MOUNTPOINT
cd $MOUNTPOINT

Le fichier est monté sur un point de montage : tout ce qu'on écrira dans le répertoire ira, en réalité, dans le fichier.

Étape 2

Un petit monde qui imite le grand

La prison doit ressembler à un vrai Linux vu de l'intérieur : on recrée la même arborescence que la racine, en miniature. Comme une fractale.

sudo mkdir bin sbin usr usr/bin usr/sbin etc proc sys dev root home lib usr/lib lib64 tmp var var/tmp var/lib run
sudo chmod 1777 tmp var/tmp
ls

Comparez avec ls / sur votre machine : le même squelette, vide pour l'instant. À nous de choisir ce qui entre : c'est exactement la question qu'un Dockerfile répondra plus tard.

Étape 3

Les essentiels : un shell et son linker

Pour exécuter quoi que ce soit dans la prison, il faut au minimum un shell, l'interprète de liens (le linker), leurs bibliothèques, et quelques fichiers d'identité :

sudo cp /bin/bash bin
sudo cp -a /etc/passwd /etc/shadow /etc/group /etc/gshadow etc
sudo cp /lib64/ld-linux-x86-64.so.2 lib64
sudo cp /sbin/ldconfig* sbin
sudo cp -a /etc/ld.so.conf* etc
# les bibliotheques de bash : ldd les liste, awk extrait le chemin
sudo cp `ldd /bin/bash | awk '{print $3}'` lib
# l ecran doit comprendre votre terminal
sudo mkdir -p lib/terminfo/x
sudo cp /lib/terminfo/x/$TERM lib/terminfo/x/xterm

La ligne ldd + awk est la clé du jour : elle vous servira pour chaque commande que vous voudrez importer.

Étape 4

Busybox : cent commandes en une

Copier chaque commande avec ses bibliothèques deviendrait long. Busybox règle ça : un seul exécutable, compilé statique (aucune dépendance), qui sait se prendre pour ls, cp, mount, vi et une centaine d'autres.

cd
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar xvf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
make defconfig
make LDFLAGS=-static
sudo cp busybox ~/$MOUNTPOINT/usr/bin
cd ~/$MOUNTPOINT

La compilation prend quelques minutes : parfait pour aller voir où en sont les voisins. C'est aussi la doyenne des astuces des conteneurs minimalistes : les images Docker les plus fines du monde sont bâties sur Busybox.

Étape 5

Entrer dans la prison

Un petit script d'initialisation installe les liens Busybox, indexe les bibliothèques et monte /dev, puis chroot bascule la racine : de l'intérieur, le reste de la machine n'existe plus.

SETUP='init.sh'
sudo touch $SETUP
sudo chmod 0777 $SETUP
echo '#!/usr/bin/busybox sh' > $SETUP
echo '/usr/bin/busybox --install' >> $SETUP
echo '/sbin/ldconfig' >> $SETUP
echo 'mount -t devtmpfs udev /dev' >> $SETUP
sudo chroot . /$SETUP
# vous voila dedans : regardez autour
ls /
pwd
exit

Faites le tour du propriétaire : essayez de voir vos fichiers de l'hôte. Impossible ? C'est le cloisonnement, premier pilier du conteneur.

Étape 6 · Le défi

Votre commande à vous

Le livrable de l'expérimentation : importer dans la prison une commande simple de votre choix, autre que nano, et la faire tourner dedans. La procédure est toujours la même :

# depuis l hote, a la racine de la prison
sudo cp /usr/bin/VOTRECOMMANDE usr/bin
sudo cp `ldd /usr/bin/VOTRECOMMANDE | awk '{print $3}'` lib
sudo chroot . /usr/bin/VOTRECOMMANDE
Étape 7

Unshare : des ressources bien à soi

Le chroot cache les fichiers, mais la prison voit encore les processus et le nom d'hôte de la machine. Les espaces de nommage séparent le reste :

sudo unshare --root=. -f -p --mount-proc
TERM="xterm"
# dans le conteneur : qui vit ici ?
ps
hostname prison
hostname
exit

Un ps qui ne voit que deux processus, un nom d'hôte à soi : votre prison est devenue un vrai petit conteneur. C'est le deuxième pilier : chroot cloisonne les fichiers, les espaces de nommage cloisonnent tout le reste.

Étape 8

Fermer le conteneur

Avant de partir, on démonte proprement. Et si tout est cassé en chemin : mêmes commandes, puis on recommence du début, plus vite que la première fois.

cd
sudo umount -q $MOUNTPOINT/dev
sudo umount -q $MOUNTPOINT
rm -rf $MOUNTPOINT

Remarquez ce qui survit : le fichier conteneurimage. Le conteneur est parti, l'image reste, prête à être remontée ou copiée sur une autre machine. Gardez cette idée précieusement : c'est toute la philosophie de Docker.

La suite

Ce que Docker vous épargnera

Faites la liste de votre journée : créer une image, la formater, la monter, bâtir l'arborescence, copier un shell, traquer des bibliothèques, compiler Busybox, écrire un script d'initialisation, chrooter, unsharer, démonter. La semaine prochaine, tout ça tiendra dans une seule commande : docker run. Elle prendra une seconde. Vous saurez précisément le service qu'on vous rend, parce qu'aujourd'hui, vous l'avez rendu vous-même.

Version de départ · ce diaporama va s'enrichir