622 - Iniciando contenedores automáticamente con Docker
Descubre cómo automatizar el inicio y detención de contenedores #Docker o #Podman con Sablier y optimiza tus recursos en #Linux
El otro día un usuario del grupo de Telegram de atareao con Linux preguntaba sobre la posibilidad de pausar y reanudar contenedores de Docker según necesidad. Y con según necesidad es que si no estás utilizando el contenedor este se detenga, y cuando lo necesites se inicie automáticamente. Y la verdad es que no es una mala idea. Porque si tienes un contenedor que no utilizas con frecuencia, no tiene sentido que esté consumiendo recursos. Y si lo necesitas, pues que se inicie automáticamente. Así que vamos a ver cómo podemos hacer esto, de forma sencilla y sin excesivas complicaciones, al menos en la medida de lo posible.
Iniciando contenedores automáticamente con Docker
Mis reticencias
Antes que nada quiero dejar claro que no estoy muy a favor de este tipo de automatizaciones. Y no es que no me gusten las automatizaciones, que me encantan. Pero en este caso, no me parece que sea la mejor solución. Y es que si tienes un contenedor que no utilizas con frecuencia, lo mejor es que lo detengas manualmente. Y si lo necesitas, lo inicias manualmente. Y es que si automatizas este proceso, puede que te encuentres con que el contenedor se inicia cuando no lo necesitas, o que no se inicia cuando lo necesitas. Y eso puede ser un problema.
Por un lado, la cuestión es encontrar servicios en contenedor que consuman los mínimos recursos imprescindibles. Y por otro lado, en general, muchos de estos recursos los utilizamos solo nosotros. Y cuando realmente consumen recursos, es cuando se utilizan. Por ejemplo, una página web, tiene mucho consumo cuando lo visita mucha gente, cuando no lo visita nadie, a penas tiene consumo, y desde este punto de vista, no tiene sentido detenerlo.
Sin embargo, para una herramienta que tenga un elevado consumo, a lo mejor si tiene sentido, pero ¿que ocurre con el resto de elementos del stack?. Por ejemplo, una página web, con su caché y su base de datos. ¿Detenemos la base de datos y la caché cuando no se utiliza la página web?. ¿como detenemos todo?¿Se reiniciará de forma correcta?.
Sea como fuere, si todavía tienes la necesidad de utilizar este tipo de solución, indicarte que existe una imagen docker, que conectándose al socket de docker te permite hacerlo de forma relativamente sencilla. Este servicio se llama Sablier.
Dasboard
Una solución mucho mejor, desde mi punto de vista, sería utilizar un Dashboard, que nos permitiera iniciar y detener los contenedores de forma manual. Esto nos garantizaría un mejor y mas preciso control de los contenedores.
En concreto, para esta nueva temporada, uno de mis objetivos es precisamente el de hacer un Dashboard para Docker, que me permita controlar los contenedores de forma sencilla y rápida. Y es que, aunque existen muchos Dashboard para Docker, no he encontrado ninguno que se ajuste a mis necesidades.
Otra opción, por supuesto es utilizar otro tipo de servicios como puede ser Portainer o Yatch. Pero en mi caso, quiero algo más sencillo y que se ajuste a mis necesidades.
Sablier
Sablier es un servicio que se conecta al socket de docker y te permite detener y reanudar contenedores de forma automática. Se trata de un servicio Open Source que te permite escalar el uso de tu servidor en base a la demanda.
Si bien Sablier se puede utilizar en Kubernetes, Docker Swarm, Podman, y mas, yo me voy a centrar en Docker, que es el objetivo de este episodio.
Simplificando mucho el funcionamiento de Sablier, se trata de una API que se encarga de iniciar contenedores durante un período de tiempo definido, y detenerlos cuando no se están utilizando.
Sablier proporciona integraciones con diferentes proxies inversos, como Traefik, Caddy, y Nginx, de forma que inicia el contenedor cuando recibe una petición, y lo detiene cuando no recibe peticiones durante un tiempo determinado.
Por otro lado, en este episodio solo comentaré la integración por Traefik, dado que es la herramienta que estoy utilizando, pero en la la página de Sablier puedes encontrar información sobre el resto de configuración para los otros proxies inversos.
Instalación de Sablier
En mi caso para la instalación de Sablier, he utilizado Docker Compose. Y para ello he creado un archivo docker-compose.yml
con el siguiente contenido:
services:
sablier:
image: acouvreur/sablier:1.7.0
container_name: sablier
init: true
restart: unless-stopped
volumes:
- ./sablier.yml:/etc/sablier/sablier.yml
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
whoami:
image: containous/whoami:v1.5.0
container_name: whoami
init: true
restart: unless-stopped
networks:
- proxy
labels:
- sablier.enable=true
- sablier.group=default
networks:
proxy:
external: true
En mi caso, he añadido whoami
para hacer referencia a este servicio como ejemplo. Y aquí, cabe destacar las etiquetas que se utilizan para trabajar con sablier. En concreto, sablier.enable=true
y sablier.group=default
.
Integración con Traefik
La integración con Traefik, no es lo sencilla que a mi me gustaría, pero tiene su justificación, y es que, cuando un contenedor se detiene, Traefik lo elimina del pool. Por lo que no es posible utilizar las etiquetas para el descubrimiento automático. En su lugar, debes utilizar el proveedor de archivo de configuración dinámica. Que yo creo que es de las cosas que normalmente despista mas a los usuarios de Traefik.
El primer paso es añadir el plugin de sablier a la configuración estática. Tan sencillo como lo siguiente,
sablier:
moduleName: "github.com/acouvreur/sablier"
version: "v1.7.0"
Mientras que en la configuración dinámica, debes añadir el siguiente fragmento,
services:
whoami:
loadBalancer:
servers:
- url: "http://whoami:80"
routers:
whoami:
rule: Host(`whoami.territoriolinux.es`)
middlewares:
- my-sablier@file
service: "whoami"
middlewares:
my-sablier:
plugin:
sablier:
group: default
dynamic:
displayName: Tu página de inicio
refreshFrequency: 5s
showDetails: "true"
theme: hacker-terminal
sablierUrl: http://sablier:10000
sessionDuration: 1m
Configuración de Sablier
A parte de la configuración del proxy inverso que estés utilizando para su funcionamiento con Sablier, es necesario configurar Sablier propiamente, para lo que tienes que utilizar el archivo sablier.yml
, como has visto en el archivo docker-compose.yml
.
El archivo de configuración por defecto lo puedes encontrar en la documentación de Sablier. Yo no he modificado ninguno de los parámetros que vienen por defecto, ni siquiera el tema.
Respecto a la forma de hacer esperar al usuario mientras se inicia el contenedor, se establecen dos estrategias. Una denominada dinámica que lo que hace es mostrar una página de espera, o la estrategia bloqueante que cuelga la petición hasta que el contenedor está listo.
Respecto a la página de espera, es posible configurar varios temas, ghost
, shuffle
, hacker-terminal
y matrix
. Pero también es posible definir tus propios temas personalizados.
Conclusión
Como ves las posibilidades que te ofrece Sablier son mas que suficientes para poder automatizar el inicio y detención de contenedores de Docker. Y aunque no es la solución que yo utilizaría, si es cierto que puede ser una solución interesante para algunos casos.
Uno de los casos que he encontrado que podría ser interesante es utilizar un VSCode en tu propio servidor. Aquí, este VSCode no estaría funcionando hasta que no lo necesitaras, y cuando lo necesitaras, se iniciaría automáticamente. Es una posibilidad…
Sin embargo, creo que la opción de un Dashboard es mucho mas interesante, porque te permite tener mas control. Por ejemplo, si solo lo quieres iniciar tu, si utilizas un Dashboard con control de acceso y autenticación, podrías iniciar y detener los contenedores de forma segura, y solo por aquellos que tengan permisos.
Hace ya tiempo que dejé docker, no le veo ninguna ventaja a tener contenedores. Aunque hay opciones chulas como CasaOS que te facilitan mucho la instalación y se puede gestionar de manera muy sencilla con una UI, la cantidad de configuración y recursos que hay que dedicar a aprender y mantener las aplicaciones, simplemente (en mi caso) no merecen la pena.
¿Qué alternativa uso? Tengo un pequeño servidor (eliteg3mini800) con Proxmox y utilizo los scripts de Tteck (https://tteck.github.io/Proxmox), sistemas operativos (contenedores) separados con IPs, configuración y respaldos diferentes, lo que me ahorra muchos quebraderos de cabeza si aparecen problemas. Luego un nginxproxymanager para salir a internet y para los locos del control algún dashboard que te permita lanzar las diferentes apps desde una interfaz común (hay muchas opciones).
Muchas gracias por tu contenido y tu aporte!
Hola Nacho,
La verdad es que sois varios los que me habéis hablado de CasaOS, y me resulta interesante. La cuestión es que en mi caso, al contrario de lo que te sucede a ti, yo me encuentro tremendamente cómodo con los contenedores y me resulta muy práctico gestionarlo todo de esa forma. Soluciones como Traefik, Watchtower o Crowdsec, me ahorran mucho trabajo.
Muchas gracias por compartir tu experiencia, me parece muy interesante. Gracias.