Les images Docker sont les blocs de base des conteneurs Docker. Une image contient tout ce qui est nécessaire pour exécuter une application ou un service à l’intérieur d’un conteneur – le code ou les binaires, les runtimes, les dépendances et les configurations.
Les images sont immuables, ce qui signifie qu’elles ne peuvent pas être modifiées une fois générées. Pour apporter des modifications, vous devez générer une nouvelle image. Les images sont également empilées, ce qui signifie que chaque image s’appuie sur une image de base, en ajoutant uniquement les changements nécessaires pour cette image spécifique. Cela rend les images légères, réutilisables et rapides à générer.
Il y a deux étapes principales pour travailler avec les images Docker :
- Génération – Crée une image Docker à partir d’un Dockerfile
- Push – Télécharge une image vers un registre comme Docker Hub
Ce guide couvrira ces étapes en détail, y compris :
- Les bases du Dockerfile
- Générer des images localement
- Étiqueter les images
- Pousser les images vers les registres
- Gérer les images
Les bases du Dockerfile
Les images Docker sont générées à partir d’un Dockerfile – un fichier texte qui contient les instructions pour générer l’image. Un Dockerfile définit tout ce qui compose l’image – le système d’exploitation, les configurations, les fichiers et dossiers à copier, les ports réseau à exposer, les volumes Docker à créer, etc.
Quelques instructions Dockerfile courantes incluent :
FROM
– Définit l’image de base sur laquelle s’appuyerCOPY
– Copie des fichiers depuis l’hôte vers l’imageRUN
– Exécute des commandes et des scripts shell pendant la générationEXPOSE
– Expose les ports réseau auxquels le conteneur écouteraENV
– Définit des variables d’environnementENTRYPOINT
– Définit l’exécutable à exécuter lors du démarrage du conteneurCMD
– Paramètres par défaut qui sont passés à l’ENTRYPOINT
Voici un exemple simple de Dockerfile qui génère une application Node.js :
# Utilise l'image de base Node.js 11 la plus récente
FROM node:11
# Définit le répertoire de travail dans le conteneur
WORKDIR /app
# Copie les fichiers package et installe les dépendances
COPY package*.json ./
RUN npm install
# Copie le code source de l'application
COPY . .
# Expose le port et démarre l'application
EXPOSE 8080
CMD ["node", "app.js"]
Cela utilise l’image node:11
comme point de départ, copie le code source de l’application dans l’image, installe les dépendances, et définit l’application pour démarrer au lancement du conteneur.
Générer des images localement
Avec un Dockerfile prêt, vous pouvez générer une image en utilisant la commande docker build
. Cela générera l’image étape par étape selon les instructions du Dockerfile.
Le format de base est :
$ docker build [options] PATH
Où PATH est l’emplacement du Dockerfile.
Par exemple :
$ docker build -t my-app .
Cela cherchera un Dockerfile dans le répertoire courant et générera une image appelée my-app
à partir de celui-ci.
Quelques options clés :
-t
– Étiquette l’image avec un nom de dépôt et un tag--no-cache
– Regénère l’image depuis zéro au lieu d’utiliser le cache-f
– Chemin vers le Dockerfile s’il n’est pas dans le répertoire courant
Vous pouvez générer des images pour différents environnements ou paramètres en ayant simplement plusieurs Dockerfiles, par exemple Dockerfile.dev, Dockerfile.prod.
Pendant le développement, vous voudrez itérer rapidement en regénérant fréquemment les images au fur et à mesure des modifications apportées à l’application. L’utilisation du cache accélère considérablement les temps de regénération.
Étiqueter les images
Les tags d’image identifient une image comme appartenant à un dépôt et fournissent un nom de version ou de variante.
Les tags sont composés du nom du dépôt et du nom du tag séparés par un deux-points, comme my-app:latest
.
Lors de la génération d’une image, le flag -t
permet de l’étiqueter :
$ docker build -t my-app:latest .
Cela nomme l’image my-app
et lui applique le tag latest
.
Si aucun tag n’est fourni, latest
est supposé.
Quelques stratégies d’étiquetage courantes :
latest
– La version stable la plus récente- SHA de commit Git – Étiquette la génération avec le SHA du commit pour la traçabilité
- Versions sémantiques – Tags comme
v1.0.2
pour les versions de publication - Tags de variantes – Comme
prod
,test
,dev
pour indiquer à quoi sert l’image
Remarque : L’étiquetage donne du sens et du contexte à une image. Les images sans tag sont difficiles à gérer.
Vous pouvez ré-étiqueter une image existante pour ajouter ou modifier des tags :
$ docker tag my-app:latest my-app:v1.0
Pousser les images vers les registres Docker
Pour partager des images Docker avec d’autres, vous devez les pousser vers un registre. Un registre stocke les images Docker qui peuvent ensuite être récupérées et utilisées par n’importe quel hôte Docker.
Le registre par défaut est Docker Hub, qui a des dépôts publics et privés.
Pour pousser une image :
- Étiquetez l’image avec le nom du registre :
$ docker tag my-app:latest mydockerid/my-app:latest
- Poussez l’image étiquetée :
$ docker push mydockerid/my-app:latest
Cela téléchargera l’image my-app:latest
dans l’espace de noms mydockerid
sur Docker Hub.
Pour pousser vers un autre registre :
$ docker push registry.example.com/my-app:latest
Certaines entreprises hébergent des registres privés internes pour stocker des images exclusives. Cela nécessite une authentification et SSL pour la sécurité.
Dans une chaîne CI/CD, vous pouvez automatiser la génération et le push d’images vers les registres à chaque modification du code. Cela permet de déployer en continu des applications en utilisant les dernières images.
Gérer les images locales
Lorsque vous générez des images, l’hôte Docker les stocke localement dans le moteur Docker. Pour libérer de l’espace disque, vous devrez occasionnellement nettoyer les anciennes images inutilisées.
Quelques commandes utiles pour gérer les images :
docker images
– Liste toutes les images sur l’hôtedocker image rm
– Supprime une ou plusieurs imagesdocker image prune
– Supprime les images inutilisées et danglingdocker rmi
– Supprime l’image par ID ou nom
Exemple de suppression d’images :
# Supprime une image spécifique
$ docker image rm my-app:latest
# Supprime toutes les images correspondant au nom
$ docker image rm my-app
# Supprime les images dangling
$ docker image prune
# Supprime toutes les images
$ docker rmi $(docker images -q)
Utilisez ces commandes avec précaution pour éviter de supprimer accidentellement des images encore en cours d’utilisation ou nécessaires.
Vous pouvez également configurer des politiques automatisées pour supprimer les anciennes images. Par exemple, conserver uniquement les 10 tags d’image les plus récents pour chaque dépôt.
Conclusion
Voilà pour les bases de la génération, de l’étiquetage, du push et de la gestion des images Docker !
Les points clés à retenir incluent :
- Les Dockerfiles définissent la façon dont les images sont générées
docker build
transforme un Dockerfile en une image exécutable- Les images doivent être étiquetées avec un nom de dépôt et de version
docker push
télécharge les images vers des registres comme Docker Hub- Les commandes
docker image
gèrent les images sur un hôte Docker
Avec ces bases, vous pouvez utiliser efficacement les images Docker pour packager et déployer des applications de manière cohérente et fiable. L’automatisation de la génération d’images et des déploiements vous permettra d’adopter des pratiques DevOps matures.