Docker Registry

Intermedio
Docker
Docker
Actualizado: 13/08/2025

¡Desbloquea el curso de Docker completo!

IA
Ejercicios
Certificado
Entrar

Mira la lección en vídeo

Accede al vídeo completo de esta lección y a más contenido exclusivo con el Plan Plus.

Desbloquear Plan Plus

Registry local y privado

Un registry privado es una solución autogestionada para almacenar y distribuir imágenes Docker dentro de una organización, sin depender de servicios externos como Docker Hub. Docker proporciona una imagen oficial llamada registry que permite desplegar un registry completamente funcional en minutos.

Esta solución resulta especialmente valiosa en entornos empresariales donde se necesita control total sobre las imágenes, cumplimiento de políticas de seguridad, o cuando se trabaja en redes aisladas sin acceso a internet.

Imagen oficial registry

Docker mantiene una imagen oficial llamada registry que puedes encontrar en Docker Hub. Esta imagen está basada en Alpine Linux y proporciona todas las funcionalidades necesarias para un registry de producción.

docker pull registry:3

La imagen registry:3 es la versión estable recomendada, que incluye todas las características necesarias para un despliegue empresarial. Esta imagen es extremadamente ligera, ocupando menos de 20MB, y está optimizada para un arranque rápido.

Ejecución básica

El despliegue más sencillo de un registry privado se realiza con un solo comando:

docker run -d -p 5000:5000 --name registry registry:3

Este comando despliega el registry en el puerto 5000, que es el puerto estándar para registries privados. El registry estará inmediatamente disponible en localhost:5000 y listo para recibir imágenes.

Para verificar que el registry está funcionando correctamente:

# Verificar estado del contenedor
docker ps

# Comprobar logs del registry
docker logs registry

# Verificar endpoint de salud
curl http://localhost:5000/v2/

El endpoint /v2/ debe devolver una respuesta vacía con código HTTP 200, indicando que la API v2 está activa y funcionando.

Almacenamiento persistente

Por defecto, el registry almacena las imágenes en el directorio /var/lib/registry dentro del contenedor. Para persistir los datos entre reinicios del contenedor, es esencial montar un volumen:

docker run -d \
  -p 5000:5000 \
  --restart=unless-stopped \
  --name registry \
  -v /opt/registry-data:/var/lib/registry \
  registry:3

Este montaje garantiza que todas las imágenes subidas al registry se mantengan disponibles aunque el contenedor se reinicie o actualice. El directorio /opt/registry-data en el host contendrá toda la estructura de datos del registry.

La estructura de almacenamiento sigue el formato:

/var/lib/registry/
├── docker/
│   └── registry/
│       └── v2/
│           ├── repositories/
│           └── blobs/

Subir y descargar imágenes

Para utilizar el registry privado, las imágenes deben etiquetarse con el hostname y puerto del registry:

# Etiquetar una imagen existente
docker tag nginx:latest localhost:5000/nginx:latest

# Subir al registry privado
docker push localhost:5000/nginx:latest

El proceso de descarga sigue la misma lógica:

# Descargar desde el registry privado
docker pull localhost:5000/nginx:latest

# Listar imágenes en el registry
curl -X GET http://localhost:5000/v2/_catalog

Namespaces y organización

Los registries privados soportan namespaces que permiten organizar las imágenes por equipos, proyectos o propósitos:

# Imágenes por equipo
docker tag myapp:latest localhost:5000/frontend-team/myapp:v1.0
docker tag database:latest localhost:5000/backend-team/database:v2.1

# Imágenes por entorno
docker tag myapp:latest localhost:5000/production/myapp:stable
docker tag myapp:latest localhost:5000/staging/myapp:latest

Esta organización facilita la gestión de permisos y el control de acceso cuando se implementen posteriormente capas de autenticación y autorización.

Endpoints de gestión

El registry expone varios endpoints útiles para administración y monitoreo:

Listar repositorios disponibles:

