_dockerFileLayersRender = {
aptitek.renderDockerLayers("#docker-file-layers-container", {
layers: [
{
step: 4,
command: 'CMD ["python", "app.py"]',
desc: "Point d'entrée du conteneur (Métadonnées de démarrage & commande par défaut).",
type: "cmd",
size: "0 B",
status: "read-only",
hash: "sha256:d8a5719e83b4"
},
{
step: 3,
command: "COPY . /app",
desc: "Copie du code source applicatif local vers le répertoire de travail dans l'image.",
type: "copy",
size: "1.2 MB",
status: "read-only",
hash: "sha256:c2b19280a91f"
},
{
step: 2,
command: "RUN pip install -r requirements.txt",
desc: "Exécution de l'installateur de dépendances pour ajouter les bibliothèques Python.",
type: "run",
size: "45.8 MB",
status: "read-only",
hash: "sha256:a98104ff2e11"
},
{
step: 1,
command: "FROM python:3.11-alpine",
desc: "Image parent de base (Système d'exploitation Linux Alpine minimal avec runtime Python).",
type: "from",
size: "52.3 MB",
status: "base",
hash: "sha256:7f9011a0c8b2"
}
]
});
}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 :
- Si l’instruction et les fichiers concernés n’ont pas changé \(\rightarrow\) CACHE HIT (réutilisation instantanée de la couche existante).
- 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"]