Etiquetar y publicar imágenes en un registro

Aprende Docker → Lección 9

Una imagen que solo existe en tu máquina no sirve para desplegar. El registro es el sitio común del que todos los entornos descargan, y cómo se etiquete ahí determina si el despliegue es trazable o un acto de fe.

Una imagen, dos nombres

Etiquetar no copia nada: crea otro nombre para la misma imagen. Lo habitual es poner dos, el identificador del commit y latest:

docker tag mi-app:local registro.ejemplo.com/mi-app:2bbc62e
docker tag mi-app:local registro.ejemplo.com/mi-app:latest
docker images registro.ejemplo.com/mi-app
salidaregistro.ejemplo.com/mi-app:2bbc62e  af364ec01e89  112kB
registro.ejemplo.com/mi-app:latest   af364ec01e89  112kB

Mira la columna del identificador: af364ec01e89 en las dos. No hay dos imágenes de 112 kB, hay una con dos etiquetas. Por eso etiquetar es instantáneo y no ocupa espacio.

Publicar y comprobar

docker login registro.ejemplo.com
docker push registro.ejemplo.com/mi-app:2bbc62e
docker push registro.ejemplo.com/mi-app:latest

El segundo envío es casi instantáneo: las capas ya están en el registro y solo se añade la etiqueta. Un registro expone una API para consultar lo que contiene:

curl .../v2/_catalog{"repositories":["mi-app"]}
curl .../v2/mi-app/tags/list{"name":"mi-app","tags":["2bbc62e","latest"]}

El digest: la identidad de verdad

Las etiquetas se pueden mover. El digest es la huella criptográfica del contenido y no se puede falsificar ni reutilizar:

docker inspect --format '{{index .RepoDigests 0}}' registro.ejemplo.com/mi-app:2bbc62e
salidaregistro.ejemplo.com/mi-app@sha256:af364ec01e892e4343bb8285decc972be1e461d96e62d072e72dcc8fe3ffc6c0

Y se puede descargar y ejecutar por ese digest, sin pasar por ninguna etiqueta:

docker pull registro.ejemplo.com/mi-app@sha256:af364ec0...
salidahola desde una imagen mínima
Por qué latest no es una versión. No significa «la más reciente» ni «la estable»: es solo la etiqueta que Docker asume cuando no escribes ninguna, y apunta a lo último que alguien subió con ese nombre. Si producción arranca mi-app:latest, nadie puede responder con certeza qué código está corriendo, y volver atrás es imposible porque la etiqueta anterior ya no existe. Para desplegar hay que usar una etiqueta inmutable; latest vale como comodidad en desarrollo y nada más.

Qué poner en la etiqueta

Esquema Cuándo
2bbc62e, el commit corto El más práctico: enlaza la imagen con el código exacto
1.4.2, versión semántica Para bibliotecas y productos con publicaciones formales
2026-10-02-1430 Si no hay control de versiones de por medio
qa, produccion Evítalo: etiquetas móviles, mismo problema que latest
latest Solo como alias de conveniencia
Varias etiquetas para la misma imagen son útiles. Lo habitual es publicar a la vez mi-app:2bbc62e, mi-app:1.4.2 y mi-app:latest, las tres apuntando al mismo digest. Cada una sirve a un lector distinto: el commit para depurar, la versión para documentar y latest para quien solo quiere probar. Lo que no debe hacerse es desplegar por las dos últimas.

Dónde publicar

Registro Para qué
Docker Hub Imágenes públicas; con límites de descarga para anónimos
GitHub Container Registry Cómodo si el código ya está en GitHub
El del proveedor en la nube Cuando el despliegue ocurre allí mismo
registry:3 autoalojado Un contenedor; suficiente para una red interna