Construir una imagen es solo la mitad del trabajo: para que otros (tu equipo, tus servidores de producción, tus pipelines de despliegue) puedan usarla, hay que publicarla en un registro. Antes de publicar, conviene etiquetarla correctamente siguiendo convenciones claras. En esta lección aprenderemos las convenciones de tagging (nombre:tag), el comando docker tag, cómo autenticarte con docker login, cómo publicar con docker push en Docker Hub o en un registro privado, el versionado semántico de imágenes y las buenas prácticas para que tu flujo de publicación sea ordenado y reproducible.
Convenciones de Tagging: nombre:tag
El nombre completo de una imagen sigue una estructura precisa. Entenderla evita la mayoría de errores al publicar:
| Parte | Ejemplo | Cuándo aparece |
|---|---|---|
| Registro | ghcr.io |
Opcional; si se omite, se asume Docker Hub (docker.io) |
| Usuario / organización | miusuario |
Obligatorio para publicar en repositorios de cuenta |
| Repositorio | api-pagos |
El nombre de tu imagen |
| Tag | 1.2.0 |
Opcional; si se omite, se asume latest |
Ejemplos según el destino:
miusuario/api-pagos:1.0→ publicación en Docker Hub bajo tu cuenta.ghcr.io/miorganizacion/api-pagos:1.0→ publicación en GitHub Container Registry.registro.miempresa.com:5000/api-pagos:1.0→ publicación en un registro privado propio en el puerto 5000.
Puntos clave:
- Para publicar en Docker Hub, el repositorio debe incluir tu usuario:
nginx(sin usuario) está reservado a imágenes oficiales y no podrás hacerpushahí. - Si no indicas registro, Docker usa Docker Hub automáticamente.
- Si no indicas tag, se asume
latest, pero conviene ser explícito.
El Comando docker tag
Cuando construyes una imagen, le asignas un nombre con -t. Pero a menudo necesitas añadir otro nombre o tag a una imagen ya existente, por ejemplo para prepararla para un registro concreto. Eso lo hace docker tag.
miapp:1.0: la imagen de origen (la que ya tienes en local).miusuario/miapp:1.0: el nuevo nombre, ahora con tu usuario, listo para publicar en Docker Hub.
docker tag no copia ni duplica la imagen: solo crea un nombre adicional que apunta a la misma imagen (mismo IMAGE ID). Puedes comprobarlo:
- Ambas entradas comparten
IMAGE ID: son la misma imagen con dos nombres.
También sirve para marcar la misma imagen con varios tags, por ejemplo una versión concreta y latest:
Autenticarse con docker login
Para publicar en un registro necesitas autenticarte primero. En Docker Hub:
- Pide tu usuario y contraseña (o, mejor, un token de acceso) de Docker Hub.
- Tras un inicio de sesión correcto, tus credenciales se guardan localmente y podrás hacer
pushsin volver a autenticarte hasta que cierres sesión.
Para un registro distinto de Docker Hub, indica su dominio:
- Te autentica contra GitHub Container Registry. Cada registro mantiene su propia sesión.
Para cerrar sesión:
Buena práctica de seguridad: usa tokens de acceso personal en lugar de tu contraseña, sobre todo en pipelines automatizados. Un token puede revocarse de forma independiente sin afectar a tu contraseña principal. En entornos de integración continua, suministra el token mediante una variable de entorno secreta y autentícate de forma no interactiva:
--password-stdin: lee la credencial de la entrada estándar en lugar de escribirla en la línea de comandos, evitando que quede registrada en el historial.
Publicar con docker push
Una vez autenticado y con la imagen correctamente etiquetada, la publicas con docker push:
- Docker sube las capas de la imagen al registro. Las capas que el registro ya tenga no se vuelven a subir, lo que acelera publicaciones sucesivas.
La salida muestra el progreso capa por capa:
The push refers to repository [docker.io/miusuario/miapp] 5f70bf18a086: Pushed a3c4d5e6f7a8: Layer already exists 1.0: digest: sha256:abc123... size: 1985
Pushed: capa subida por primera vez.Layer already exists: capa que ya estaba en el registro y no hace falta volver a subir.
Si quieres publicar también el tag latest, debes hacer push de cada tag por separado:
Para publicar en un registro privado, el nombre de la imagen debe incluir el dominio del registro:
docker tag miapp:1.0 registro.miempresa.com:5000/miapp:1.0
docker push registro.miempresa.com:5000/miapp:1.0- Primero etiquetamos la imagen con el dominio del registro privado, y luego hacemos
push. Docker deduce a qué registro subir a partir del prefijo del nombre.
Versionado Semántico de Imágenes
Etiquetar todas tus imágenes como latest es cómodo al principio, pero es una mala práctica en cuanto el proyecto crece: no sabes qué versión está realmente en producción ni puedes volver atrás. La solución es el versionado semántico (SemVer), con el formato MAYOR.MENOR.PARCHE:
| Componente | Cuándo se incrementa | Ejemplo |
|---|---|---|
| MAYOR | Cambios incompatibles con versiones anteriores | 2.0.0 |
| MENOR | Nuevas funcionalidades compatibles | 1.3.0 |
| PARCHE | Correcciones de errores compatibles | 1.2.1 |
Una práctica muy habitual es publicar la misma imagen con varios tags a la vez para dar flexibilidad a quien la consume:
docker tag miapp:build miusuario/miapp:1.2.3
docker tag miapp:build miusuario/miapp:1.2
docker tag miapp:build miusuario/miapp:1
docker tag miapp:build miusuario/miapp:latest
docker push miusuario/miapp:1.2.3
docker push miusuario/miapp:1.2
docker push miusuario/miapp:1
docker push miusuario/miapp:latest1.2.3: versión exacta e inmutable en la práctica; ideal para producción reproducible.1.2: apunta siempre a la última parche de la rama 1.2.1: apunta a la última versión de la rama mayor 1.latest: la última publicada, cómoda para pruebas pero no recomendada en producción.
Así, un usuario que quiera estabilidad fija 1.2.3, y uno que quiera recibir parches automáticamente puede usar 1.2.
Buenas Prácticas
- Fija versiones explícitas en producción: nunca despliegues
latesten producción; usa una versión concreta como1.2.3para saber exactamente qué corre y poder revertir. - Etiqueta con metadatos útiles: además de la versión SemVer, muchos equipos añaden tags con el hash de Git del commit (
miapp:git-a1b2c3d) para trazabilidad total. - Automatiza el etiquetado en CI/CD: deja que el pipeline genere los tags a partir de la versión del proyecto o del tag de Git, evitando errores manuales.
- Usa tokens, no contraseñas: y suminístralos como secretos, nunca escritos en el código o el historial.
- No reutilices un tag de versión: una vez publicado
1.2.3, no lo sobrescribas con otro contenido; publica1.2.4en su lugar. Así garantizas reproducibilidad. - Verifica el destino antes del
push: comprueba que el nombre incluye el usuario o el dominio correcto para no publicar en el sitio equivocado.
Errores Comunes y Consejos
- Intentar
pushsin tu usuario en el nombre:docker push miapp:1.0falla porquemiappno incluye tu cuenta. Debe sermiusuario/miapp:1.0. - Olvidar
docker login: elpushdevuelve un error de autenticación. Inicia sesión primero. - Creer que
docker tagduplica la imagen: solo crea un nombre adicional; no consume espacio extra. - Publicar solo
latest: dificulta saber qué versión hay desplegada y revertir cambios. Usa SemVer. - Pensar que un solo
pushsube todos los tags: cada tag se publica por separado. - Escribir el token en la línea de comandos: usa
--password-stdinpara no dejarlo en el historial. - Consejo: tras publicar, valida descargando la imagen en otra máquina con
docker pullpara confirmar que está accesible y completa.
Ejercicios
Ejercicio 1
Tienes una imagen local tienda:build. Etiquétala para tu cuenta de Docker Hub (miusuario) como versión 1.0.0 y también como latest, y publica ambos tags.
Ejercicio 2
Explica por qué docker push miapp:1.0 falla al intentar publicar en Docker Hub y cómo lo corregirías.
Ejercicio 3
Quieres permitir que los consumidores fijen tanto la versión exacta 2.1.0 como la rama menor 2.1. Indica qué tags crearías y publicarías.
Soluciones
Solución 1
docker tag tienda:build miusuario/tienda:1.0.0
docker tag tienda:build miusuario/tienda:latest
docker login
docker push miusuario/tienda:1.0.0
docker push miusuario/tienda:latestSe crean dos nombres para la misma imagen, se inicia sesión y se publica cada tag por separado.
Solución 2
Falla porque miapp no incluye tu usuario, y los nombres sin usuario están reservados a imágenes oficiales en Docker Hub, donde no tienes permisos de publicación. Para corregirlo, etiqueta la imagen con tu cuenta y publícala:
Solución 3
Crearías y publicarías dos tags apuntando a la misma imagen:
docker tag tienda:build miusuario/tienda:2.1.0
docker tag tienda:build miusuario/tienda:2.1
docker push miusuario/tienda:2.1.0
docker push miusuario/tienda:2.12.1.0 es la versión exacta para quien quiera estabilidad total, y 2.1 se reasignará a la última parche de esa rama, de modo que quien lo use reciba automáticamente correcciones compatibles.
Conclusión
En esta lección hemos cerrado el ciclo de trabajo con imágenes: las convenciones de tagging [registro/]usuario/repositorio:tag, el uso de docker tag para añadir nombres, la autenticación con docker login (preferiblemente con tokens), la publicación con docker push en Docker Hub y en registros privados, el versionado semántico con múltiples tags y las buenas prácticas para un flujo reproducible y seguro. Con esto dominas el ciclo completo: buscar, construir, gestionar, etiquetar y publicar imágenes.
Con esta lección concluimos el Módulo 2: Trabajando con Imágenes Docker. En el Módulo 3 pondremos el foco en los contenedores en sí, empezando por Ejecutando Contenedores, donde aprenderemos a lanzar, configurar y controlar contenedores a partir de las imágenes que ahora ya sabes crear y publicar.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Registro y Monitoreo en Docker
Módulo 6: Docker en Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga
