Manipulation des images Docker

DockerBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire (lab), nous allons explorer les images Docker, qui sont la base pour créer et exécuter des conteneurs. Nous apprendrons à télécharger (pull) des images depuis Docker Hub, à exécuter des conteneurs en utilisant différentes versions d'images, à lister et à supprimer des images, à comprendre les couches d'images, à rechercher des images et à effectuer des étiquetages (tagging) d'images de base. Cette expérience pratique vous fournira les compétences essentielles pour travailler efficacement avec les images Docker. Ne vous inquiétez pas si vous êtes nouveau dans le domaine de Docker - nous vous guiderons à chaque étape avec des explications détaillées.

Téléchargement d'images depuis Docker Hub

Docker Hub est un dépôt public d'images Docker, similaire à GitHub pour le code. C'est là que vous pouvez trouver des images préconstruites pour de nombreuses applications logicielles populaires et systèmes d'exploitation. Commençons par télécharger (pull) l'image officielle Nginx.

Ouvrez un terminal sur votre système. Vous devriez voir une invite qui ressemble à ceci :

labex:project/ $

Maintenant, téléchargeons l'image Nginx. Tapez la commande suivante et appuyez sur Entrée :

docker pull nginx

Cette commande indique à Docker de télécharger la dernière version de l'image Nginx depuis Docker Hub. Vous devriez voir une sortie similaire à celle-ci :

Using default tag: latest
latest: Pulling from library/nginx
5040bd298390: Pull complete
d7a91cdb22f0: Pull complete
9cac4850e5df: Pull complete
Digest: sha256:33ff28a2763feccc1e1071a97960b7fef714d6e17e2d0ff573b74825d0049303
Status: Downloaded newer image for nginx:latest

Analysons ce qui se passe ici :

  1. "Using default tag: latest" - Lorsque vous ne spécifiez pas de version, Docker suppose que vous voulez la dernière version.
  2. Les quelques lignes suivantes montrent Docker téléchargeant différentes "couches" de l'image. Chaque couche représente un ensemble de modifications du système de fichiers.
  3. Le "Digest" est un identifiant unique pour cette version exacte de l'image.
  4. La dernière ligne confirme que l'image a été téléchargée avec succès.

Maintenant que nous avons téléchargé l'image, vérifions qu'elle est sur notre système. Nous pouvons le faire en listant toutes les images que Docker a localement :

docker images

Vous devriez voir une sortie similaire à celle-ci :

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    605c77e624dd   2 weeks ago    141MB

Cela nous indique :

  • REPOSITORY : Le nom de l'image (nginx)
  • TAG : La version de l'image (latest)
  • IMAGE ID : Un identifiant unique pour cette image
  • CREATED : Lorsque cette version de l'image a été créée
  • SIZE : L'espace disque que l'image occupe

Ne vous inquiétez pas si les nombres exacts sont différents - l'important est que vous voyez une entrée pour nginx.

Si vous vous demandez quelles autres images sont sur votre système, vous pourriez voir des entrées pour "jenkins/jenkins" et "gcr.io/k8s-minikube/kicbase". Ce sont des images préinstallées que nous n'utiliserons pas dans ce laboratoire (lab).

Exécution de différentes versions d'une image

Docker vous permet d'exécuter des versions spécifiques d'une image en utilisant des étiquettes (tags). Les étiquettes sont comme des alias pour des versions spécifiques d'une image. Explorons ce concept avec l'image Python.

Tout d'abord, téléchargeons la dernière image Python :

docker pull python

Vous verrez une sortie similaire à celle que nous avons obtenue lorsque nous avons téléchargé l'image Nginx. Cela télécharge la dernière version de Python.

Maintenant, téléchargeons une version spécifique de Python, disons la version 3.7 :

docker pull python:3.7

Remarquez comment nous avons ajouté :3.7 après python. Cela indique à Docker de télécharger spécifiquement la version 3.7, plutôt que la dernière version.

Listons nos images Python pour voir les différentes versions :

docker images python

Vous devriez voir une sortie similaire à celle-ci :

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
python       3.7       1f1a7b570fbd   2 weeks ago    907MB
python       latest    98ccd1643c71   2 weeks ago    920MB

