🔝 Retour au Sommaire
Une image Docker est un modèle en lecture seule qui contient tout ce dont vous avez besoin pour exécuter une application. Vous pouvez la comparer à une recette de cuisine ou à un plan de construction.
Imaginez une image Docker comme un instantané figé d'un système qui contient :
- Le système d'exploitation de base (une version légère de Linux, par exemple)
- Votre code applicatif
- Les bibliothèques et dépendances nécessaires
- Les fichiers de configuration
- Les commandes à exécuter au démarrage
Pensez à une image Docker comme à un disque d'installation ou une image ISO d'un système d'exploitation. Tout comme vous pouvez installer Windows à partir d'un DVD sur plusieurs ordinateurs, vous pouvez créer plusieurs conteneurs à partir d'une seule image Docker.
Image = Le moule
Conteneur = L'objet créé à partir du moule
Une image Docker est immuable, ce qui signifie qu'elle ne peut pas être modifiée une fois créée. Si vous voulez apporter des changements, vous devez créer une nouvelle image.
Cette immutabilité garantit que :
- Votre application se comportera toujours de la même manière
- Vous pouvez reproduire exactement le même environnement partout
- Les déploiements sont prévisibles et fiables
Les images Docker sont portables : elles fonctionnent de la même manière sur n'importe quel système qui exécute Docker, que ce soit :
- Votre ordinateur portable sous Windows
- Un serveur Linux
- Un Mac
- Le cloud (AWS, Azure, Google Cloud)
C'est ce qui résout le fameux problème "ça marche sur ma machine, mais pas en production !"
Contrairement aux machines virtuelles qui contiennent un système d'exploitation complet, les images Docker sont légères car elles partagent le noyau du système hôte et ne contiennent que le strict nécessaire.
L'un des concepts les plus importants à comprendre est que les images Docker sont construites en couches superposées (layers).
Chaque instruction dans un fichier de construction (Dockerfile) crée une nouvelle couche :
┌─────────────────────────────┐
│ Votre application │ ← Couche 4
├─────────────────────────────┤
│ Dépendances (Node.js, etc) │ ← Couche 3
├─────────────────────────────┤
│ Outils système │ ← Couche 2
├─────────────────────────────┤
│ Système de base (Ubuntu) │ ← Couche 1
└─────────────────────────────┘
- Réutilisation : Si plusieurs images utilisent la même couche de base (par exemple Ubuntu), Docker ne la télécharge qu'une seule fois
- Efficacité : Seules les couches modifiées sont re-téléchargées ou reconstruites
- Rapidité : Le partage de couches accélère considérablement les téléchargements et les constructions
Exemple concret : Si vous avez 10 applications Node.js, toutes partageront les mêmes couches de base (Ubuntu + Node.js), et seule votre application sera différente dans chaque image.
Docker Hub est le registre public officiel qui héberge des milliers d'images prêtes à l'emploi. C'est comme un "App Store" pour Docker.
Vous y trouverez des images officielles pour :
- Des langages de programmation (Python, Node.js, Java, PHP...)
- Des bases de données (MySQL, PostgreSQL, MongoDB...)
- Des serveurs web (Nginx, Apache...)
- Des systèmes d'exploitation (Ubuntu, Alpine Linux...)
Images officielles :
- Maintenues par Docker Inc. ou par l'éditeur du logiciel
- Vérifiées et sécurisées
- Mises à jour régulièrement
- Identifiables par un badge "Official Image" sur Docker Hub
- Exemple :
nginx,postgres,ubuntu
Images communautaires :
- Créées par des utilisateurs
- Préfixées par le nom d'utilisateur :
utilisateur/nom-image - À utiliser avec précaution (vérifier la popularité, les téléchargements, les mises à jour)
- Exemple :
johndoe/mon-application
Vous pouvez également créer vos propres images personnalisées pour vos applications spécifiques (nous verrons cela en détail dans le chapitre 5).
Les images Docker suivent une convention de nommage précise :
[registry/][utilisateur/]nom:tag
nginx→ Image officielle de Nginx, tag "latest" par défautnginx:1.27→ Image Nginx avec la version spécifique 1.27ubuntu:22.04→ Image Ubuntu version 22.04node:18-alpine→ Image Node.js version 18 basée sur Alpine Linux (version ultra-légère)monnom/mon-app:v1.0→ Image personnelle, version 1.0
Le tag latest est le tag par défaut, mais attention : il ne signifie pas toujours "la plus récente". C'est simplement un tag comme un autre qui est appliqué par convention à une version de l'image.
Bonne pratique : En production, utilisez toujours des tags de version spécifiques plutôt que latest pour garantir la stabilité.
Chaque image possède un Image ID : une empreinte numérique unique (hash SHA256) qui l'identifie de manière certaine.
Exemple : sha256:abc123def456...
Cet identifiant garantit l'intégrité de l'image : si un seul bit change, l'ID sera différent.
Sur votre machine, les images Docker sont stockées localement par le Docker Engine. Vous n'avez généralement pas besoin de savoir où exactement, car Docker gère cela pour vous.
Quand vous téléchargez une image :
- Docker vérifie si elle existe déjà localement
- Si non, il la télécharge depuis le registre (Docker Hub par défaut)
- L'image est stockée dans le cache local de Docker
- Vous pouvez maintenant créer des conteneurs à partir de cette image instantanément
La taille des images est un critère important :
- Images complètes : Basées sur Ubuntu, Debian (100-500 MB ou plus)
- Images slim : Versions allégées (~50-150 MB)
- Images Alpine : Ultra-légères, basées sur Alpine Linux (5-50 MB)
Exemple :
python:3.11→ environ 920 MBpython:3.11-slim→ environ 125 MBpython:3.11-alpine→ environ 50 MB
- Images complètes : Pour le développement, débogage facile
- Images slim : Bon compromis pour la production
- Images Alpine : Production optimisée, mais peut nécessiter des ajustements
Voici quelques images de base fréquemment utilisées :
| Image | Description | Cas d'usage |
|---|---|---|
alpine |
Distribution Linux ultra-légère (5 MB) | Base pour des images optimisées |
ubuntu |
Distribution Linux populaire | Développement, familiarité |
debian |
Distribution Linux stable | Applications nécessitant stabilité |
scratch |
Image vide (0 MB) | Exécutables statiques, maximum de légèreté |
1. CRÉATION
(via Dockerfile ou commit)
↓
2. STOCKAGE LOCAL
(dans le cache Docker)
↓
3. PUBLICATION (optionnelle)
(vers Docker Hub ou registre privé)
↓
4. TÉLÉCHARGEMENT
(pull depuis un registre)
↓
5. UTILISATION
(création de conteneurs)
↓
6. SUPPRESSION
(nettoyage des images inutilisées)
C'est LA distinction fondamentale à bien comprendre :
| Aspect | Image | Conteneur |
|---|---|---|
| Nature | Modèle statique, template | Instance en cours d'exécution |
| État | Immuable, en lecture seule | Modifiable, possède un état |
| Nombre | Une image peut exister en un seul exemplaire | Une image peut créer des milliers de conteneurs |
| Analogie | La classe en programmation | L'objet/instance en programmation |
| Stockage | Stockée sur disque | S'exécute en mémoire |
Analogie simple :
- Image = Programme installé (comme Word ou Chrome sur votre disque)
- Conteneur = Programme en cours d'exécution (la fenêtre Word ouverte)
Vous pouvez ouvrir plusieurs fenêtres Word (conteneurs) à partir du même programme installé (image).
✅ Une image Docker est un modèle immuable contenant tout le nécessaire pour exécuter une application
✅ Les images sont construites en couches superposées pour optimiser le stockage et les transferts
✅ Docker Hub est le registre public principal où trouver des milliers d'images prêtes à l'emploi
✅ Privilégiez les images officielles et utilisez des tags de version spécifiques en production
✅ Une image sert de base pour créer un ou plusieurs conteneurs
✅ Les images sont légères comparées aux machines virtuelles et garantissent la portabilité
Dans le prochain chapitre (3.2), nous verrons comment utiliser ces images pour créer et gérer des conteneurs Docker, c'est-à-dire comment donner vie à ces modèles statiques pour exécuter réellement vos applications.
Vous apprendrez également les commandes essentielles pour :
- Rechercher des images
- Télécharger des images
- Lister vos images locales
- Inspecter les détails d'une image
- Supprimer des images
Maintenant que vous comprenez ce qu'est une image Docker, vous êtes prêt à passer à l'étape suivante : les conteneurs !