Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Écrire un Dockerfile et lire ses couches

Après cette leçon: Je peux écrire un Dockerfile et dire quelles étapes sont refaites après un changement.

Leçon de 55 min4 commandesLab Docker : apprendre conteneurs, journaux et redémarrages en réparant un service en panne

Quatre minutes pour une ligne changée

Un Dockerfile est un fichier texte qui décrit, étape par étape, comment construire une image. L’ordre de ses étapes décide du temps de construction.

Une équipe change une ligne du code d’une boutique. La construction dure quatre minutes, car elle retélécharge toutes les bibliothèques.

Une autre équipe change la même ligne et attend une seconde. Les deux ont écrit un fichier de construction. Elles ont écrit les étapes dans un ordre différent.

À la fin de cette leçon

Remarque

Je peux écrire un Dockerfile et dire quelles étapes sont refaites après un changement.

Mots-clés

MotCe que ça veut dire
Dockerfileun fichier texte d’étapes qui construit une image
Image de basel’image dont une construction part
Couche (layer)le résultat gardé d’une étape de construction
Cachedes couches gardées qu’une construction réutilise
Construire (build)fabriquer une image en exécutant les étapes

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Ce que le labo ne peut pas faire

Remarque

Le docker du labo refuse de construire ou de télécharger une image : une construction lance des étapes avec des droits sur la machine. Nous avons construit ces Dockerfile sur notre machine. Vous les lisez, regardez ce qu’une image laisse dans un conteneur, et vérifiez votre fichier dans le devoir. Pour construire vraiment, utilisez votre machine.

Un Dockerfile est une liste d’étapes

Chaque ligne commence par un mot d’instruction. FROM nomme l’image de base. COPY apporte des fichiers. RUN lance une commande pendant la construction. CMD dit quoi lancer quand un conteneur démarre.

Docker lit les lignes depuis le haut. Voici une petite boutique écrite ainsi.

Un Dockerfile pour une petite boutique Python

Code: bash
FROM python:3.12-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
CMD ["python", "app.py"]

Le dossier de départ, réglé par WORKDIR

Commande
docker inspect --format '{{.Config.WorkingDir}}' cache

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Le signal qui arrête web, réglé par STOPSIGNAL

Commande
docker inspect --format '{{.Config.StopSignal}}' web

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple travaillé : ce que chaque instruction laisse

InstructionCe qu’elle fait à la constructionOù on la revoit ensuite
FROMpart d’une image de baseConfig.Image nomme l’image
WORKDIRrègle le dossier des étapes suivantesConfig.WorkingDir, /data pour cache
EXPOSEdit quelle porte le programme utiliseConfig.ExposedPorts, 80/tcp pour web
STOPSIGNALdit comment demander l’arrêt du programmeConfig.StopSignal, SIGQUIT pour web
COPY et RUNajoutent des fichiers et lancent des commandesune nouvelle couche chacun

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Chaque étape fait une couche

Une construction garde le résultat de chaque étape comme une couche. Les couches sont empilées, et une image est toute la pile. Une couche ne change plus une fois faite.

Un conteneur ajoute une fine couche au-dessus, où il écrit. docker diff liste ce qu’il y a dans cette couche du dessus.

Exemple travaillé : les couches de l’image

ÉtapeTaille sur notre machine de test
L’image de base, python:3.12-alpineenviron 48 Mo pour sa plus grosse couche
WORKDIR /app8 ko
COPY requirements.txt .12 ko
RUN pip install ...10,6 Mo
COPY app.py .12 ko
CMD ["python", "app.py"]0 o

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Écrire un fichier dans web

Commande
docker exec web touch /tmp/layer-demo.txt

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Le retrouver dans la couche du dessus

Commande
docker diff web | grep layer-demo

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Le cache réutilise une couche inchangée

Avant de lancer une étape, Docker pose une question. Est-ce la même étape, avec les mêmes fichiers que la dernière fois, et tout ce qui est au-dessus était-il pareil ? Si oui, il réutilise la couche gardée. C’est le cache.

La première étape qui diffère est refaite. Toutes les suivantes aussi. Mettez en haut ce qui change le moins.

Ordre 1 : tout copier d’abord

Code: bash
FROM python:3.12-alpine
WORKDIR /app
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "app.py"]

Exemple travaillé : modifier app.py, puis reconstruire

ÉtapeOrdre 1Ordre 2 (le premier Dockerfile ci-dessus)
WORKDIR /appen cacheen cache
COPY requirements.txt .absente dans cet ordreen cache
COPY . .refaiteabsente dans cet ordre
RUN pip install ...refaite, 11 secondesen cache
COPY app.py .absente dans cet ordrerefaite, moins d’une seconde

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une erreur fréquente

Attention

On croit souvent que Docker ne refait que la ligne qu’on a modifiée. Il refait cette étape et toutes celles d’après. Copiez d’abord le fichier qui liste vos bibliothèques et installez-les, puis copiez votre propre code. L’étape lente reste alors en cache.

Pour aller plus loin

Écrivez le Dockerfile d’un petit site à vous. Partez de nginx:1.27-alpine, copiez un seul index.html dans /usr/share/nginx/html et n’ajoutez rien d’autre.

Sur une machine avec Docker, construisez-le deux fois. La seconde construction doit afficher CACHED à chaque étape.

À propos de ce labo et de sa source: Lab Docker : apprendre conteneurs, journaux et redémarrages en réparant un service en panne

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.