Maintenant, nous avons deux images Python : une étiquetée latest (qui est en fait Python 3.9 ou 3.10, selon quand vous effectuez ce laboratoire), et une étiquetée 3.7.

Exécutons des conteneurs en utilisant ces différentes versions pour voir la différence :

docker run --rm python:latest python --version

Cette commande effectue plusieurs choses :

  1. docker run crée et démarre un nouveau conteneur
  2. --rm indique à Docker de supprimer le conteneur après son arrêt
  3. python:latest spécifie quelle image utiliser
  4. python --version est la commande à exécuter à l'intérieur du conteneur

Vous devriez voir la dernière version de Python dans la sortie.

Maintenant, faisons la même chose avec Python 3.7 :

docker run python:3.7 python --version

Cette fois, vous devriez voir Python 3.7.x dans la sortie, où x est la dernière version de correctif de Python 3.7.

Ces commandes démontrent comment vous pouvez utiliser différentes versions du même logiciel en utilisant différentes étiquettes d'image. Cela est incroyablement utile lorsque vous devez exécuter des applications qui nécessitent des versions spécifiques de Python (ou de tout autre logiciel).

Liste et suppression d'images

Au fur et à mesure que vous utilisez Docker, vous accumulerez des images au fil du temps. Il est important de savoir comment gérer ces images, y compris comment les lister et supprimer celles que vous n'avez plus besoin.

Commençons par lister toutes les images sur votre système :

docker images

Vous devriez voir une liste de toutes les images que vous avez téléchargées jusqu'à présent, y compris Nginx et les images Python.

Maintenant, disons que nous voulons supprimer l'image Python 3.7 pour libérer de l'espace. Nous pouvons le faire en utilisant la commande docker rmi (rmi signifie "remove image" - supprimer une image) :

docker rmi python:3.7

Si cette commande réussit, vous verrez une sortie comme celle-ci :

Untagged: python:3.7
Untagged: python@sha256:1f93c63...
Deleted: sha256:1f1a7b57...
Deleted: sha256:8c75ecde...
...

Cependant, vous pourriez voir à la place un message d'erreur comme celui-ci :

Error response from daemon: conflict: unable to remove repository reference "python:3.7" (must force) - container <container_id> is using its referenced image <image_id>

Cette erreur se produit s'il existe un conteneur (en cours d'exécution ou arrêté) qui a été créé à partir de cette image. Docker vous empêche de supprimer des images qui sont en cours d'utilisation pour maintenir l'intégrité du système.

Pour résoudre ce problème, nous devons d'abord supprimer tous les conteneurs utilisant cette image. Listons tous les conteneurs (y compris les arrêtés) :

docker ps -a

Recherchez tous les conteneurs qui ont été créés à partir de l'image python:3.7. Si vous en trouvez, supprimez-les en utilisant la commande docker rm :

docker rm <container_id>

Remplacez <container_id> par l'identifiant réel du conteneur que vous voulez supprimer.

Maintenant, essayez de supprimer l'image à nouveau :

docker rmi python:3.7

Cette fois, cela devrait réussir.

Vérifions que l'image a été supprimée en listant à nouveau les images Python :

docker images python

Vous ne devriez plus voir l'image Python 3.7 dans la liste.

Comprendre les couches d'image

Les images Docker sont construites à l'aide d'un système de fichiers en couches. Chaque couche représente un ensemble de modifications du système de fichiers. Cette approche en couches permet à Docker d'être efficace en termes d'utilisation du stockage et du réseau. Explorons ce concept.

Tout d'abord, examinons les couches de l'image Nginx que nous avons téléchargée précédemment :

docker inspect --format='{{.RootFS.Layers}}' nginx

Vous verrez une sortie similaire à celle-ci :

[sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f sha256:e379e8aedd4d72bb4c529a4ca07a4e4d230b5a1d3f7a61bc80179e8f02421ad8 sha256:b5357ce95c68acd9c9672ec76e3b2a2ff3f8f62a2bcc1866b8811572f4d409af]

Chacune de ces longues chaînes (appelées hachages SHA256) représente une couche dans l'image. Chaque couche correspond à une commande dans le Dockerfile utilisé pour construire l'image.

Pour mieux comprendre les couches, créons une simple image personnalisée. Tout d'abord, créez un nouveau fichier nommé Dockerfile dans votre répertoire actuel :

nano Dockerfile

