Création d’Images avec Dockerfile

Docker
Système & Réseau
Rédiger des Dockerfiles optimisés et sécurisés pour automatiser la construction d’images personnalisées.

Un Dockerfile est un fichier texte contenant la suite d’instructions exécutées par le Docker Daemon pour construire automatiquement une image personnalisée.

Rédiger un bon Dockerfile ne consiste pas seulement à faire fonctionner son code : c’est un art qui vise à produire des images légères, sécurisées et rapides à construire grâce à la gestion du cache.

🍰 Le Concept des Couches (Layers)

Une image Docker n’est pas un bloc monolithique : c’est un mille-feuille de couches immuables en lecture seule.

Chaque instruction (FROM, RUN, COPY) crée une nouvelle couche de système de fichiers superposée aux précédentes.

Visualiseur d’Empilement des Couches Docker

📖 Référence des Instructions Essentielles

Instruction Description Exemple
FROM Obligatoire. Spécifie l’image de base parent. FROM python:3.11-alpine
WORKDIR Définit le dossier de travail courant (équivalent cd). WORKDIR /app
COPY Copie des fichiers locaux vers l’image. Privilégier à ADD. COPY package.json .
RUN Exécute des commandes lors du build pour installer des paquets. RUN apk add --no-cache curl
CMD Commande par défaut exécutée au lancement du conteneur. CMD ["node", "server.js"]
ENTRYPOINT Définit le binaire fixe du conteneur (difficilement surchargeable). ENTRYPOINT ["python3"]
ENV Définit des variables d’environnement persistantes. ENV PORT=8080
EXPOSE Documente le port d’écoute du conteneur (ne l’ouvre pas). EXPOSE 8080
USER Spécifie un utilisateur non-root pour des raisons de sécurité. USER node

⚡ La Gestion du Cache Docker : L’Ordre des Instructions

Lors d’un docker build, Docker parcourt les instructions dans l’ordre :

  1. Si l’instruction et les fichiers concernés n’ont pas changé \(\rightarrow\) CACHE HIT (réutilisation instantanée de la couche existante).
  2. Si un fichier a été modifié \(\rightarrow\) CACHE MISS (reconstruction de la couche ET invalidation en cascade de TOUTES les couches suivantes).

🧪 Simulateur Interactif : Impact de l’Invalidation du Cache

Testez l’impact du type de fichier modifié sur les performances de votre docker build :

Inspecteur du Cache de Build Docker

COPY . . est placé avant RUN pip install.

COPY requirements.txt . est placé avant RUN pip install.

Rapport d’Exécution du Build

⚖️ Choix de l’Image de Base : Ubuntu vs Alpine

Le choix de l’image de départ détermine la taille finale de votre image et sa surface d’attaque sécurité.

Comparatif de Taille des Images de Base

🚀 Build Multi-Étapes (Multi-Stage Build)

Pour les langages compilés (Go, Java, Rust, C++), découvrez le gain spectaculaire de taille entre un build classique à étape unique et un Multi-Stage Build :

Gain de Taille : Single-Stage vs Multi-Stage Build
# Étape 1 : Build (image lourde avec le compilateur Go)
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o mon-app

# Étape 2 : Runtime (image ultra-minimale)
FROM alpine:3.18
WORKDIR /app
# Copie uniquement le binaire compilé depuis l'étape 'builder'
COPY --from=builder /app/mon-app .

CMD ["./mon-app"]