Une introduction rapide aux balises Docker

Si vous avez travaillé avec Docker même pendant un petit moment, je parie que vous avez rencontré des balises. Ils ressemblent souvent à "mon_nom_image: 1" où la partie après les deux points est connue sous le nom de balise. La balise n'est pas toujours spécifiée lors du balisage d'images, mais nous y reviendrons plus tard.

Depuis que j'ai commencé à utiliser Docker, je suis très confus au sujet des balises. La documentation ne les explique pas très bien et il n'y a vraiment pas d'explications approfondies sur le sujet. C'est pourquoi j'ai décidé d'écrire ce post.

Que sont les balises Docker?

Alors, que sont exactement les balises Docker? En termes simples, les balises Docker transmettent des informations utiles sur une version / variante d'image spécifique. Ils sont des alias à l'ID de votre image qui ressemblent souvent à ceci: f1477ec11d12. C'est juste une façon de faire référence à votre image. Une bonne analogie est de savoir comment les balises Git font référence à un commit particulier dans votre historique.

Les deux cas les plus courants dans lesquels les balises entrent en jeu sont:

  1. Lors de la construction d'une image, nous utilisons la commande suivante:
docker build -t username/image_name:tag_name .

Essayons de décompresser un peu ce que fait cette commande. Nous disons au démon Docker de récupérer le fichier Docker présent dans le répertoire courant (c'est ce que fait le .à la fin). Ensuite, nous disons au démon Docker de créer l'image et de lui donner la balise spécifiée. Si vous exécutez docker images, vous devriez voir une image dont le référentiel est username/image_nameet la balise est tag_name.

username/image_name n'est pas un format obligatoire pour spécifier le nom de l'image. C'est juste une convention utile pour éviter de baliser à nouveau votre image lorsque vous devez la pousser vers un registre.

Votre image peut être nommée comme vous le souhaitez. Pour le registre Docker public, vous êtes limité à une hiérarchie à deux niveaux lors de l'attribution d'un nom aux images. Par exemple, votre image ne peut pas avoir le nom a/b/c:1.Cette restriction n'existe généralement pas dans les registres privés. Comme indiqué précédemment, il n'est pas obligatoire de spécifier un tag_name.Nous verrons bientôt ce qui se passe dans ce cas.

2. Marquage explicite d'une image via la tagcommande.

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

Cette commande crée simplement un alias (une référence) par le nom du TARGET_IMAGE qui fait référence au SOURCE_IMAGE.C'est tout ce qu'il fait. C'est comme attribuer un autre nom à une image existante pour y faire référence. Remarquez comment la balise est spécifiée comme facultative ici également, par le [:TAG].

Que se passe-t-il lorsque vous ne spécifiez pas de balise?

D'accord, découvrons maintenant ce qui se passe lorsque vous ne spécifiez pas de balise lors du marquage d'une image. C'est là que la latestbalise entre dans l'image. Chaque fois qu'une image est balisée sans balise explicite, la balise lui est attribuée latest par défaut. C'est un choix de nom malheureux qui cause beaucoup de confusion. Mais j'aime le considérer comme la balise par défaut donnée aux images lorsque vous n'en spécifiez pas.

Une grande confusion latestest due à l'attente qu'il s'agisse de la dernière version de l'image, en particulier dans Dockerfiles. Considérons les différents scénarios avec un exemple:

Scénario 1:

Supposons que l'instruction suivante soit présente dans notre Dockerfile:

FROM debian

Comme nous n'avons spécifié aucune balise, Docker ajoutera la latestbalise et essaiera d'extraire l'image debian:latest.

Scénario 2:

FROM debian:9.3

Puisque la balise est explicitement mentionnée ici, Docker va extraire l'image Debian marquée 9.3

Une autre chose à garder à l'esprit est qu'il n'y a pas de règle qui stipule qu'une image doit avoir une seule balise. Une image peut avoir plusieurs balises et elles sont généralement utilisées pour spécifier des versions majeures et mineures. Par exemple, considérez ceci:

Au moment de la rédaction de cet article, la latestbalise de l'image Debian pointe vers la 9.3version et la 9version. Cela changera très probablement à l'avenir chaque fois que la version majeure ou mineure est modifiée pour l'image.

Veuillez noter que les balises utilisées pour le contrôle de version sémantique sont une convention qui est suivie, mais les balises n'ont pas été conçues uniquement dans ce but.

En conclusion, le dernier n'est pas une balise spéciale

Le principal avantage de ce que nous avons couvert jusqu'à présent est que le dernier est comme n'importe quel autre tag . Il incombe au développeur d'étiqueter correctement les images de manière à latesttoujours pointer vers la dernière version stable de l'image.

Par conséquent, nous ne spécifions pas explicitement une balise dans nos fichiers Docker lors de l'extraction d'images, car nous pourrions nous retrouver avec une version complètement différente de l'image de base que celle que nous avions utilisée auparavant. Il n'y a aucune garantie quant à savoir s'il s'agira d'une bosse majeure ou mineure. Même une ancienne version peut être étiquetée comme latest.

PS Si vous avez trouvé des idées fausses / erreurs dans le message, n'hésitez pas à me tweeter @ScribbingOn.

Merci à Jérôme Petazzoni de m'avoir aidé à donner un sens à cela.