Dans ce fichier, ajoutez le contenu suivant :

FROM nginx
RUN echo "Hello from custom layer" > /usr/share/nginx/html/hello.html

Ce Dockerfile fait deux choses :

  1. Il commence par l'image Nginx que nous avons téléchargée précédemment (FROM nginx)
  2. Il ajoute un nouveau fichier à l'image (RUN echo...)

Enregistrez et quittez le fichier (dans nano, vous pouvez le faire en appuyant sur Ctrl+X, puis Y, puis Entrée).

Maintenant, construisons cette image :

docker build -t custom-nginx .

Exemple de sortie :

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> 5ef79149e0ec
Step 2/2 : RUN echo "Hello from custom layer" > /usr/share/nginx/html/hello.html
 ---> Running in 2fa43e649234
Removing intermediate container 2fa43e649234
 ---> 73b62663b5c3
Successfully built 73b62663b5c3
Successfully tagged custom-nginx:latest

Cette commande construit une nouvelle image basée sur notre Dockerfile et l'étiquette comme custom-nginx. Le . à la fin indique à Docker de chercher le Dockerfile dans le répertoire actuel.

Maintenant, examinons les couches de notre image personnalisée :

docker inspect --format='{{.RootFS.Layers}}' custom-nginx

Vous remarquerez que cette image a une couche de plus que l'image Nginx originale. Cette couche supplémentaire représente les modifications apportées par notre commande RUN.

Comprendre les couches est crucial car :

  1. Les couches sont mises en cache, ce qui accélère la construction d'images similaires
  2. Les couches sont partagées entre les images, ce qui économise de l'espace disque
  3. Lorsque vous envoyez ou téléchargez des images, seules les couches modifiées doivent être transférées

Recherche d'images sur Docker Hub

Docker Hub héberge une vaste collection d'images. Bien que vous puissiez rechercher des images sur le site web de Docker Hub, Docker propose également un outil en ligne de commande pour rechercher des images directement depuis votre terminal.

Commençons par rechercher des images Nginx :

docker search nginx

Cela renverra une liste d'images liées à Nginx. La sortie comprend plusieurs colonnes :

  • NAME : Le nom de l'image
  • DESCRIPTION : Une brève description de l'image
  • STARS : Le nombre d'étoiles que l'image a sur Docker Hub (indiquant sa popularité)
  • OFFICIAL : Indique si c'est une image officielle maintenue par Docker
  • AUTOMATED : Indique si cette image est automatiquement construite à partir d'un dépôt GitHub

Par exemple, vous pourriez voir quelque chose comme cela :

NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        15763     [OK]
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker c...   2088                 [OK]
...

L'image Nginx officielle se trouve généralement en haut de cette liste.

Maintenant, essayons de rechercher une version spécifique de Python :

docker search python:3.8

Vous remarquerez que cette recherche ne fonctionne pas exactement comme vous pourriez vous y attendre. La commande docker search ne prend pas en charge la recherche de tags spécifiques (comme 3.8). Au lieu de cela, elle recherchera des images ayant "python:3.8" dans leur nom ou leur description.

Pour trouver des versions spécifiques d'une image, il est souvent préférable de :

  1. Rechercher le nom général de l'image (par exemple, docker search python)
  2. Visiter le site web de Docker Hub pour plus d'informations détaillées
  3. Utiliser docker pull pour télécharger l'image, puis l'inspecter localement

N'oubliez pas que docker search est un moyen rapide de trouver des images, mais pour des informations plus détaillées, le site web de Docker Hub est souvent plus utile.

Sauvegarde et chargement d'images

Docker vous permet de sauvegarder des images au format fichier tar et de les charger ultérieurement. Cela est utile pour transférer des images entre des systèmes sans utiliser un registre, ou pour effectuer des sauvegardes d'images.

Commençons par sauvegarder l'image Nginx dans un fichier :

docker save nginx > nginx.tar

Cette commande sauvegarde l'image Nginx dans un fichier nommé nginx.tar dans votre répertoire actuel. Le symbole > est utilisé pour rediriger la sortie de la commande docker save vers un fichier.

Vous pouvez vérifier que le fichier a été créé en listant le contenu de votre répertoire actuel :

ls -lh nginx.tar

Vous devriez voir le fichier nginx.tar dans la liste, ainsi que sa taille (qui devrait être supérieure à 100 Mo).

