Una introducción rápida a las etiquetas de Docker

Si ha trabajado con Docker aunque sea por un tiempo, apuesto a que se ha encontrado con etiquetas. A menudo se ven como "my_image_name: 1" donde la parte después de los dos puntos se conoce como etiqueta. La etiqueta no siempre se especifica al etiquetar imágenes, pero llegaremos al final de eso más adelante.

Desde que comencé a usar Docker, he estado muy confundido acerca de las etiquetas. La documentación no los explica muy bien y realmente no hay explicaciones completas sobre el tema. Por eso decidí escribir este post.

¿Qué son las etiquetas Docker?

Entonces, ¿qué son exactamente las etiquetas Docker? En palabras simples, las etiquetas de Docker transmiten información útil sobre una versión / variante de imagen específica. Son un alias a la ID de la imagen que a menudo se parece a esto: f1477ec11d12. Es solo una forma de referirse a tu imagen. Una buena analogía es cómo las etiquetas de Git se refieren a una confirmación en particular en su historial.

Los dos casos más comunes en los que entran en juego las etiquetas son:

  1. Al construir una imagen, usamos el siguiente comando:
docker build -t username/image_name:tag_name .

Intentemos descomprimir un poco lo que hace este comando. Le decimos al demonio de Docker que busque el archivo de Docker presente en el directorio actual (eso es lo que hace .al final). A continuación, le decimos al demonio Docker que cree la imagen y le asigne la etiqueta especificada. Si ejecuta docker images, debería ver una imagen cuyo repositorio es username/image_namey etiqueta es tag_name.

username/image_name no es un formato obligatorio para especificar el nombre de la imagen. Es solo una convención útil para evitar volver a etiquetar su imagen cuando necesite enviarla a un registro.

Su imagen puede tener el nombre que desee. Para el registro público de Docker, está restringido a una jerarquía de dos niveles al nombrar imágenes. Por ejemplo, su imagen no puede tener el nombre. a/b/c:1.Esta restricción generalmente no existe en los registros privados. Como se indicó anteriormente, no es obligatorio especificar un tag_name.. Veremos qué sucede en ese caso pronto.

2. Etiquetar explícitamente una imagen mediante el tagcomando.

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

Este comando simplemente crea un alias (una referencia) con el nombre del TARGET_IMAGE que se refiere a SOURCE_IMAGE.Eso es todo lo que hace. Es como asignar a una imagen existente otro nombre para referirse a ella. Observe cómo la etiqueta también se especifica aquí como opcional, mediante [:TAG].

¿Qué sucede cuando no especifica una etiqueta?

Muy bien, ahora descubramos qué sucede cuando no especifica una etiqueta al etiquetar una imagen. Aquí es donde la latestetiqueta entra en escena. Siempre que una imagen se etiqueta sin una etiqueta explícita, se le asigna la latest etiqueta de forma predeterminada. Es una elección de nombre desafortunada que causa mucha confusión. Pero me gusta pensar en ella como la etiqueta predeterminada que se le da a las imágenes cuando no especificas una.

Se latestgenera mucha confusión debido a la expectativa de que sea la última versión de la imagen, especialmente en Dockerfiles. Consideremos los distintos escenarios con un ejemplo:

Escenario 1:

Supongamos que la siguiente declaración está presente en nuestro Dockerfile:

FROM debian

Como no especificamos ninguna etiqueta, Docker agregará la latestetiqueta e intentará extraer la imagen debian:latest.

Escenario 2:

FROM debian:9.3

Dado que la etiqueta se menciona explícitamente aquí, Docker extraerá la imagen de Debian etiquetada 9.3

Otra cosa a tener en cuenta es que no existe una regla que indique que una imagen debe tener solo una etiqueta. Una imagen puede tener varias etiquetas y normalmente se utilizan para especificar versiones principales y secundarias. Por ejemplo, considere esto:

En el momento de escribir esta publicación, la latestetiqueta de la imagen de Debian apunta a la 9.3publicación y la 9publicación. Es muy probable que esto cambie en el futuro cada vez que se cambie la versión principal o secundaria de la imagen.

Tenga en cuenta que las etiquetas que se utilizan para el control de versiones semántico es una convención que se sigue, pero las etiquetas no se diseñaron solo para ese propósito.

En conclusión, lo último no es una etiqueta especial.

La principal conclusión de lo que hemos cubierto hasta ahora es que lo último es como cualquier otra etiqueta . La responsabilidad recae en el desarrollador de etiquetar las imágenes correctamente, de modo que latestsiempre apunte a la última versión estable de la imagen.

Por lo tanto, no especificamos explícitamente una etiqueta en nuestros Dockerfiles al extraer imágenes, ya que podríamos terminar con una versión completamente diferente de la imagen base a la que habíamos usado antes. No hay garantías sobre si será un golpe mayor o menor. Incluso una versión anterior se puede etiquetar como latest.

PD: Si encontró algún error o idea errónea en la publicación, no dude en enviarme un tweet a @ScribbingOn.

Gracias a Jérôme Petazzoni por ayudarme a entender algo de esto.