Docker Registry y Distribución de Imágenes

Lectura
20 min~4 min lectura

Concepto clave

Un Docker Registry es un sistema de almacenamiento y distribución de imágenes Docker. Piensa en él como un repositorio centralizado, similar a GitHub para código fuente, pero para imágenes de contenedores. Cuando construyes una imagen con docker build, puedes subirla (push) a un registry y luego descargarla (pull) desde cualquier otro entorno, como un servidor de producción o el equipo de un colega.

El registry más conocido es Docker Hub, pero también existen alternativas privadas como Amazon ECR, Google Container Registry o GitHub Container Registry. Usar un registry es esencial para integrar Docker en flujos de CI/CD, ya que permite versionar imágenes, controlar accesos y automatizar despliegues.

Una imagen se identifica por su nombre y etiqueta (tag). Por ejemplo, mi-app:1.0.0. El nombre suele incluir el repositorio, como usuario/mi-app. Las etiquetas permiten versionar y gestionar lanzamientos. Una buena práctica es usar etiquetas semánticas (1.0.0, 1.0.1) y evitar la etiqueta latest en producción porque es ambigua.

Cómo funciona en la práctica

Para usar un registry, primero debes autenticarte. Con Docker Hub, ejecutas docker login y proporcionas tus credenciales. Luego, etiquetas tu imagen local con el nombre del registry y el repositorio deseado:

docker tag mi-app:1.0.0 usuario/mi-app:1.0.0

Después, subes la imagen:

docker push usuario/mi-app:1.0.0

En el servidor de producción, autenticas (si es privado) y ejecutas:

docker pull usuario/mi-app:1.0.0
 docker run -d -p 80:80 usuario/mi-app:1.0.0

Este flujo se automatiza en CI/CD: tras cada commit, el pipeline construye la imagen, la etiqueta con el número de versión (o commit SHA) y la sube al registry. Luego, un sistema de orquestación como Kubernetes o Docker Swarm la descarga y despliega.

Código en acción

Vamos a crear un ejemplo completo: construir una imagen simple, subirla a Docker Hub y luego descargarla en otro lugar. Primero, crea un archivo Dockerfile:

FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html

Crea un index.html con contenido básico. Luego, construye y etiqueta:

docker build -t mi-web:1.0.0 .
 docker tag mi-web:1.0.0 tucuenta/mi-web:1.0.0

Autentica y sube:

docker login
 docker push tucuenta/mi-web:1.0.0

Para verificar, puedes eliminar la imagen local y descargarla:

docker rmi tucuenta/mi-web:1.0.0
 docker pull tucuenta/mi-web:1.0.0
 docker run -d -p 8080:80 tucuenta/mi-web:1.0.0

Ahora visita http://localhost:8080 y deberías ver tu página.

Errores comunes

  1. No autenticarse antes de hacer push: Recibirás un error de denegación de acceso. Solución: ejecuta docker login primero.
  2. Usar la etiqueta latest en producción: Dificulta el rollback y la trazabilidad. Solución: usa etiquetas semánticas o el SHA del commit.
  3. Olvidar etiquetar la imagen con el nombre del registry: El push falla porque Docker no sabe a dónde subir. Solución: siempre etiqueta con usuario/repo:tag.
  4. Subir imágenes con información sensible (contraseñas, tokens): Quedan expuestas en el registry. Solución: usa variables de entorno o secretos en tiempo de ejecución, no en la imagen.
  5. No limpiar imágenes antiguas del registry: Ocupan espacio y aumentan costos. Solución: implementa políticas de retención o borra manualmente versiones obsoletas.

Checklist de dominio

  • Autenticarse en un registry (Docker Hub, ECR, etc.)
  • Etiquetar una imagen local con el formato usuario/repositorio:tag
  • Subir una imagen al registry con docker push
  • Descargar una imagen desde el registry con docker pull
  • Verificar que la imagen subida aparece en la interfaz web del registry
  • Usar etiquetas semánticas en lugar de latest para versiones de producción
  • Automatizar push y pull en un pipeline de CI/CD

Publicar y consumir una imagen Docker en un registry público

Objetivo: Crear una imagen Docker simple, subirla a Docker Hub y luego descargarla en otro equipo (o el mismo) para verificar su funcionamiento.

  1. Crea una cuenta en Docker Hub si no tienes una.
  2. En tu máquina local, crea un directorio llamado ejercicio-registry.
  3. Dentro, crea un archivo Dockerfile con el siguiente contenido:
    FROM alpine:latest
    CMD ["echo", "Hola desde mi imagen publicada"]
  4. Construye la imagen con el tag tu-usuario/mi-primera-imagen:1.0.0 (reemplaza tu-usuario por tu nombre de usuario de Docker Hub).
  5. Autentícate en Docker Hub con docker login.
  6. Sube la imagen al registry con docker push.
  7. Verifica en la interfaz web de Docker Hub que la imagen aparece en tu repositorio.
  8. Elimina la imagen local con docker rmi.
  9. Descarga la imagen desde Docker Hub con docker pull.
  10. Ejecuta un contenedor con la imagen descargada y verifica que imprime el mensaje.

Entregable: Captura de pantalla mostrando el output del comando docker run que imprime "Hola desde mi imagen publicada".

Rúbrica de evaluación:

  • La imagen se subió correctamente (visible en Docker Hub) - 25%
  • La imagen se descargó y ejecutó sin errores - 25%
  • El mensaje esperado se mostró en la salida - 25%
  • Se usó una etiqueta semántica (no latest) - 25%
Pistas
  • Asegúrate de que el tag incluya tu nombre de usuario de Docker Hub, por ejemplo: tu-usuario/mi-primera-imagen:1.0.0.
  • Si el push falla con 'denied', verifica que hayas ejecutado docker login y que el repositorio exista en Docker Hub (puede crearse automáticamente al hacer push).
  • Para verificar que la imagen se eliminó correctamente, usa docker images antes del pull.