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 :
- "Using default tag: latest" - Lorsque vous ne spécifiez pas de version, Docker suppose que vous voulez la dernière version.
- 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.
- Le "Digest" est un identifiant unique pour cette version exacte de l'image.
- 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 :
docker runcrée et démarre un nouveau conteneur--rmindique à Docker de supprimer le conteneur après son arrêtpython:latestspécifie quelle image utiliserpython --versionest 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 :
- Il commence par l'image Nginx que nous avons téléchargée précédemment (
FROM nginx) - 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 :
- Les couches sont mises en cache, ce qui accélère la construction d'images similaires
- Les couches sont partagées entre les images, ce qui économise de l'espace disque
- 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 :
- Rechercher le nom général de l'image (par exemple,
docker search python) - Visiter le site web de Docker Hub pour plus d'informations détaillées
- Utiliser
docker pullpour 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:latestest l'image source et son tagmy-nginxest le nouveau nom d'image que nous créonsv1est 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 :
-dexécute le conteneur en mode détaché (en arrière - plan)--name my-nginx-containerattribue un nom à notre nouveau conteneurmy-nginx:v1est 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 :
- Contrôle de version : Vous pouvez étiqueter les images avec des numéros de version (v1, v2, etc.)
- Séparation d'environnements : Vous pouvez étiqueter les images pour différents environnements (développement, pré - production, production)
- 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 à :
- Télécharger 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'image
- Rechercher des images sur Docker Hub
- Sauvegarder et charger des images
- 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!