curl -X GET http://localhost:5000/v2/_catalog

Obtener tags de un repositorio específico:

curl -X GET http://localhost:5000/v2/nginx/tags/list

Verificar existencia de un manifest:

curl -I http://localhost:5000/v2/nginx/manifests/latest

Estos endpoints proporcionan una interfaz HTTP completa para integrar el registry con herramientas de automatización, scripts de despliegue, o sistemas de monitoreo.

Configuración avanzada de almacenamiento

Para entornos de producción, el registry puede configurarse con diferentes backends de almacenamiento mediante variables de entorno:

docker run -d \
  -p 5000:5000 \
  --name registry \
  -v /opt/registry-data:/var/lib/registry \
  -e REGISTRY_STORAGE_DELETE_ENABLED=true \
  -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry \
  registry:3

La variable REGISTRY_STORAGE_DELETE_ENABLED=true permite eliminar imágenes del registry, una característica que está deshabilitada por defecto por motivos de seguridad.

Un registry privado básico proporciona una base sólida para la distribución interna de imágenes, ofreciendo control completo sobre el almacenamiento y acceso a las imágenes Docker de una organización.

Autenticación y TLS

Guarda tu progreso

Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

La seguridad en un registry privado es fundamental cuando se despliega en entornos de producción o se expone a través de la red. Docker Registry soporta múltiples métodos de autenticación y cifrado TLS para proteger tanto el acceso como la transmisión de datos.

Autenticación básica HTTP

La forma más sencilla de proteger un registry privado es mediante autenticación básica HTTP. Este método requiere que los usuarios proporcionen credenciales válidas antes de poder interactuar con el registry.

Primero, debemos crear un archivo de usuarios con htpasswd:

# Instalar htpasswd si no está disponible
sudo apt-get install apache2-utils

# Crear archivo de usuarios
mkdir -p /opt/registry-auth
htpasswd -Bbn admin secretpassword > /opt/registry-auth/htpasswd

El flag -B utiliza bcrypt para el hash de la contraseña, proporcionando mayor seguridad que MD5. El flag -n evita que se solicite la contraseña interactivamente.

Ahora podemos desplegar el registry con autenticación habilitada:

docker run -d \
  -p 5000:5000 \
  --restart=unless-stopped \
  --name registry \
  -v /opt/registry-data:/var/lib/registry \
  -v /opt/registry-auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
  registry:3

Configuración del cliente Docker

Una vez habilitada la autenticación, los clientes deben autenticarse antes de realizar operaciones:

# Login en el registry privado
docker login localhost:5000
Username: admin
Password: secretpassword

# Las credenciales se almacenan en ~/.docker/config.json
cat ~/.docker/config.json

Tras el login exitoso, todas las operaciones de push y pull funcionarán normalmente:

# Subir imagen autenticada
docker push localhost:5000/nginx:latest

# Descargar imagen autenticada  
docker pull localhost:5000/nginx:latest

Certificados TLS autofirmados

Para cifrar la comunicación entre cliente y registry, necesitamos configurar TLS. Comenzamos creando certificados autofirmados para desarrollo y testing:

# Crear directorio para certificados
mkdir -p /opt/registry-certs

# Generar clave privada
openssl genrsa -out /opt/registry-certs/domain.key 4096

# Generar certificado autofirmado
openssl req -new -x509 -days 365 -key /opt/registry-certs/domain.key \
  -out /opt/registry-certs/domain.crt \
  -subj "/C=ES/ST=Madrid/L=Madrid/O=MyCompany/CN=localhost"

El parámetro CN=localhost debe coincidir con el hostname que utilizarán los clientes para acceder al registry.

Registry con TLS habilitado

Desplegamos el registry configurado para usar los certificados TLS:

docker run -d \
  -p 5000:5000 \
  --restart=unless-stopped \
  --name secure-registry \
  -v /opt/registry-data:/var/lib/registry \
  -v /opt/registry-auth:/auth \
  -v /opt/registry-certs:/certs \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
  -e "REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt" \
  -e "REGISTRY_HTTP_TLS_KEY=/certs/domain.key" \
  registry:3

Ahora el registry estará disponible en https://localhost:5000 con cifrado TLS completo.

Configuración de cliente para TLS

Para certificados autofirmados, Docker necesita confiar explícitamente en el certificado:

# Crear directorio para certificados de Docker
sudo mkdir -p /etc/docker/certs.d/localhost:5000

# Copiar certificado público
sudo cp /opt/registry-certs/domain.crt /etc/docker/certs.d/localhost:5000/ca.crt

# Reiniciar Docker daemon
sudo systemctl restart docker

Alternativamente, podemos configurar Docker para omitir la verificación TLS en desarrollo:

# Editar configuración de Docker daemon
sudo nano /etc/docker/daemon.json

# Añadir registry inseguro
{
  "insecure-registries": ["localhost:5000"]
}

# Reiniciar Docker
sudo systemctl restart docker

Autenticación y TLS combinados

Con ambas características habilitadas, el flujo de trabajo completo incluye autenticación segura:

# Login con HTTPS
docker login https://localhost:5000
Username: admin
Password: secretpassword

# Todas las comunicaciones están cifradas
docker push localhost:5000/myapp:secure
docker pull localhost:5000/myapp:secure

Verificación de configuración TLS

Podemos verificar que el cifrado TLS está funcionando correctamente:

# Comprobar certificado del servidor
openssl s_client -connect localhost:5000 -servername localhost

# Verificar endpoints con curl
curl -k -u admin:secretpassword https://localhost:5000/v2/

# Verificar catálogo de imágenes
curl -k -u admin:secretpassword https://localhost:5000/v2/_catalog

El flag -k en curl ignora errores de certificado para pruebas con certificados autofirmados.

Certificados de autoridades certificadoras

Para entornos de producción, se recomienda utilizar certificados emitidos por una autoridad certificadora reconocida:

# Estructura de certificados para CA válida
/etc/docker/certs.d/myregistry.company.com:5000/
├── client.cert    # Certificado cliente (opcional)
├── client.key     # Clave privada cliente (opcional)  
└── ca.crt         # Certificado CA raíz

Configuración avanzada de autenticación

El registry soporta múltiples usuarios en el mismo archivo htpasswd:

# Añadir usuarios adicionales
htpasswd -B /opt/registry-auth/htpasswd developer
htpasswd -B /opt/registry-auth/htpasswd qa-team
htpasswd -B /opt/registry-auth/htpasswd devops

# Verificar usuarios creados
cat /opt/registry-auth/htpasswd

Cada usuario podrá autenticarse independientemente, aunque todos tendrán acceso completo al registry. Para control de acceso granular por repositorio, se requieren soluciones de autorización más avanzadas fuera del alcance de esta lección.

La combinación de autenticación básica y TLS proporciona una base de seguridad sólida para registries privados, asegurando que solo usuarios autorizados puedan acceder a las imágenes y que toda la comunicación esté cifrada.

Aprendizajes de esta lección de Docker

  • Comprender qué es un Docker Registry privado y su utilidad en entornos empresariales.
  • Aprender a desplegar un registry local usando la imagen oficial y configurar almacenamiento persistente.
  • Saber cómo subir, descargar y organizar imágenes en un registry privado mediante namespaces.
  • Configurar autenticación básica HTTP para proteger el acceso al registry.
  • Implementar cifrado TLS con certificados autofirmados para asegurar la comunicación entre cliente y registry.

Completa este curso de Docker y certifícate

Únete a nuestra plataforma de cursos de programación y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.

Asistente IA

Resuelve dudas al instante

Ejercicios

Practica con proyectos reales

Certificados

Valida tus conocimientos

Más de 25.000 desarrolladores ya se han certificado con CertiDevs

⭐⭐⭐⭐⭐
4.9/5 valoración