Docker Tags

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>
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>
for tag in $(docker images apache-web --format "{{.Tag}}"); do
docker tag apache-web:$tag <tu-usuario>/apache-web:$tag
done
docker images
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