435 - Que le DEN a Docker

PodcastPodcast

435 - Que le DEN a Docker

DEN es un servicio de notificaciones que implementé en Rust para conocer lo que sucede con tus contenedores y otros objetos Docker en Telegram

1:25
-3:15

No te preocupes, que esto de que le den a Docker, no significa que me vaya a olvidar de Docker, nada de eso y mas bien todo lo contrario. Y es que llevo algunas semanas frenéticas, entre actualizaciones, migraciones y otras historias, que me están haciendo poner el ojo precisamente en saber al instante que sucede con todos los servicios que tengo actualmente levantados en Docker.

Estaba revisando los servicios que tengo levantados en Docker, y actualmente están en torno a los 40. Aunque ya te digo que van variando según el día de la semana. Normalmente los fines de semana van creciendo.

La cuestión, es que poco a poco, estoy quitando algunos de los servicios que menos utilizo, en uno de los servidores y dejando los importantes. Todo ello, en el que actualmente se ha convertido en el VPS principal. Esto ha comenzado a preocuparme, en el sentido de que quiero estar informado de que está todo bien. Y es precisamente aquí donde nace DEN y el motivo de que le den a Docker.

Que le DEN a Docker

Que le DEN a Docker

Las últimas semanas

Como sabes las últimas semanas han sido frenéticas y traumáticas. Frenéticas, por la actualización de algunos de los servicios que estoy utilizando, y la migración de algunas páginas web. Y traumáticas, por lo que ya te comenté la semana pasada, de los problemas, que me generé a mi mismo cuando hice esa migración de webs.

Esto de que algunos servicios me los encuentre caídos, no es nada nuevo. Ya te lo he comentado en mas de una ocasión, y es precisamente lo que me llevó a abandonar FreshRSS en su momento y reemplazarlo por MiniFlux.

Sin embargo, este reemplazo, no ha sido la panacea, porque por el momento sigo teniendo problemas de caídas de estos servicios. En estas últimas ocasiones, mas bien, soy yo el responsable de las mismas.

Pero, sin lugar a dudas, lo que mas me preocupa es no enterarme de lo que sucede, no enterarme de que tengo un servicio caído. Y sobre todo, evitarme la frustración de encontrarme que uno de los servicios en los que confío no está funcionando o no poder utilizarlo.

Uno de los problemas es WatchTower

Como te digo, esto me ha venido sucediendo desde hace algún tiempo, y de hecho, uno de los responsables de esto es WatchTower. Si como lo estás leyendo.

WatchTower es una auténtica maravilla, en tanto en cuanto te permite tener los servicios a la última. Pero en esta automatización, hay ocasiones en las que esto deja de funcionar.

Cierto es que para determinados servicios críticos puedo evitarlo, utilizando las pertinentes etiquetas, pero, que quieres que te diga… Mola tanto, tenerlo todo a la última que en muchas ocasiones me pierde.

El problema principal, o al menos, ese es para mi el problema principal, es no saber que tengo un servicio caído. Si se que un servicio está caído, pues ni tan mal. Simplemente cuando tenga acceso al servidor, no tengo mas que levantarlo y punto, pero hasta el momento no lo sabía, o no tenía forma de saberlo.

Poniendo soluciones

Mattermost

Vuelvo a la carga con Mattermost, y es que este se está convirtiendo en pieza fundamental de todas las notificaciones, y esta no podía ser menos. Sigo con la idea y la mantengo de utilizar Mattermost como centro de notificaciones manteniendome al margen de servicios externos.

Como te comenté en los podcast anteriores y por si acaso alguno de ellos te lo has saltado, indicarte que se trata de un servicio similar a Slack y que está organizado por canales.

De esta forma tengo para cada una de las notificaciones su propio canal y así puedo estar al tanto de lo que sucede.

Así ahora he integrado dos nuevas notificaciones. Una primera, como es Uptime Kuma, que hasta el momento solo lo tenía para monitorizar, pero no había habilitado las notificaciones.

Uptime Kuma

Uptime Kuma, es un servicio del que te hablé hace algunas semanas, y del que tengo publicado un vídeo en YouTube que te muestro a continuación.

Este servicio te permite monitorizar diferentes páginas web, pero no solo esto, sino que también te permite monitorizar DNS, contenedores y mas.

Hasta el momento solo estaba recogiendo las métricas para saber como estaban las distintas páginas que gestiono, pero, estaba desaprovechando la parte de notificaciones que también sirve Uptime Kuma.

Así que he configurado Uptime Kuma, para que en caso de que alguna de las páginas que tengo, entre ellas, las que están alojadas en este VPS, caiga me notifique de nuevo a través de Mattermost.

DEN

Y por fin la estrella de la fiesta DEN, y de ahí el título del episodio del podcast. Y es que con la solución anterior, no tenía suficiente, porque hay algunos de los servicios que ni siquiera tienen acceso desde fuera de la red, con lo que había que darle una solución.

La cuestión es que me puse a la caza y captura de un servicio que me permitiera conocer cada uno de los eventos que se producen en mis contenedores Docker. Cuando un contenedor se cae o se levanta, cuando se destruye, cuando pasa a unhealty, etc.

Sea como fuere, o porque no le puse empeño o porque encontré como estar enterado de estas cosas a través de la API, me lié bastante.

Hace ya algún tiempo que soy conocedor del API de Docker, pero hasta la fecha no le había prestado la mas mínima atención. Y eso que soy un ferviente enamorado de las APIs, cualquier cosa que se pueda hacer por API, ahí que me tienes.

La cuestión es que encontré en una web, alguien que en literalmente dos patadas, había desarrollado una sencilla solución. Y esto me gustó y mucho. Se trataba de una solución en Python, así que decidí hacer mi propia versión en Rust, como no podía ser de otra forma.

DEN Docker Event Notification, no es ni mas ni menos que un servicio Docker que te notifica cuando se produce un evento. Para ello, y mediante un archivo en formato YAML, se configura no solo porque eventos quieres que notifique, sino también, a través de que servicios de notificación.

He definido, al igual que el desarrollador original, los objetos Docker, contenedores, imágenes, volúmenes, etc, y a partir de ahí, puedes definir que eventos quieres que te notifique y el mensaje que te mostrará.

Para los mensajes, empecé con mi propia solución un tanto simplona, pero finalmente, me decanté por Jinja2 que está muy establecido y que te permite hacer cosas mas interesantes. Por ejemplo, te permite dar formato a las fechas, lo cual es muy interesante.

Jinja2, lo utilizo para reemplazar los valores que se obtienen del evento, como puede ser el nombre del contenedor, la imagen a la que pertenece, etc.

Así, ahora tengo un festival de notificaciones, sobre todo ocasionada por las pruebas.

Actualmente solo tengo definidos dos publicadores, Telegram y Mattermost, pero si quieres cualquier otro, no tienes mas que abrir un issue en GitHub y me pongo manos a la obra.

Un terrible error

Cuando empecé con esto, cada vez que llegaba un evento lo publicaba. La cuestión es que mientras era un solo evento no había problema, pero cuando llegaban varios se perdían… Era el tiempo que tardaba en enviar el mensaje a Mattermost… Error de primero de hilos. He tenido que sacar la publicación de los eventos a un segundo hilo para que no se pierda ninguno… Ahora problema resuelto.

Formatos

Respecto a los formatos, esto es algo muy peculiar y particular, y depende del servicio de notificación que utilices. Yo lo estoy haciendo todo con markdown, que al final es mi lenguaje de marcado ligero de referencia. En tu caso, dependiendo del servicio de notificación tendrás que utilizar este u otro.

Por otro lado, tengo que decirte, que a pesar de las reticencias que siempre me ofrece YAML, en este caso he estado realmente a gusto, creo, que se está conviertiendo en mi preferido frente a TOML o incluso JSON… Como JSON levante la cabeza

HEALTHCHECK

Esta característica todavía no la había utilizado, y he aprovechado para hacer algunas pruebas con ella. Esto te permite definir cuando tu servicio está saludable o no lo está.

Así he creado un contenedor en este caso en Python, para hacer las pruebas tanto de healthy como de unhealthy, y en el caso es que ha estado muy interesante, así, que he aprovechado para implementarlo en algún servicio adicional, como es el que utilizo para las publicaciones.

A probar…

Por supuesto que te invito a que pruebes DEN. Actualmente está disponible únicamente para 64 bits, pero si lo quieres para ARM de 32 o 64 bits, me lo dices igualmente, y me pongo con ello, para que también lo puedas disfrutar.

No te quepa ninguna duda que estoy atento a cualquier idea, comentario o sugerencia para mejorar este servicio.


Más información,

9 comentarios en “Que le DEN a Docker

  1. Anónimo hace 4 semanas

    Lástima, por un momento pensé que te ibas a pasar a systemd-nspawn 😉

  2. Nacho hace 4 semanas

    Nunca entenderé tanta obsesión con docker, con lo sano que es tenerlo todo en contenedores LXC separados. Scrips como éste https://tteck.github.io/Proxmox/ facilitan mucho la puesta en marcha y mantenimiento.

  3. Ricardo hace 4 semanas

    Esos LXC están genial y yo uso alguno, pero quizá la ventaja de docker es que hay muchas mas gente en la comunidad y tienes de todo. Además yo veo como ventaja que en docker hay imágenes para amd64 y x86, pero también para arm.
    Sé que hay LXC para Arm, pero yo al menos he encontrado menos.
    Asi que con docker en una raspberry pi te puedes montar muchos servicios.
    Yo en una raspberry pi 4B DE 8GB me he montado Pimox7 y tengo varios LXC, pero la verdad es que son Ubuntu-jammy y les metido docker y luego ya a cada uno de ellos distintas imágenes docker.

    1. milor hace 4 semanas

      No conocía eso de Pimox7 le daré un ojo!

  4. Juan hace 4 semanas

    Solo para entender, ¿por qué no usaste Uptime Kuma para monitorear los containers?

  5. milor hace 4 semanas

    Buena información! Duda sobre el texto, los transcribes automaticamente y luego lo arreglas, o todo a manita? O luego haces el podcast? (Debo reconocer que no escuche el podcast todavía voy un poco más atrás).

    1. atareao hace 4 semanas

      Lo escribo y lo utilizo como guión para el podcast. Por eso en ocasiones me dejo o añado información

  6. Juan Perez hace 2 semanas

    Otra cosa que te puede servir para lograr que se reinicien los contenedores es usar Docker Swarm, nosotros lo estamos usando en producción con 3 nodos, es simple (casi lo mismo que Compose) y funciona muy bien. También lo utilicé localmente con un solo nodo en lugar de Compose.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *