Skip to content

Docker Tags

Docker

Introducción

Cuando se crea una imagen de Docker, es fundamental asignarle una o más etiquetas (tags) que permitan identificarla de manera clara y precisa. Estas etiquetas funcionan como identificadores legibles que ayudan a organizar versiones, entornos y propósitos específicos de cada imagen. Al utilizar el motor de construcción de Docker, una forma común de construir una imagen es mediante el siguiente comando:

docker build -t registry.example.com/env/nombre-imagen:etiqueta .

Posteriormente, la imagen puede ser publicada en un registro utilizando:

docker push registry.example.com/env/nombre-imagen:etiqueta

En este módulo exploraremos prácticas recomendadas para el versionado y etiquetado de imágenes Docker, con un enfoque en estrategias que ayuden a mantener la trazabilidad, facilitar el mantenimiento y reducir riesgos en procesos de despliegue. Prestaremos especial atención a la convención de la última parte de la etiqueta, donde usualmente se define el número de versión o metadatos relevantes como el nombre del entorno, fecha de compilación o hash de commit.

¿Por qué no usar solo latest?

Aunque Docker asigna automáticamente la etiqueta latest cuando no se especifica una versión, no se recomienda depender exclusivamente de esta etiqueta. El uso de latest puede generar confusión, ya que no garantiza que la imagen represente efectivamente la versión más reciente del código, ni asegura consistencia entre entornos de desarrollo, prueba y producción, depender exclusivamente de esta práctica puede conducir a múltiples problemas:

  • Falta de control de versiones: No queda claro qué versión del código contiene la imagen.
  • Desincronización entre entornos: Puedes tener diferencias entre desarrollo, staging y producción sin notarlo.
  • Problemas de auditoría y trazabilidad: Se dificulta el rastreo de errores o vulnerabilidades.

Por eso es recomendable evitar el uso exclusivo de latest y utilizar un esquema de etiquetado consistente y significativo.

Recomendaciones de etiquetado

A continuación se presentan algunas prácticas recomendadas y convenciones para etiquetar imágenes Docker de forma efectiva:

Usar versionado semántico (SemVer)

Una práctica ampliamente aceptada es seguir el estándar SemVer (Semantic Versioning), que sigue el formato:

<major>.<minor>.<patch>
Ejemplo: mi-app:2.3.1

major: Cambio incompatible con versiones anteriores. minor: Nuevas funcionalidades compatibles. patch: Corrección de errores o pequeños ajustes.

Esto permite mantener compatibilidad entre versiones, automatizar despliegues y documentar cambios.

Referencia: https://semver.org/lang/es/

Etiquetado múltiple por imagen

Es común etiquetar una misma imagen con diferentes tags que reflejan el propósito o contexto:

docker build -t mi-app:2.3.1 -t mi-app:2.3 -t mi-app:2 -t mi-app:prod .

Incluir metadatos útiles

Puedes enriquecer las etiquetas con información útil, como: - Nombre del entorno: mi-app:2.3.1-prod - Fecha de build: mi-app:2.3.1-20250415 - Hash de commit o tag Git: mi-app:2.3.1-gitabc123

Esto mejora la trazabilidad y el vínculo con pipelines CI/CD.

Evitar sobrescribir etiquetas ya publicadas

Es importante no volver a publicar una imagen diferente con la misma etiqueta (excepto en latest si es necesario). Esto evita inconsistencias entre entornos y errores difíciles de diagnosticar.

Resumen

Utilizar un esquema de etiquetado claro, semántico y consistente no solo mejora la organización de las imágenes, sino que también fortalece la estabilidad y trazabilidad de todo el ciclo de vida de desarrollo y operación. Adoptar estándares como SemVer, combinar etiquetas con metadatos y evitar el uso exclusivo de latest son pasos clave hacia un manejo profesional de imágenes en entornos Docker y Kubernetes.


Inicio de laboratorio

Paso 1: Crear el directorio de trabajo

mkdir -p apache-web-demo ; cd apache-web-demo

Paso 2: Crear un archivo Dockerfile

cat <<EOF > Dockerfile
FROM httpd:2.4

COPY ./public-html/ /usr/local/apache2/htdocs/
EOF

Paso 3: Crear el directorio y archivo HTML para la versión 1.0.0

mkdir -p public-html
cat <<EOF > public-html/index.html
<!DOCTYPE html>
<html>
<head>
  <title>Mi Sitio Web</title>
</head>
<body>
  <h1>Bienvenido - Version 1.0.0</h1>
</body>
</html>
EOF

Paso 4: Construir la imagen usando SemVer y etiquetas múltiples

docker build -t apache-web:1.0.0 -t apache-web:1.0 -t apache-web:1 -t apache-web:latest .

Paso 5: Ejecutar la imagen para probar

docker run -d --rm -p 30080:80 --name apache1 apache-web:1.0.0

Paso 6: Modificar el index.html para la versión 1.1.0

cat <<EOF > public-html/index.html
<!DOCTYPE html>
<html>
<head>
  <title>Mi Sitio Web</title>
</head>
<body>
  <h1>Bienvenido - Version 1.1.0</h1>
</body>
</html>
EOF

Paso 7: Construir nueva imagen con etiquetas múltiples

docker build -t apache-web:1.1.0 -t apache-web:1.1 -t apache-web:latest .

Paso 8: Probar la nueva imagen

docker stop apache1
docker run -d --rm -p 30080:80 --name apache2 apache-web:1.1.0

Paso 9: Crear versión 2.0.0 con cambio significativo

cat <<EOF > public-html/index.html
<!DOCTYPE html>
<html>
<head>
  <title>Mi Nueva App Web</title>
</head>
<body>
  <h1>Bienvenido a la version 2.0.0 de nuestra aplicacion</h1>
</body>
</html>
EOF
docker build -t apache-web:2.0.0 -t apache-web:2 -t apache-web:latest .

Paso 10: Ver todas las imágenes construidas

docker images | grep apache-web

Paso 11: Probar la versión 2.0.0

docker stop apache2
docker run -d --rm -p 30080:80 --name apache3 apache-web:2.0.0

Paso 12: Cargar las imágenes a un registro remoto

Ingresar a Docker Hub con tu usuario:

docker login -u <tu-usuario>
Crear un TAG correspondiente a tu usuario para todas las imágenes:
for tag in $(docker images apache-web --format "{{.Tag}}"); do
  docker tag apache-web:$tag <tu-usuario>/apache-web:$tag
done
docker images
Hacer PUSH a todas las versiones de imágenes:
for tag in $(docker images <tu-usuario>/apache-web --format "{{.Tag}}"); do
  docker push <tu-usuario>/apache-web:$tag
done

Verifica en Docker Hub la creación del nuevo repositorio con todas sus etiquetas, posteriormente, puedes eliminarlo en Settings > Delete repository > To confirm deletion, type the name of your repository apache-web > Delete repository forever

🧹 Limpieza del ambiente

Detener y eliminar los contenedores

docker rm -f $(docker ps -aq)

Limpiar todos los recursos que no se utilizan

docker system prune -a

Eliminar archivos y carpetas del proyecto

cd ~/ ; rm -rf apache-web-demo