Images et layers
Une image Docker n'est pas un fichier monolithique. C'est une pile de layers read-only, chacun représentant un delta par rapport au layer précédent. Comprendre ce système permet d'optimiser le cache de build, de réduire les tailles d'image et de diagnostiquer les problèmes de stockage.
Anatomie d'un layer
Chaque instruction RUN, COPY ou ADD dans un Dockerfile crée un layer. Les layers sont stockés dans /var/lib/docker/overlay2/ avec overlayfs : le layer du haut est writable (le container layer), les layers du dessous sont read-only (les image layers).
# Voir les layers d'une image
docker history nginx:alpine
# Détail complet
docker inspect nginx:alpine | jq '.[0].RootFS'
# Taille de chaque layer
docker history --no-trunc nginx:alpineCache de build
Docker cache chaque layer. Si les fichiers sources d'un layer n'ont pas changé depuis le dernier build, le layer est réutilisé. L'ordre des instructions dans le Dockerfile est donc critique :
- Les instructions qui changent rarement (installation de dépendances) doivent être en haut
- Le code applicatif (qui change souvent) doit être en bas
# Mauvais : invalidation du cache à chaque changement de code
COPY . /app
RUN pip install -r /app/requirements.txt
# Bon : les dépendances sont cachées tant que requirements.txt ne change pas
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /appLayers partagés
Plusieurs images peuvent partager les mêmes layers. Si app-v1 et app-v2 utilisent toutes les deux debian:13 comme base, les layers de Debian ne sont stockés qu'une fois sur le disque.
# Espace réel utilisé par Docker
docker system df
# Détail par image
docker system df -vImages orphelines (dangling)
Après plusieurs builds, des images sans tag (<none>) s'accumulent. Ce sont d'anciens layers qui ne sont plus référencés par aucun tag.
# Lister les images dangling
docker images -f "dangling=true"
# Nettoyer
docker image prune
# Nettoyer toutes les images inutilisées (pas seulement dangling)
docker image prune -aInspecter le contenu d'une image
# Lancer un shell dans l'image pour explorer
docker run --rm -it nginx:alpine sh
# Copier un fichier depuis une image sans la lancer
docker create --name tmp nginx:alpine
docker cp tmp:/etc/nginx/nginx.conf ./nginx.conf
docker rm tmp