Maintenant, supprimons l'image Nginx de notre système pour simuler le transfert de l'image vers un système qui ne la possède pas :

docker rmi nginx

Vérifions que l'image a été supprimée :

docker images nginx

Vous ne devriez voir aucun résultat, ce qui indique que l'image Nginx a été supprimée de votre système.

Maintenant, chargeons l'image à partir du fichier tar :

docker load < nginx.tar

Le symbole < est utilisé pour rediriger le contenu du fichier nginx.tar en tant qu'entrée pour la commande docker load.

Une fois le chargement terminé, vérifions que l'image Nginx est de retour :

docker images nginx

Vous devriez voir l'image Nginx dans la liste à nouveau, comme avant sa suppression.

Ce processus de sauvegarde et de chargement d'images peut être très utile lorsque vous avez besoin de :

  • Transférer des images vers un système sans accès à Internet
  • Sauvegarder des versions spécifiques d'images
  • Partager des images personnalisées avec d'autres sans utiliser un registre

Principes de base du tagging d'images

Le tagging (étiquetage) est un moyen de créer des alias pour vos images Docker. Il est couramment utilisé pour la gestion des versions et l'organisation des images. Explorons comment étiqueter des images.

Tout d'abord, créons un nouveau tag pour notre image Nginx :

docker tag nginx:latest my-nginx:v1

Cette commande crée un nouveau tag my-nginx:v1 qui pointe vers la même image que nginx:latest. Voici ce que chaque partie signifie :

  • nginx:latest est l'image source et son tag
  • my-nginx est le nouveau nom d'image que nous créons
  • v1 est le nouveau tag que nous attribuons

Maintenant, listez vos images pour voir le nouveau tag :

docker images

Vous devriez voir à la fois nginx:latest et my-nginx:v1 dans la liste. Remarquez qu'ils ont le même identifiant d'image (Image ID) - c'est parce qu'ils représentent en réalité la même image, simplement avec des noms différents.

Vous pouvez utiliser ce nouveau tag pour exécuter un conteneur :

docker run -d --name my-nginx-container my-nginx:v1

Cette commande effectue les actions suivantes :

  • -d exécute le conteneur en mode détaché (en arrière - plan)
  • --name my-nginx-container attribue un nom à notre nouveau conteneur
  • my-nginx:v1 est l'image et le tag que nous utilisons pour créer le conteneur

Vérifiez que le conteneur est en cours d'exécution :

docker ps

Vous devriez voir votre conteneur dans la liste des conteneurs en cours d'exécution.

Le tagging est utile pour plusieurs raisons :

  1. Contrôle de version : Vous pouvez étiqueter les images avec des numéros de version (v1, v2, etc.)
  2. Séparation d'environnements : Vous pouvez étiqueter les images pour différents environnements (développement, pré - production, production)
  3. Lisibilité : Des tags personnalisés peuvent rendre plus clair le but d'une image.

N'oubliez pas que les tags ne sont que des alias - ils ne créent pas de nouvelles images, ils créent simplement de nouveaux noms qui pointent vers des images existantes.

Résumé

Dans ce laboratoire, nous avons exploré divers aspects de la manipulation des images Docker. Nous avons appris à :

  1. Télécharger des images depuis Docker Hub
  2. Exécuter des conteneurs en utilisant différentes versions d'images
  3. Lister et supprimer des images
  4. Comprendre les couches d'image
  5. Rechercher des images sur Docker Hub
  6. Sauvegarder et charger des images
  7. Effectuer des opérations de base de tagging (étiquetage) d'images

Ces compétences constituent la base pour gérer efficacement les images Docker dans vos projets. Au fur et à mesure de votre progression avec Docker, vous constaterez que ces opérations sont essentielles pour construire et déployer des applications conteneurisées.

N'oubliez pas que les images Docker sont au cœur du fonctionnement de Docker. Elles offrent un moyen cohérent, portable et efficace de packager et de distribuer des applications. En maîtrisant ces opérations sur les images, vous êtes sur la bonne voie pour devenir compétent avec Docker.

Continuez à pratiquer ces commandes et à explorer différentes images. Plus vous travaillez avec Docker, plus vous vous sentirez à l'aise et compétent. Bonne exploration avec Docker!