docker-compose es una herramienta para gestionar contenedores de Docker que resuelve problemas complejos de despliegue de aplicaciones, pero no es suficiente para el self-hosting simple orientado al mercado masivo
- Se necesita una abstracción de más alto nivel que incluya conceptos como bases de datos SQL, caché local, almacenamiento persistente, descubrimiento de servicios y gestión de recursos
El papel de Docker
- Docker es la herramienta que popularizó la contenerización, y el sistema host puede compararse con un barco.
- Hay hardware, sistema operativo y un runtime de contenedores; los contenedores se ejecutan dentro del runtime y se comunican con otros servicios como bases de datos o servidores web.
El papel de Docker-compose
docker-compose es una herramienta para definir grupos de contenedores que trabajan juntos, y facilita el despliegue de aplicaciones de self-hosting.
- Sin embargo, rompe la interfaz estandarizada y vuelve a reproducir los problemas que los contenedores originalmente resolvían.
- Ejemplo: Pihole
- Pihole es un servidor DNS y requiere un archivo
docker-compose complejo.
- Hay que configurar nombre del contenedor, imagen, puertos, variables de entorno, volúmenes, funciones adicionales, políticas de reinicio, etc.
- La configuración compleja debe ser gestionada directamente por el usuario, y eso es una desventaja de Docker Compose
- Ejemplo: Jitsi Meet
- Jitsi Meet es un software complejo que genera una configuración de
docker-compose con 4 contenedores, 7 volúmenes, 9 puertos y más de 200 variables de entorno.
- Ejemplo: otras aplicaciones populares de self-hosting también sufren problemas similares
- Hay varias aplicaciones como Authentik, Nextcloud, Immich, Jellyfin y Paperless NGX, y cada configuración de
docker-compose reemplaza desde decenas hasta cientos de comandos docker.
- Cada aplicación puede incluir su propia base de datos, caché y manejador HTTP, lo que lleva a un uso duplicado de recursos.
Problemas
docker-compose es demasiado flexible y detallado, y opera en una capa de abstracción incorrecta.
- Cada aplicación tiene su propio proceso de manejo HTTP, caché o base de datos. Hacer respaldos de las bases de datos queda en manos del operador del sistema.
- Ejemplo: proxy HTTP inverso
- Un proxy HTTP inverso es un programa que reenvía solicitudes HTTP entrantes a otros programas. Cada programa debe decidir si incluirá o no un servidor web.
- Incluir servidor web
- Si se incluye un servidor web, el programa funciona, pero solo en puertos específicos, y si hay varios contenedores, hay que remapear los puertos.
- No incluir servidor web
- Si no se incluye un servidor web, no se desperdician recursos, pero la aplicación debe configurarse sin una interfaz de administración.
- DNS
- La interfaz web tiene una dirección y, si se quiere TLS, necesita un nombre. Si se ejecutan varios servicios en un solo host, las solicitudes deben enrutarse por nombre de dominio o por ruta.
- Puertos
docker-compose permite exponer y remapear puertos, pero en la práctica debería soportar configuraciones de red complejas.
- Ejemplo: base de datos
- En una base de datos, todos los cambios en archivos se eliminan cuando se borra el contenedor. El contenedor de la base de datos debe agregar un volumen para guardar su contenido.
- N+1=2 o más
- Para respaldar la base de datos se necesitan copias de seguridad fuera del sitio. Si cada servicio incluye su propio proceso de servidor de base de datos por separado, se desperdician recursos de cómputo.
Solución
- Hay que moverse a una capa de abstracción más alta y añadir semánticas que distingan tipos de contenedor como base de datos, proxy web inverso, caché y recursos web estáticos.
- Ejemplo de semánticas
- Se introduce un nuevo formato de configuración para especificar nombre de la aplicación, build, proxy HTTPS inverso y servicio de caché.
- Solución #1
- Cada programa solicita un proxy inverso, evitando duplicación y desperdicio. El proxy inverso proporciona un nombre DNS y reenvía todas las rutas al programa.
- Solución #1.5
- Se agrega una sección de base de datos para solicitar una base de datos compatible con el estándar SQL, y el programa espera privilegios "completos".
- Solución para los puertos
- Cada programa puede recibir su propia dirección IPv6 y usar números de puerto estándar. Por seguridad, se usa un firewall para que solo el proxy inverso pueda acceder a los puertos.
Tealok - un nuevo runtime de contenedores
- Tealok es un nuevo runtime de contenedores que ofrece una abstracción más alta e interfaces estandarizadas.
- Maneja automáticamente certificados TLS, configuración de proxy inverso, registros DNS, gestión de respaldos y más.
- Aprovecha IPv6 para que cada contenedor tenga una dirección IP independiente y pueda usar números de puerto estándar.
- Los desarrolladores de aplicaciones pueden desplegarlas mediante interfaces estándar sin configuraciones complejas.
- Para los operadores, ofrece mejores prácticas consistentes, menos desperdicio de recursos y menor carga administrativa.
- Para los desarrolladores, simplifica la forma de desplegar y reduce la carga de tomar decisiones.
- Los usuarios pueden garantizar la propiedad de sus datos y la independencia de la computación en la nube.
6 comentarios
Entré a tealok y, por lo que vi, no parece estar en un estado como para ser una alternativa, ¿no?
Ojalá también hubieran quitado el runtime.
Todavía creo que sigue siendo necesario usar
docker-composepara armar un entorno de operación y entrar a él, pero...Cuesta estar de acuerdo con eso de decir que, basándose en una experiencia dentro de un entorno especial y propio, eso está mal y por eso hicieron algo nuevo... jajaja
Es un contenido que se puede malinterpretar fácilmente jajajaja...
Como yo había pensado al ver solo el título: "Ah, de verdad no me gusta usarlo en el entorno de desarrollo..." jajaja
Me parece que intentar usar Docker Compose para el mismo propósito que en el artículo es, desde el principio, un enfoque equivocado.
Estoy parcialmente de acuerdo, pero no creo que el enfoque haya sido incorrecto.
Probablemente fue lo mejor que podían hacer en el entorno que tenían :)
Opiniones de Hacker News
Existe una solución simple para los problemas de mapeo de puertos y respaldo de volúmenes de datos
docker-composepara el entorno de desarrollo y definir configuraciones distintas según el entornoComo alguien que usa Docker para self-hosting en un servidor personal, valoro positivamente la flexibilidad de la configuración de Docker
macvlanpara asignar una IP y una dirección MAC únicas a cada contenedordocker-composese usa principalmente para desarrollo o uso personal, y V2, a diferencia de V1, es un plugin integrado en DockerEn producción, es mejor usar Kubernetes, mientras que
docker-composees adecuado para desarrollo localdocker-composees un producto para self-hosting a pequeña escala, dirigido a personas sin experiencia técnicaEscribir un programa para controlar Docker es más simple de lo que parece, y se pueden resolver problemas usando scripts de Python
Se está desarrollando
canine.shpara que usar un clúster de Kubernetes sea tan fácil como HerokuResulta interesante que Tealok esté desarrollando una alternativa a
docker-composeSe considera que
docker-compose, Kubernetes y Helm son capas de abstracción equivocadasHay confusión ante la afirmación de que
docker-composees una capa de abstracción equivocada