Unregistry – envía `docker push` directamente a un servidor sin usar un registro
(github.com/psviderski)- Unregistry es una herramienta open source que permite transferir imágenes de Docker directamente a un servidor remoto sin usar un registro externo
- Con el comando
docker pussh, envía imágenes al servidor remoto por SSH de forma eficiente, omitiendo las capas que ya existen - Resuelve la complejidad e ineficiencia de Docker Hub tradicional, un registro propio y el método save/load
- Su gran ventaja es la transferencia rápida y segura de imágenes en despliegues a producción, CI/CD y entornos aislados sin internet
- La instalación, el uso y los requisitos son muy simples, y no hace falta operar servicios adicionales ni exponer puertos
Introducción a Unregistry y principales ventajas
- Unregistry es un registro de imágenes liviano que guarda y sirve imágenes directamente desde el almacenamiento del daemon de Docker
- Con el comando
docker pussh, es posible mover imágenes a un servidor Docker remoto por SSH sin pasar por un registro externo - Durante la transferencia, excluye las capas que ya existen en el servidor y ofrece la eficiencia de enviar rápido solo lo necesario
Problemas del despliegue tradicional de imágenes Docker
- Al transferir una imagen construida localmente al servidor, las opciones suelen ser las siguientes
- Docker Hub/GitHub Container Registry: el código puede quedar expuesto externamente o generar costos al usar repositorios privados
- Registro propio: aumenta la carga de operar un servicio adicional y gestionar seguridad y almacenamiento
- Save/Load: siempre transfiere la imagen completa, lo que resulta ineficiente
- Reconstrucción directa en el servidor: desperdicia tiempo y recursos del servidor, además de generar problemas de depuración
La solución de Unregistry
-
Con un solo comando,
docker pussh myapp:latest user@server, se puede hacer una transferencia directa sin almacenamiento intermedio -
No requiere configuración adicional de registro, exposición de puertos, preparación de almacenamiento ni suscripciones
-
Proceso de transferencia
- Abre un túnel SSH hacia el servidor remoto
- Ejecuta temporalmente un contenedor de unregistry
- Conecta un puerto local aleatorio con el puerto de unregistry
- Envía con
docker pushsolo las capas inexistentes (listas para usar de inmediato) - Cierra el contenedor de unregistry y el túnel SSH
-
Funciona de forma simple y eficiente, como
rsync -
Este proyecto fue desarrollado en Uncloud para simplificar la complejidad de desplegar contenedores en múltiples hosts Docker
Ejemplos de uso
Envío directo de imágenes al entorno de despliegue
- Haz build localmente y luego push directo al servidor de producción
docker build --platform linux/amd64 -t myapp:1.2.3 .docker pussh myapp:1.2.3 deploy@prod-serverssh deploy@prod-server docker run -d myapp:1.2.3
Pipeline de CI/CD
- Permite build y despliegue sin la complejidad de un registro
- Puede usarse la transferencia directa en un YAML de GitHub Actions, por ejemplo
Homelab y entornos aislados sin internet
- Transfiere imágenes de forma segura a una red aislada sin exponerlas a internet
Cómo usarlo
- La cuenta de usuario SSH debe poder ejecutar comandos de Docker en el servidor remoto
- Soporta opciones adicionales como clave privada SSH o puerto SSH personalizado
- También admite transferencia de imágenes multiplataforma (si está basado en containerd)
Requisitos
Entorno local
- Docker CLI (con soporte para plugins, 19.03+)
- Cliente OpenSSH
Servidor remoto
- Docker debe estar instalado y en ejecución
- El usuario de SSH debe tener permisos sobre Docker y, si hace falta, poder ejecutar
sudo dockersin contraseña - El uso de containerd image store mejora el rendimiento
- Hay que agregar la siguiente configuración en
/etc/docker/daemon.jsony reiniciar Docker{ "features": { "containerd-snapshotter": true } }
- Hay que agregar la siguiente configuración en
Uso avanzado
Uso como registro local independiente
- Es posible operar unregistry fácilmente como un registro local sin componentes adicionales
- Se puede hacer deploy y push con comandos de Docker
Uso de opciones SSH personalizadas
- Se puede usar el archivo de configuración SSH para definir ajustes detallados según las condiciones necesarias, como autenticación adicional o puertos
Contribuciones y comunidad
- Si encuentras errores, puedes registrarlos en GitHub Issues
- En la comunidad de Discord de Uncloud se pueden discutir features, roadmap y detalles de implementación
Inspiración y proyectos open source de referencia
- Spegel: inspiró parte de la implementación de un registro de imágenes de contenedores P2P basado en containerd
- Docker Distribution: se usa como base para la implementación real del registro
Resumen
- Unregistry es una herramienta para transferir imágenes de Docker de forma fácil y rápida directamente a un servidor remoto, eliminando la carga de montar y administrar un registro
- Ofrece ventajas muy fuertes en escenarios como despliegues a producción, CI/CD y redes aisladas
- Es una opción muy adecuada cuando se quiere mover imágenes entre servidor y administrador de forma simple, sin procesos adicionales
1 comentarios
Opiniones en Hacker News
Por las características del servidor, los límites de seguridad y el hardening, no me gustaría recomendar usar Homebrew en Linux; aunque existe una instalación para Linux, se siente más como algo agregado a posteriori, y más que un gestor de paquetes parece una paloma sobre un tablero de ajedrez
Me parece una gran idea que encaja muy bien en lugares donde ya se usa tooling de despliegue push como Ansible; además, da la impresión de que también sirve como técnica de despliegue de hotfixes para empresas donde el Docker registry no está disponible 24/7. Me pregunto si se integra de forma limpia con tooling OCI (como buildah), o si hace falta tener una instalación completa de Docker en ambos lados. Todavía no lo he investigado a fondo, pero pienso trabajar en algo relacionado, y sentí que a skopeo le faltaba la capacidad de bootstrapear su propio registry en el servidor remoto para que funcione en este tipo de entorno
El servidor remoto necesita containerd (Docker y Kubernetes también usan containerd), y del lado del cliente sirve cualquier cosa que entienda la API del registry (OCI Distribution spec: https://github.com/opencontainers/distribution-spec). Unregistry reutiliza el código oficial del Docker registry como capa de API, así que se siente parecido al registry de Docker Hub. Puedes usar skopeo, crane, regclient, BuildKit y otras herramientas que usan OCI registry, pero para eso hace falta ejecutar unregistry directamente en el host remoto. El comando
docker pusshusa Docker local para automatizar todo ese flujo. Como es un script de bash, vale la pena echarle un vistazo: https://github.com/psviderski/unregistry/blob/main/docker-pussh, y también es fácil modificarlo a gustoSe necesita un docker daemon en ambos lados; este método usa una forma ingeniosa de compartir layers por
sshentre los dos daemonsCreo que el comando
pusshes fácil de recordar, autoexplicativo y muestra un buen juego de palabras al diferenciarse por una sola letra del comando estándar existentepusshestá bien, pero para automatización quizá sería mejor un alias más claro comodocker push-over-ssh; alguien que veapusshpor primera vez podría pensar que es un error tipográfico y causar confusión innecesaria. Estaría bueno soportar tanto la versión corta como la versión completa con flagsHay una explicación en tono de broma de que la
sextra representasssh; otros dicen que simplemente es un typoEl nombre
pusshpodría entrar en conflicto con otros comandosEsto debió existir desde hace tiempo y me parece muy genial; el Docker registry tiene valor por sí mismo, pero en general se ha vuelto demasiado complejo y cada vez más alejado del espíritu hacker
El proyecto y el enfoque me parecen impresionantes; cansado de registries caros, llegué a hostear algo como Zot(https://zotregistry.dev) por mi cuenta, pero este método se ve mucho más simple para ciertos casos de uso. Ojalá los servicios de private registry que sean fáciles, baratos y basados en consumo fueran más comunes
Creo que Docker debió funcionar así desde el principio; me parece una idea genial
docker save -o my-app.tar my-app:latesty cargar condocker load -i /path/to/my-app.tar. Combinado con herramientas de automatización como ansible, se puede hacer manualmente lo que Unregistry automatiza. Sin embargo, el repo de GitHub menciona como desventaja que el método save/load obliga a transferir siempre la imagen completa, y además gestionar imágenes es más cómodo que trabajar con archivos de archivoMe alegra este regreso al self-hosting usando herramientas como esta y tooling basado en SSH; me parece un trabajo bien hecho y planeo probarlo personalmente
Gracias a esta herramienta conocí por primera vez un proyecto llamado uncloud, y me parece interesante porque se ve como una solución de despliegue en servidor tipo dokku, pero más potente, justo lo que quería
Coincido con el comentario de que uncloud le queda muy bien a ciertas personas; si tienen dudas, son bienvenidas en Discord
También recomiendo ver https://skateco.github.io/, que ofrece un enfoque parecido
Recomiendo Portainer; estoy operando bien con Portainer Community Edition y Portainer Agent en dos instancias de AWS EC2. La función de stacks (basada en docker compose) es su punto fuerte, y en una de las EC2 el portainer agent ejecuta Caddy como contenedor para cumplir el rol de load balancer y reverse proxy
Es una idea novedosa, aunque este enfoque queda muy acoplado al despliegue del servicio, y para despliegue y escalado —por ejemplo, en un despliegue blue/green— hace falta lógica adicional que entienda el “push”. Pensándolo mejor, veo que esa función es parte de la estructura implementada en uncloud. Pero al final todo es un trade-off, y si priorizas la simplicidad en una sola VM de Hetzner, puede ser una opción totalmente satisfactoria incluso con solo hacer build local de las imágenes