Aller au contenu principal

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

AspectImageConteneur
NatureTemplate statiqueInstance en exécution
ÉtatLecture seuleLecture/écriture
StockageCouches partagéesCouche d'écriture propre
Durée de viePermanenteÉ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

TypeExempleDescription
OfficiellenginxMaintenue par Docker
Vérifiéebitnami/nginxÉditeur vérifié
Communautaireuser/imageCréé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

TagDescription
latestDernière version (par défaut)
1.25, 1.25.3Version sémantique
alpineBasée sur Alpine Linux (légère)
slimVersion allégée
bullseye, bookwormVersion 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

ArchitectureDescriptionExemples
amd64Intel/AMD 64-bitPC, Serveurs
arm64ARM 64-bitMac M1/M2, Raspberry Pi 4
arm/v7ARM 32-bitRaspberry 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é

CommandeDescription
docker pullTélécharger une image
docker imagesLister les images
docker image inspectInspecter une image
docker historyVoir les couches
docker rmiSupprimer une image
docker tagCréer un nouveau tag
docker pushPousser vers un registre
docker image pruneNettoyer 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

  1. Téléchargez l'image python:3.11-alpine et inspectez-la
  2. Listez toutes les couches de l'image nginx
  3. Créez un nouveau tag pour une image existante
  4. Calculez l'espace disque utilisé par Docker

← Installation | Conteneurs Docker →