Notes de Cours: Docker

Gestion des Images Docker



← Retour à l'accueil

📖 1. Théorie et Fonctionnement

Une image Docker est un **package** qui inclut tout ce qui est nécessaire à l'exécution d'une application. C'est un **modèle en lecture seule**.

Elle contient :

  • Le code de l'application.
  • L'environnement d'exécution (ex: Node.js, Python).
  • Les bibliothèques et dépendances.
  • Les variables d'environnement.
  • Les fichiers de configuration.

Une image est créée à partir d'un fichier de commandes appelé Dockerfile.

Il est crucial de bien les différencier :

Image (Le "Modèle")

  • État : Passif, immuable (lecture seule).
  • Analogie : Une recette, un plan, un snapshot.
  • Création : Construite depuis un Dockerfile.

Conteneur (L'"Instance")

  • État : Actif, vivant (processus en cours).
  • Analogie : Le gâteau préparé, la maison construite.
  • Création : Lancé depuis une image (ex: docker run).

Une image est composée de plusieurs **couches** superposées. Chaque couche représente une instruction du Dockerfile (ex: une couche pour l'OS, une pour Apache, une pour PHP, etc.).

Schéma du système de fichiers en couches Docker Couche Inscriptible (Conteneur) Couches en Lecture Seule (Image) Ajouté par Docker Conteneur (Couche Inscriptible) Image - Couche 3 (ex: PHP) Image - Couche 2 (ex: Apache) Image - Couche 1 (OS de base)

Schéma illustrant la superposition de la couche inscriptible du conteneur sur les couches en lecture seule de l'image.

  • Efficacité : Les couches sont partagées. Si 10 conteneurs utilisent la même image de base, ils partagent ces couches en lecture seule.
  • Copy-on-Write (CoW) : Lorsqu'un conteneur est lancé, Docker ajoute une fine **couche inscriptible** sur le dessus. Les modifications faites dans le conteneur sont écrites dans cette couche, sans altérer l'image de base.

Exemple Concret : Image Simple vs Image Complexe

Une image simple comme nginx:alpine a très peu de couches. En revanche, une image de développement comme cirrusci/flutter (utilisée pour le développement Flutter) peut contenir des dizaines de couches : une pour l'OS, une pour le SDK, une pour les dépendances... C'est là que l'efficacité du partage de couches prend tout son sens !

💻 2. Commandes de Manipulation

Afficher la liste de toutes les commandes Docker :

Afficher la version de Docker :

Afficher des informations détaillées sur l'installation Docker (nombre d'images, de conteneurs, etc.) :

Rechercher une image sur le Docker Hub (le registre officiel) :

Filtrer la recherche pour n'afficher que les images officielles :

Télécharger une image (par défaut, le tag latest) :

Télécharger une image avec un tag (version) spécifique :

Lister toutes les images téléchargées sur votre machine :

(Alias : docker image ls)

L'output de cette commande contient :

  • REPOSITORY : Le nom de l'image.
  • TAG : La version de l'image (latest par défaut).
  • IMAGE ID : L'identifiant unique de l'image.
  • CREATED : La date de création de l'image.
  • SIZE : La taille de l'image.

Supprimer une image par son nom ou son ID :

(Alias : docker image rm hello-world)

Erreur fréquente : Si un conteneur (même arrêté) utilise cette image, vous aurez une erreur.

Pour forcer la suppression (supprime aussi les conteneurs liés), utilisez -f ou --force :

Commande bonus : Supprimer toutes les images sur votre machine :

(docker images -q ne liste que les ID d'images, qui sont passés à docker rmi -f).

Pour voir les différentes couches qui composent une image (et les commandes qui les ont créées), utilisez docker history :

C'est très utile pour comprendre comment une image est construite et pour voir l'intérêt du système de couches (ex: docker history cirrusci/flutter:latest).

📌 3. Aide-Mémoire des Commandes

Afficher de l'aide :

Afficher des informations système :

Rechercher une image :

Télécharger une image :

Lister les images locales :

Voir les couches d'une image :

Supprimer une image :

Forcer la suppression d'une image :

🧑‍💻 4. TP (Exercices Pratiques)

Exercice 1 : Exploration du Docker Hub

  1. Recherchez une image pour le serveur web nginx sur le Docker Hub.
  2. Filtrez les résultats pour ne voir que l'image officielle.
  3. Téléchargez (pull) la version stable-alpine de l'image officielle nginx. (alpine signifie qu'il s'agit d'une version très légère).
  4. Listez vos images locales pour vérifier que nginx avec le tag stable-alpine est bien présente.

Exercice 2 : Téléchargement et Nettoyage

  1. Téléchargez l'image httpd (le serveur Apache) avec son tag latest.
  2. Téléchargez l'image redis avec le tag latest.
  3. Listez toutes vos images. Notez leurs tailles.
  4. Supprimez (rmi) l'image httpd.
  5. Essayez de supprimer l'image redis.

Exercice 3 : Analyse d'une image complexe (Flutter)

  1. Recherchez des images pour flutter. L'image cirrusci/flutter est une image populaire pour la CI/CD.
  2. Téléchargez l'image cirrusci/flutter:latest. (Attention : elle est assez volumineuse !)
  3. Utilisez la commande docker history cirrusci/flutter:latest pour voir la liste des couches. Combien y en a-t-il ?
  4. Comparez le nombre de couches et la taille de cirrusci/flutter avec l'image nginx:stable-alpine de l'exercice 1. Cela illustre bien la différence entre une image applicative légère et une image de développement complète.

Exercice 4 (Bonus) : Nettoyage Complet

En utilisant la commande "bonus" vue plus haut, supprimez toutes les images de votre machine en une seule commande. (Attention : à n'utiliser que si vous êtes sûr de ne plus avoir besoin des images !)

🧠 5. Questionnaire de Révision

1. Quelle est la principale différence entre une image et un conteneur ?

2. Quelle commande utilisez-vous pour télécharger une image depuis le Docker Hub ?

3. Que fait le système de "Copy-on-Write" (CoW) ?

4. Que se passe-t-il si vous essayez de faire docker rmi mon-image alors qu'un conteneur (même arrêté) l'utilise ?