Images Docker
Objectifs du chapitre
- Comprendre ce qu'est une image Docker
- Télécharger et gérer des images
- Comprendre les tags et les layers
- Utiliser Docker Hub efficacement
1 - Qu'est-ce qu'une image Docker ?
Définition
Une image Docker est un template en lecture seule contenant :
- Un système de fichiers (rootfs)
- Les dépendances de l'application
- La configuration d'exécution
- Les métadonnées
┌─────────────────────────────────────────────────┐
│ Image Docker │
├─────────────────────────────────────────────────┤
│ Layer 4: Application code │
├─────────────────────────────────────────────────┤
│ Layer 3: Dependencies (npm, pip...) │
├─────────────────────────────────────────────────┤
│ Layer 2: Runtime (Node.js, Python...) │
├─────────────────────────────────────────────────┤
│ Layer 1: Base OS (Ubuntu, Alpine...) │
└─────────────────────────────────────────────────┘
Image vs Conteneur
| Aspect | Image | Conteneur |
|---|---|---|
| Nature | Template statique | Instance en exécution |
| État | Lecture seule | Lecture/écriture |
| Stockage | Couches partagées | Couche d'écriture propre |
| Durée de vie | Permanente | Éphémère |
2 - Rechercher des images
Sur Docker Hub
# Rechercher une image
docker search nginx
# Rechercher avec filtres
docker search --filter=stars=100 nginx
docker search --filter=is-official=true nginx
# Limiter les résultats
docker search --limit 5 nginx
Résultat de recherche
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx 18000 [OK]
bitnami/nginx Bitnami nginx 150
linuxserver/nginx ... 120
Types d'images
| Type | Exemple | Description |
|---|---|---|
| Officielle | nginx | Maintenue par Docker |
| Vérifiée | bitnami/nginx | Éditeur vérifié |
| Communautaire | user/image | Créée par la communauté |
Attention
Privilégiez toujours les images officielles ou vérifiées pour la sécurité.
3 - Télécharger des images
Commande docker pull
# Télécharger la dernière version
docker pull nginx
# Télécharger une version spécifique
docker pull nginx:1.25
# Télécharger une image Alpine (légère)
docker pull nginx:alpine
# Télécharger depuis un autre registre
docker pull gcr.io/google-containers/nginx
Anatomie d'un nom d'image
[registre/][utilisateur/]image[:tag][@digest]
Exemples:
nginx # Docker Hub, officiel, latest
nginx:1.25 # Tag spécifique
bitnami/nginx:latest # Utilisateur/organisation
gcr.io/project/app:v1 # Registre privé
nginx@sha256:abc123... # Digest (hash)
Tags courants
| Tag | Description |
|---|---|
latest | Dernière version (par défaut) |
1.25, 1.25.3 | Version sémantique |
alpine | Basée sur Alpine Linux (légère) |
slim | Version allégée |
bullseye, bookworm | Version Debian |
Bonne pratique
Évitez latest en production. Utilisez des tags versionnés pour la reproductibilité.
4 - Lister et inspecter les images
Lister les images
# Lister toutes les images
docker images
# OU
docker image ls
# Format personnalisé
docker images --format "{{.Repository}}:{{.Tag}} - {{.Size}}"
# Filtrer par nom
docker images nginx
# Afficher les images intermédiaires
docker images -a
# Afficher uniquement les IDs
docker images -q
Sortie typique
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest a8758716bb6a 2 days ago 187MB
nginx alpine 5685937b6bc1 2 days ago 40.7MB
ubuntu 22.04 3db8720ecbf5 3 weeks ago 77.9MB
Inspecter une image
# Informations détaillées
docker image inspect nginx
# Extraire des informations spécifiques
docker image inspect nginx --format '{{.Config.ExposedPorts}}'
docker image inspect nginx --format '{{.Architecture}}'
docker image inspect nginx --format '{{json .Config.Env}}'
Historique des couches
# Voir les couches d'une image
docker history nginx
# Format détaillé
docker history nginx --no-trunc
5 - Comprendre les layers (couches)
Architecture en couches
┌─────────────────────────────────────────────────┐
│ Conteneur (Layer R/W) │
├─────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────┐ │
│ │ Layer: COPY app.js │ │
│ ├─────────────────────────────────────────┤ │
│ │ Layer: RUN npm install │ │ Image
│ ├─────────────────────────────────────────┤ │ (R/O)
│ │ Layer: WORKDIR /app │ │
│ ├─────────────────────────────────────────┤ │
│ │ Layer: Base image (node:18-alpine) │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
Avantages des couches
1. Partage entre images
# Deux conteneurs basés sur la même image partagent les couches
docker run -d nginx # Télécharge les couches
docker run -d nginx # Réutilise les couches (instantané)
2. Cache de build
# Couches mises en cache si non modifiées
FROM node:18
WORKDIR /app
COPY package*.json ./ # Cache si inchangé
RUN npm install # Cache si inchangé
COPY . . # Invalide le cache si modifié
3. Transfert optimisé
# Seules les couches manquantes sont téléchargées
docker pull nginx:1.25
# Already exists: sha256:abc123...
# Pull complete: sha256:def456...
6 - Gérer les images
Supprimer des images
# Supprimer une image
docker rmi nginx
# OU
docker image rm nginx
# Supprimer par ID
docker rmi a8758716bb6a
# Forcer la suppression
docker rmi -f nginx
# Supprimer plusieurs images
docker rmi nginx ubuntu python
# Supprimer toutes les images non utilisées
docker image prune
# Supprimer TOUTES les images
docker image prune -a
Taguer des images
# Créer un nouveau tag
docker tag nginx:latest mon-nginx:v1
# Taguer pour un registre privé
docker tag nginx:latest mon-registre.io/nginx:v1
# Vérifier
docker images
Sauvegarder et charger des images
# Exporter une image vers un fichier tar
docker save nginx > nginx.tar
docker save -o nginx.tar nginx:latest
# Importer une image depuis un fichier tar
docker load < nginx.tar
docker load -i nginx.tar
7 - Docker Hub
Se connecter
# Connexion interactive
docker login
# Connexion avec identifiants
docker login -u username -p password
# Vérifier la connexion
docker info | grep Username
Pousser une image
# 1. Taguer l'image avec votre username
docker tag mon-app:latest username/mon-app:v1
# 2. Pousser vers Docker Hub
docker push username/mon-app:v1
# 3. Pousser toutes les versions
docker push username/mon-app --all-tags
Registres privés
# Se connecter à un registre privé
docker login registry.example.com
# Pousser vers un registre privé
docker tag mon-app registry.example.com/mon-app:v1
docker push registry.example.com/mon-app:v1
# Tirer depuis un registre privé
docker pull registry.example.com/mon-app:v1
8 - Gestion de l'espace disque
Analyser l'utilisation
# Vue d'ensemble
docker system df
# Vue détaillée
docker system df -v
Sortie typique
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 5 2.5GB 1.8GB (72%)
Containers 8 2 500MB 450MB (90%)
Local Volumes 10 3 1.2GB 800MB (66%)
Build Cache 25 0 512MB 512MB (100%)
Nettoyer
# Nettoyer les images non utilisées
docker image prune
# Nettoyer les images danglings (sans tag)
docker image prune -f
# Nettoyer TOUT (images, conteneurs, volumes, cache)
docker system prune -a --volumes
# Nettoyer les images de plus de 24h
docker image prune -a --filter "until=24h"
9 - Images multi-architectures
Comprendre les architectures
| Architecture | Description | Exemples |
|---|---|---|
amd64 | Intel/AMD 64-bit | PC, Serveurs |
arm64 | ARM 64-bit | Mac M1/M2, Raspberry Pi 4 |
arm/v7 | ARM 32-bit | Raspberry Pi 3 |
Télécharger pour une architecture spécifique
# Télécharger pour une plateforme spécifique
docker pull --platform linux/amd64 nginx
docker pull --platform linux/arm64 nginx
# Vérifier l'architecture d'une image
docker image inspect nginx --format '{{.Architecture}}'
Manifests multi-architectures
# Voir les architectures disponibles
docker manifest inspect nginx
# Docker sélectionne automatiquement la bonne architecture
docker pull nginx # Télécharge pour votre plateforme
Résumé
| Commande | Description |
|---|---|
docker pull | Télécharger une image |
docker images | Lister les images |
docker image inspect | Inspecter une image |
docker history | Voir les couches |
docker rmi | Supprimer une image |
docker tag | Créer un nouveau tag |
docker push | Pousser vers un registre |
docker image prune | Nettoyer les images |
Points clés
- Les images sont des templates en lecture seule
- Les couches permettent le partage et le cache
- Utilisez des tags versionnés en production
- Nettoyez régulièrement les images inutilisées
Exercices pratiques
- Téléchargez l'image
python:3.11-alpineet inspectez-la - Listez toutes les couches de l'image nginx
- Créez un nouveau tag pour une image existante
- Calculez l'espace disque utilisé par Docker