- Agile 2
- Alta disponibilidad 1
- Alternativas cloud 1
- Aop 1
- Arquitectura 3
- Arquitectura distribuida 2
- Automatizacion 3
- Azure devops 1
- Base de datos 1
- Buenas practicas 19
- Cloud 1
- Colas 7
- Competing consumers 1
- Convenciones 11
- Copilot 1
- Diseno 6
- Docker 2
- Docker compose 1
- Documentacion 1
- Eda 11
- Equipos 1
- Escalabilidad 1
- Flujo de negocio 1
- Flujo de trabajo 3
- Flyway 1
- Git 4
- Gradle 3
- Herramientas digitales 1
- Ia 1
- Iam 1
- Infraestructura 2
- Java 14
- Jerarquia tecnica 1
- Jpa 1
- Jsonb 1
- Kafka 7
- Kubernetes 1
- Liderazgo en software 1
- Lineamientos 1
- Log 1
- Logging 3
- Microservicios 3
- Mongodb 1
- Monitoreo 1
- Nosql 3
- Observabilidad 4
- Open source 1
- Plugins 3
- Postgresql 1
- Privacidad 1
- Programacion funcional 1
- Programacion reactiva 4
- Rabbitmq 6
- Rotacion de talento 1
- Saga 2
- Scrum 2
- Security 1
- Seguridad 1
- Self hosting 1
- Sistemas legados 1
- Spring boot 3
- Spring mvc 2
- Sql 3
- Streams 1
- Threadlocal 1
- Trazabilidad 2
- Versionado 2
- Web 1
- Webflux 2
- Websockets 1
- Zero trust 1
Docker
2 artículos
Docker: La Revolución que Empaquetó tu Código
- Mauricio ECR
- DevOps
- 29 Apr, 2025
En el dinámico mundo del desarrollo y la infraestructura de tecnologías de la información, la necesidad de empaquetar, distribuir y ejecutar aplicaciones de forma consistente ha llevado a la populariz
Docker: La Revolución que Empaquetó tu Código
- Mauricio ECR
- DevOps
- 29 Apr, 2025
En el dinámico mundo del desarrollo y la infraestructura de tecnologías de la información, la necesidad de empaquetar, distribuir y ejecutar aplicaciones de forma consistente ha llevado a la popularización de tecnologías como Docker. Docker no inventó el concepto de contenedores, ya existían tecnologías como LXC (Linux Containers), pero sí los popularizó al proporcionar una forma sencilla y eficiente de trabajar con ellos. Lanzado en 2013, Docker se ha convertido rápidamente en una herramienta fundamental para desarrolladores, administradores de sistemas y profesionales de DevOps.
La promesa de Docker es resolver el clásico problema de "funciona en mi máquina, pero no en producción". Al encapsular una aplicación y todas sus dependencias en una unidad aislada llamada contenedor, garantiza que la aplicación se ejecute de la misma manera en cualquier entorno, ya sea desarrollo, pruebas o producción.
Conceptos Fundamentales de Docker
Para entender cómo funciona Docker, es crucial familiarizarse con algunos conceptos básicos:
Contenedor: Un contenedor es, fundamentalmente, un proceso que se ejecuta en un entorno aislado. Es una instancia en ejecución de una imagen. Un contenedor incluye la aplicación y sus dependencias, tanto de librerías del lenguaje de programación como de librerías de sistema operativo necesarias para la aplicación. Es importante diferenciarlo de una máquina virtual; no es un sistema operativo completo. Los contenedores se ejecutan con un propósito o comando principal y finalizan cuando este comando termina, aunque pueden ejecutar una tarea y finalizar, o un servicio que se mantenga en ejecución. Se pueden ejecutar, parar, reiniciar y eliminar. La eliminación de un contenedor no afecta la imagen de la que proviene.
Imagen: Una imagen es un archivo binario o una plantilla que contiene todos los elementos necesarios para ejecutar un contenedor. Esto incluye la aplicación, librerías de lenguaje, librerías de sistema operativo necesarias y la configuración de arranque. Las imágenes son inmutables una vez creadas; cualquier cambio requiere la creación de una nueva imagen. Están compuestas por capas, donde cada capa representa un cambio en el sistema de archivos. Esto permite reutilizar funcionalidades y optimizar el almacenamiento y la construcción, ya que Docker solo descarga las capas que no tiene en local.
Dockerfile: Un Dockerfile es un archivo de texto que contiene las instrucciones secuenciales necesarias para construir una imagen. Permite definir pasos como instalar dependencias (
RUN), copiar archivos (COPY), establecer el directorio de trabajo (WORKDIR), y definir el comando por defecto (CMD) o el comando principal (ENTRYPOINT) que se ejecutará al iniciar un contenedor. Cada instrucción crea una capa en la imagen.# Usamos una imagen base ligera de Python (basada en Alpine Linux) FROM python:3.9-alpine # Establecemos el directorio de trabajo dentro del contenedor WORKDIR /app # Copiamos el archivo app.py del host al directorio /app en el contenedor COPY app.py /app/ # Definimos el comando que se ejecutará cuando se inicie el contenedor # En este caso, ejecutar el script python CMD ["python", "app.py"]Docker Hub: Es un repositorio de imágenes de contenedor. Funciona de manera similar a GitHub, pero para imágenes. Permite buscar (
docker search), descargar (docker pull) y subir (docker push) imágenes creadas por la comunidad o propias. Existen otros repositorios que soportan el estándar de Docker, como GitHub Container Registry, GitLab Container Registry, etc., gracias al estándar OCI (Open Container Initiative).
Contenedores vs. Máquinas Virtuales
Una distinción clave para comprender Docker es su diferencia con las máquinas virtuales (VMs). Las VMs emulan hardware completo y ejecutan un sistema operativo completo y una capa de virtualización separada, lo que las hace independientes pero consume más recursos y es menos eficiente. Los contenedores, en cambio, comparten el mismo kernel del sistema operativo subyacente. Se ejecutan en un entorno aislado pero comparten los recursos del sistema. Esto los hace más ligeros, rápidos y eficientes en el uso de recursos que las VMs.
Instalación y Entornos
Docker ofrece dos componentes principales para su instalación:
- Docker Engine: El motor que permite crear y ejecutar contenedores. Es gratuito, sin restricciones y se instala principalmente en sistemas Linux. Se utiliza a través de la línea de comandos (CLI) y es ideal para servidores de desarrollo o producción por su rendimiento nativo.
- Docker Desktop: Una aplicación de escritorio para Windows y Mac (y opcionalmente Linux) que incluye Docker Engine más herramientas adicionales como interfaz gráfica, soporte para Kubernetes, plugins, etc. En Windows y Mac, utiliza una máquina virtual para ejecutar los contenedores. Es gratuito para uso personal y pequeñas empresas.
La instalación en Linux a menudo se simplifica con un script oficial.
#instale algunos paquetes de requisitos previos que permitan a apt usar paquetes a través de HTTPS
$ sudo apt install curl apt-transport-https ca-certificates software-properties-common
#descargue la clave GPG de Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#agregue el repositorio Docker APT a su sistema. El comando crea un docker.listarchivo de repositorio en el /etc/apt/sources.list.ddirectorio.
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce -y
$ sudo docker --version
o
sudo docker run hello-world
Construcción de Imágenes con Dockerfile
La construcción de imágenes se realiza utilizando el comando
docker build
nota: El Dockerfile debe estar en el directorio desde donde se ejecuta el comando.
tambien se puede definir un Dockerfile y un contexto (el directorio de referencia). La sintaxis básica es
docker build -t <nombre_imagen> <directorio_contexto>
donde -t asigna un nombre y etiqueta.
Las instrucciones del Dockerfile se ejecutan secuencialmente, de arriba a abajo, y Docker intenta reutilizar capas para optimizar el proceso. Instrucciones clave incluyen:
FROM: Especifica la imagen base.RUN: Ejecuta comandos para instalar software, configurar, etc.COPY: Copia archivos/directorios del contexto de construcción a la imagen.WORKDIR: Define el directorio de trabajo por defecto.CMD: Define el comando por defecto al iniciar el contenedor. Puede ser sobreescrito al ejecutardocker run.ENTRYPOINT: Define el comando principal al iniciar el contenedor. Los comandos pasados adocker runse adjuntan como argumentos aENTRYPOINT.
La diferencia entre CMD y ENTRYPOINT radica en cómo manejan los argumentos pasados al docker run. CMD se sobreescribe, mientras que ENTRYPOINT usa esos argumentos como parámetros.
Para hacer las imágenes más flexibles, se pueden usar:
- Argumentos de Construcción (
ARG): Definidos conARGen el Dockerfile y pasados con--build-argdurante eldocker build. Permiten variabilizar el proceso de construcción. - Variables de Entorno: Se pasan al contenedor en tiempo de ejecución con
-eo--envendocker run. Permiten configurar la aplicación sin modificar la imagen, adaptándola a diferentes entornos.
Ejecución y Gestión de Contenedores
Los contenedores se arrancan con el comando
docker run <imagen>
Este comando crea y arranca un nuevo contenedor.
Comandos y opciones comunes para la gestión de contenedores:
docker ps: Lista los contenedores en ejecución. Añadir-amuestra todos (en ejecución y detenidos).- Opciones de
docker run:-d: Ejecuta el contenedor en segundo plano ("detached").-p <host_port>:<container_port>: Mapea puertos para permitir la comunicación.-v <host_path_o_volume>:<container_path>: Monta volúmenes o directorios/archivos para persistencia o compartir datos.--name <nombre>: Asigna un nombre al contenedor.--rm: Elimina el contenedor al pararlo.-e <variable>=<valor>: Pasa variables de entorno.--restart <policy>: Define una política de reinicio si el contenedor falla o se detiene (ej:always,unless-stopped,on-failure).
docker logs <id_o_nombre>: Muestra la salida del proceso principal.-fsigue la salida en tiempo real.docker attach <id_o_nombre>: Se acopla al proceso principal del contenedor. Control + p + q para desacoplar sin parar.docker exec <id_o_nombre> <comando>: Ejecuta un comando dentro de un contenedor en ejecución.-itpara un terminal interactivo.docker stop <id_o_nombre>: Detiene un contenedor.docker start <id_o_nombre>: Inicia un contenedor existente pero detenido.docker restart <id_o_nombre>: Detiene y vuelve a iniciar un contenedor.docker rm <id_o_nombre>: Elimina un contenedor detenido.-ffuerza la eliminación.docker container prune: Elimina todos los contenedores detenidos.
Persistencia de Datos con Volúmenes
Los contenedores están diseñados para ser efímeros. Para que los datos persistan, se utilizan volúmenes. Los volúmenes son directorios o archivos que se encuentran fuera del sistema de archivos del contenedor y se montan dentro de él.
La gestión de volúmenes incluye:
- Crear:
docker volume create <nombre> - Listar:
docker volume ls - Inspeccionar:
docker volume inspect <nombre> - Montar: Usando
-vo--mountendocker run. - Eliminar:
docker volume rm <nombre>
También es posible copiar archivos entre el host y el contenedor con
docker cp
Redes en Docker
Docker permite gestionar la comunicación entre contenedores y con el exterior mediante redes. Se controlan con el comando
docker network
Tipos de redes comunes incluyen:
bridge: La red por defecto para comunicación en el mismo host.host: Los contenedores comparten la red del host (menos aislamiento).overlay: Para comunicación entre contenedores en diferentes hosts (cargas distribuidas).none: Sin red.
Comandos de red:
- Crear:
docker network create [--driver <tipo>] <nombre> - Listar:
docker network ls - Inspeccionar:
docker network inspect <nombre> - Conectar/Desconectar:
ydocker network connect <red> <contenedor>docker network disconnect <red> <contenedor> - Eliminar:
docker network rm <nombre>
Gestión de Imágenes Avanzada y Repositorios
Además de construir imágenes con Dockerfile, se puede crear una imagen a partir del estado actual de un contenedor en ejecución usando
docker commit <id_contenedor> <nombre_imagen>
aunque esto no es la práctica más común. La buena práctica favorece las imágenes estáticas definidas por Dockerfiles.
Otras operaciones con imágenes:
- Exportar/Importar:
ydocker save -o <fichero>.tar <imagen>docker load -i <fichero>.tar - Etiquetar:
para renombrar o añadir etiquetas. Las etiquetas identifican el origen y la versión.docker tag <imagen_actual>:<etiqueta> <nuevo_nombre>:<nueva_etiqueta> - Buscar:
en Docker Hub.docker search <término> - Descargar:
docker pull <nombre_imagen> - Subir:
Requiere etiquetar la imagen correctamente (ej: usuario/nombre_imagen). Se puede especificar un repositorio remoto.docker push <nombre_imagen> - Eliminar:
docker rmi <id_o_nombre> - Limpiar:
elimina imágenes no asociadas a contenedores.docker image prune
Conclusión
Docker, a través de sus conceptos fundamentales de imágenes, contenedores, Dockerfiles y repositorios, ha estandarizado y simplificado enormemente el ciclo de vida de las aplicaciones. Su capacidad para empaquetar aplicaciones y sus dependencias en unidades portátiles y aisladas, y la eficiencia que ofrece al compartir el kernel del sistema operativo, lo convierten en una herramienta indispensable en la infraestructura de TI moderna. Ya sea para desarrollo, pruebas, microservicios, CI/CD o despliegues en la nube, los contenedores proporcionan una forma consistente y escalable de gestionar aplicaciones, permitiendo a los equipos trabajar de manera más eficiente y agnóstica del entorno. Entender y dominar estos conceptos básicos es el primer paso para aprovechar todo el potencial que Docker ofrece en la actualidad.
Observabilidad de Servidores y Contenedores Docker: Una Mirada Práctica con Prometheus, Grafana y cAdvisor
- Mauricio ECR
- DevOps
- 22 Apr, 2025
En el mundo de la infraestructura moderna, especialmente con la creciente adopción de contenedores y arquitecturas distribuidas, entender qué está sucediendo dentro de nuestros sistemas en tiempo real
Observabilidad de Servidores y Contenedores Docker: Una Mirada Práctica con Prometheus, Grafana y cAdvisor
- Mauricio ECR
- DevOps
- 22 Apr, 2025
En el mundo de la infraestructura moderna, especialmente con la creciente adopción de contenedores y arquitecturas distribuidas, entender qué está sucediendo dentro de nuestros sistemas en tiempo real se ha vuelto fundamental. Ya no basta con saber si un servidor está "encendido"; necesitamos comprender su comportamiento interno, cómo interactúan sus componentes y predecir posibles problemas antes de que afecten a los usuarios. Aquí es donde entra el concepto de
Observabilidad.
¿Qué es la Observabilidad?
La observabilidad es la capacidad de inferir el estado interno de un sistema midiendo sus salidas externas. En términos prácticos, se trata de recopilar y analizar datos de nuestro sistema para poder hacer preguntas arbitrarias sobre su comportamiento sin necesidad de conocer previamente todas las posibles fallas o estados. A diferencia del monitoreo tradicional, que a menudo se centra en métricas conocidas y umbrales predefinidos para alertar sobre problemas conocidos, la observabilidad nos permite explorar el sistema para diagnosticar problemas desconocidos o inesperados.
Los Tres Pilares de la Observabilidad
La observabilidad se construye típicamente sobre tres tipos principales de datos o "pilares":
- Monitoreo (Metrics): Consiste en la recopilación de datos numéricos agregados a lo largo del tiempo (series temporales). Estas son las métricas de rendimiento como uso de CPU, memoria, latencia de red, errores por segundo, etc. El monitoreo nos da una vista de alto nivel del rendimiento y salud del sistema y sus componentes. Es excelente para detectar tendencias, identificar cuellos de botella y disparar alertas basadas en umbrales.
- Logging (Logs): Son registros de eventos discretos que ocurren dentro de una aplicación o sistema. Los logs proporcionan información detallada sobre lo que sucedió en un momento específico. Son cruciales para la depuración, el análisis de causa raíz de problemas y la auditoría.
- Trazabilidad (Tracing): Permite seguir el camino de una solicitud a medida que atraviesa los diferentes servicios en un sistema distribuido. El tracing es vital para comprender las interacciones entre microservicios, identificar la latencia en flujos de trabajo complejos y depurar problemas de rendimiento en arquitecturas distribuidas.
Aunque los tres pilares son esenciales para una observabilidad completa, el monitoreo a menudo constituye la base inicial, proporcionando la visibilidad en tiempo real necesaria para identificar rápidamente cuándo y dónde podría estar ocurriendo un problema.
Enfocándonos en el Monitoreo
El monitoreo nos proporciona la capacidad de responder preguntas como:
- ¿Cuánta CPU está usando mi servidor?
- ¿Cuánta memoria libre tiene un contenedor Docker específico?
- ¿Cuántas solicitudes por segundo está manejando mi aplicación?
- ¿Cuál es la latencia promedio de las respuestas de mi API?
- ¿Está aumentando el número de errores HTTP en mi servicio web?
Tener acceso a estas métricas en tiempo real y a lo largo del tiempo nos permite no solo reaccionar a los problemas, sino también anticiparlos, optimizar recursos y planificar la capacidad.
Herramientas Clave para el Monitoreo
Existen numerosas herramientas para implementar soluciones de monitoreo. Para monitorear servidores y, crucialmente, los recursos y el rendimiento a nivel de contenedor en Docker, una pila muy popular y efectiva es la compuesta por Prometheus y Grafana, complementada con Exporters como Node Exporter y cAdvisor. En algunos setups, herramientas como Redis pueden usarse como soporte (aunque no es estrictamente parte del pipeline de métricas principal en este contexto).
Prometheus: Es un sistema de monitoreo y alerta basado en series temporales. Prometheus recolecta métricas de diversos orígenes (endpoints HTTP que exponen métricas en un formato específico) mediante un modelo "pull" (Prometheus va y "raspa" los datos de los targets configurados). Es la base de nuestra recopilación y almacenamiento de métricas.
Grafana: Es una plataforma de código abierto para la visualización y el análisis de métricas. Grafana se conecta a diversas fuentes de datos, incluyendo Prometheus, y permite crear dashboards personalizables con gráficos, tablas y otros paneles para visualizar las métricas recopiladas de forma intuitiva. Es la interfaz principal para que los humanos interactúen con los datos de monitoreo. 📝 Nota: Una vez que Grafana esté funcionando, puedes importar dashboards prediseñados desde Grafana Labs. Por ejemplo, si estás monitoreando un servidor como una Raspberry Pi, puedes utilizar el dashboard con el ID 15120, que está optimizado para mostrar métricas clave de un sistema Linux. Solo necesitas ir a “+ / Import” dentro de Grafana, ingresar el número del panel (15120) y seleccionar Prometheus como fuente de datos. Esto te permitirá visualizar de inmediato un conjunto de gráficos útiles sin tener que construirlos desde cero.
Node Exporter: Es un "exporter" oficial de Prometheus que se instala en servidores Linux para exponer métricas a nivel del sistema operativo (CPU, memoria, disco, red, etc.). Esencial para entender el estado de la máquina host donde se ejecutan los contenedores.
cAdvisor (Container Advisor): Es otra herramienta de código abierto (originalmente de Google) que monitorea el uso de recursos y el rendimiento de los contenedores en ejecución. cAdvisor recopila métricas como uso de CPU, memoria, E/S de red y sistema de archivos para cada contenedor. Es indispensable para tener visibilidad del consumo de recursos por contenedor.
Redis: Aunque no es una herramienta de monitoreo per se, a veces se incluye en setups (como parece insinuar tu depends_on en cAdvisor, aunque no es el uso más común hoy en día) potencialmente como una caché o base de datos auxiliar para ciertas herramientas de monitoreo o sus componentes. En el contexto de este setup, su papel específico no es central para la recopilación de métricas por parte de Prometheus, sino quizás una dependencia para la versión o configuración específica de cAdvisor que se está utilizando.
Implementando la Pila de Monitoreo con Docker Compose
Docker Compose nos permite definir y ejecutar aplicaciones multi-contenedor con un solo comando. El archivo docker-compose.yml que proporcionaste orquesta la implementación de Prometheus, Grafana, Node Exporter, cAdvisor y Redis.
Aquí está el contenido del archivo docker-compose.yml:
services:
grafana:
image: grafana/grafana:latest
container_name: grafana_monitoring
restart: unless-stopped manualmente.
volumes:
- /home/dev/docker/monitoring/grafana/data:/var/lib/grafana
ports:
- '3000:3000'
networks:
- monitoring_net
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- /home/dev/docker/monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- /home/dev/docker/monitoring/prometheus/data:/prometheus
ports:
- '9090:9090'
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--web.enable-lifecycle'
networks:
- monitoring_net
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
expose:
- 9100
networks:
- monitoring_net
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
restart: unless-stopped
ports:
- '8080:8080'
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
depends_on:
- redis
networks:
- monitoring_net
redis:
image: redis:latest
container_name: redis
expose:
- 6379
networks:
- monitoring_net
networks:
monitoring_net:
external: true
Explicación del Archivo Docker Compose:
El archivo define varios services, cada uno representando un contenedor:
- grafana: Configura el contenedor de Grafana, mapeando su puerto web (3000) al host y persistiendo sus datos en un volumen del host. Se une a la red monitoring_net.
- prometheus: Configura el contenedor de Prometheus, montando su archivo de configuración (prometheus.yml) y volumen de datos en el host. Su puerto web (9090) se mapea al host. También se une a la red monitoring_net y especifica argumentos de comando para su inicio.
- node-exporter: Configura el contenedor de Node Exporter. Crucialmente, monta directorios del sistema operativo host (/proc, /sys, /) en modo lectura (ro) para poder acceder a las métricas del sistema. Especifica los paths correctos en su comando de inicio. Expone su puerto por defecto (9100) internamente en la red monitoring_net.
- cadvisor: Configura el contenedor de cAdvisor. Mapea su puerto web (8080) al host y monta varios directorios (/, /var/run, /sys, /var/lib/docker) que necesita para acceder a la información de los contenedores y el sistema Docker. Depende del servicio redis para iniciar y se une a la red monitoring_net.
- redis: Configura el contenedor de Redis, exponiendo su puerto por defecto (6379) internamente en la red monitoring_net. Su inclusión aquí es principalmente como dependencia para cAdvisor en este setup específico.
Finalmente, la sección networks define la red monitoring_net como external: true. Esto significa que Docker Compose buscará una red existente con ese nombre en lugar de crear una nueva. Debes crear esta red manualmente antes de ejecutar el docker-compose utilizando el comando: docker network create monitoring_net
Configuración de Prometheus (prometheus.yml)
El archivo prometheus.yml le dice a Prometheus qué objetivos (targets) debe "raspar" (scrape) para obtener métricas y con qué frecuencia debe hacerlo.
Aquí está el contenido del archivo prometheus.yml:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 15s
static_configs:
- targets: ['prometheus:9090']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
Explicación del Archivo de Configuración de Prometheus:
- global: Establece el intervalo de raspado por defecto (scrape_interval) en 15 segundos.
- scrape_configs: Define una lista de trabajos (job_name). Cada trabajo especifica un conjunto de targets que Prometheus debe monitorear.
- El trabajo 'prometheus' se configura para raspar las métricas del propio servidor Prometheus en su puerto 9090. Esto es útil para monitorear la salud y el rendimiento del servidor de monitoreo.
- El trabajo 'cadvisor' se configura para raspar las métricas de cAdvisor en el puerto 8080. Gracias a la red Docker, Prometheus puede referirse al contenedor cAdvisor simplemente por su nombre de servicio (cadvisor).
- El trabajo 'node-exporter' se configura para raspar las métricas de Node Exporter en el puerto 9100, utilizando el nombre del servicio Docker (node-exporter).
Este archivo de configuración le indica a Prometheus que debe conectarse a los servicios prometheus, cadvisor y node-exporter dentro de la red monitoring_net (Docker maneja la resolución de nombres) en sus respectivos puertos para recolectar métricas cada 15 segundos.
Conclusión
Implementar una estrategia de observabilidad robusta es esencial para gestionar eficazmente infraestructuras basadas en servidores y Docker. La pila Prometheus, Grafana, Node Exporter y cAdvisor proporciona una base sólida para el monitoreo, permitiéndonos recopilar, almacenar y visualizar métricas cruciales sobre el rendimiento del sistema host y el consumo de recursos a nivel de contenedor. Al configurar estas herramientas mediante Docker Compose y definir correctamente los trabajos de raspado en Prometheus, podemos obtener la visibilidad necesaria para mantener nuestros sistemas saludables, identificar problemas rápidamente y optimizar nuestra infraestructura de manera proactiva.
Este setup es un excelente punto de partida. Para una observabilidad completa, se deberían integrar soluciones de logging (como ELK stack o Loki) y tracing (como Jaeger o Zipkin) para complementar la información proporcionada por el monitoreo.