Pourtant, ça marchait sur mon poste
Inès travaille pour une épicerie en ligne à Lille. Elle a écrit le service qui enregistre les commandes. Sur son ordinateur portable, tout fonctionne.
Le lundi matin, sur le serveur, le service plante au démarrage. Le serveur a une ancienne version de Python et il lui manque une bibliothèque.
Ce problème a coûté des journées entières à beaucoup d'équipes. Cette leçon présente l'outil qui l'évite.
À la fin de cette leçon
Remarque
Je peux expliquer ce qu'est un conteneur et pourquoi les équipes s'en servent.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Dépendance | ce dont une application a besoin pour tourner | Python 3.12, une bibliothèque |
| Conteneur | une application qui tourne avec tout ce qu'il lui faut, isolée du reste | |
| Image | le paquet figé à partir duquel on démarre un conteneur | |
| Dockerfile | un fichier texte qui liste les étapes pour fabriquer une image | |
| Registre | un entrepôt partagé d'images | |
| Machine virtuelle | un ordinateur simulé complet, avec son propre système |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un conteneur transporte ses dépendances
Toute application a des dépendances : une version précise de Python, des bibliothèques, quelques réglages.
Un conteneur réunit l'application et ses dépendances. Il tourne à l'écart du reste de la machine.
L'application retrouve donc le même Python et les mêmes bibliothèques partout. Le portable d'Inès et le serveur ne sont plus différents pour elle.
La même application à trois endroits
| Où elle tourne | Python trouvé | Bibliothèque trouvée | Résultat |
|---|---|---|---|
| Portable d'Inès | 3.12 | Oui | Fonctionne |
| Serveur, sans conteneur | 3.8 | Non | Plante |
| Serveur, dans un conteneur | 3.12, apporté par l'image | Oui, apportée par l'image | Fonctionne |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup pensent qu'un conteneur est une petite machine virtuelle. Ce n'est pas le cas. Une machine virtuelle fait tourner tout un système d'exploitation à elle. Un conteneur partage le système de la machine et n'emporte que l'application et ses dépendances. C'est pour cela qu'il démarre en une seconde environ.
Une image se fabrique avec un Dockerfile
On ne prépare pas un conteneur à la main. On écrit un Dockerfile : une courte liste d'étapes.
Un outil lit ces étapes dans l'ordre et fabrique une image. Tous les conteneurs lancés depuis cette image sont identiques.
Ci-dessous, Bash écrit un vrai Dockerfile puis le relit. Lisez chaque ligne, puis faites la modification du dernier commentaire.
Écrire et relire un Dockerfile
mkdir -p service-commandes && cd service-commandes
printf 'print("Le service des commandes tourne")\n' > appli.py
printf 'flask==3.0.3\n' > requirements.txt
cat > Dockerfile <<'FIN'
FROM python:3.12-slim
WORKDIR /appli
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY appli.py .
CMD ["python", "appli.py"]
FIN
# Affiche la recette avec le numéro de chaque ligne
cat -n Dockerfile
# Quelle image de départ ?
grep FROM Dockerfile
# Remplacez python:3.12-slim par python:3.11-slim plus haut, puis relancez.
Ce que fait chaque ligne
| Ligne | Ce qu'elle fait |
|---|---|
| FROM python:3.12-slim | Part d'une image qui contient déjà Python 3.12 |
| WORKDIR /appli | Travaille dans le dossier /appli |
| COPY requirements.txt . | Copie la liste des bibliothèques |
| RUN pip install -r requirements.txt | Installe ces bibliothèques dans l'image |
| COPY appli.py . | Copie le code de l'application |
| CMD ["python", "appli.py"] | Indique quoi lancer au démarrage du conteneur |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Pourquoi les équipes s'en servent
L'équipe fabrique l'image une seule fois. Elle la dépose dans un registre, un entrepôt partagé d'images.
Le serveur de test et le serveur de production récupèrent la même image. Ce qui a passé les tests est exactement ce que voient les clients.
Pendant les soldes, l'équipe lance dix copies de l'image au lieu d'une. Chaque copie démarre en quelques secondes.
Ce qu'affichent les vraies commandes
| Commande | Ce qu'elle affiche | Ce que cela veut dire |
|---|---|---|
| docker build -t commandes:1.4 . | Successfully tagged commandes:1.4 | L'image est prête, nommée commandes, version 1.4 |
| docker push registre.exemple.fr/commandes:1.4 | 1.4: digest: sha256:9f2c... | L'image est dans le registre |
| docker run -d commandes:1.4 | 3b7e1c0a9d42 | Un conteneur a démarré, voici son identifiant |
| docker ps | 3b7e1c0a9d42 commandes:1.4 Up 5 seconds | Un conteneur tourne depuis 5 secondes |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.