Lo que no puede faltar es un Dasboard para ver el estado de nuestra plataforma asi que vamos a monitorizar nuestros Host Docker y containers, para ello vamos a utilizar:
Prometheus, se va a encarga de recoger todas las métricas en una DB para poder visualizarlas. Prometheus – Monitoring system & time series database
Node Exporter, recogerá las métricas de hardware y sistema operativo. Monitoring Linux host metrics with the Node Exporter | Prometheus
CAdvisor, recoge las métricas de los containers. Monitoring Docker container metrics using cAdvisor | Prometheus
Grafana, Se encargará de pintar todos nuestros datos en un dashboard. Grafana | Prometheus
Requisitos
Vamos a ver cómo crear nuestro fichero de configuración, con todos los componentes.
Necesitaremos nuestro entorno de Docker, ya sea un host o un Swarm, con Docker engine y compose instalado.
Crearemos una carpeta para guardar nuestra configuración.
Prometheus
Primero generamos nuestro fichero Docker-compose.yml, muy básico solo necesitaremos configurar los volúmenes y comandos, y generar el fichero de configuración de prometheus que guardamos en la carpeta que hemos creado. Installation | Prometheus
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus:/var/lib/prometheus
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
restart: unless-stopped
ports:
- '9090:9090'
Podremos agregar más comandos para nuestro prometheus Storage | Prometheus
También generar una red personalizada para la monitorización, con algo como lo siguiente.
networks:
- Monitoring
networks:
Monitoring:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.0.0.0/24
gateway: 10.0.0.1
Ahora el fichero prometheus.yml con la configuración.
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090'] ## Nombre o IP del servidor prometheus
Arrancamos nuestro Container.
docker-compose -f fichero.yml up -d
Accedemos a la consola http://IP-Host:9090

cAdvisor
Una vez que tenemos nuestro servidor de prometheus corriendo vamos a por cAdvisor para recoger las métricas de Docker.
Lo primero será habilitar el acceso de recogida de datos en Docker, editaremos el fichero /etc/docker/daemon.json
sudo vi etc/docker/daemon.json
Configuraremos los siguiente, en vez de 0.0.0.0 podremos poner la IP del Host o Swarm.
{
"metrics-addr" : "0.0.0.0:9323",
"experimental" : true
}
Reiniciamos el servicio de docker
systemctl restart docker.service
Ahora agregamos la configuración del Container cAdvisor, lo volúmenes que necesitaran son del Host.
version: '3'
services:
prometheus:
....
cadvisor:
image: google/cadvisor:latest
ports:
- '8080:8080'
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- Monitoring
networks:
Monitoring:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.0.0.0/24
gateway: 10.0.0.1
Editamos el fichero prometheus.yml y agregamos al final.
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080'] ## Nombre de maquina configurado en el yml
Actualizado el servicio y reiniciamos el container de prometheus.
docker-compose -f fichero.yml up -d
docker restart prometheus
Accedemos al portal http://IP-Host:8080

Verificamos el portal de prometheus, http://IP-Host:9090

Node Exporter
Ahora toca recoger métricas del servidor con node exporter, mismos procedimiento, editamos el fichero de docker-compose.yml
version: '3.8'
services:
prometheus:
...
cadvisor:
...
node-exporter:
image: prom/node-exporter
ports:
- '9100:9100'
depends_on:
- prometheus
networks:
- Monitoring
networks:
...
Editamos el fichero prometheus.yml y agregamos:
- job_name: 'node-exporter'
static_configs:
- targets: ["node-exporter:9100"]
Actualizar el servicio y reiniciamos el container de prometheus.
docker-compose -f fichero.yml up -d
docker restart prometheus
Comprobamos que accedemos http://IP-Host:9100/metrics

Verificamos el portal de prometheus, http://IP-Host:9090

Grafana
Ahora necesitamos ver todos nuestros datos en un Dashboard, crearemos dos carpetas desde estamos generando el proyecto.
Run Grafana Docker image | Grafana Labs
mkdir grafana_data
mkdir -p grafana_provisioning/datasource
Editamos docker-compose.yml
grafana:
image: grafana/grafana-oss:latest
user: "1000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=password
volumes:
- ./grafana_data:/var/lib/grafana
- ./grafana_provisioning:/etc/grafana/provisioning
depends_on:
- prometheus
ports:
- '3000:3000'
networks:
- Monitoring
Si necesitamos mas configuración para nuestro grafana Configure Grafana Docker image | Grafana Labs
Instalar plugins por defecto:
- GF_INSTALL_PLUGINS=http://plugin-domain.com/my-custom-plugin.zip;custom-plugin,grafana-clock-panel
Al crear el volumen de datos, tendremos que asignarle los permisos 472:472 para que no de error de permisos.
sudo chown -R 472:472 grafana_*
Agregar datasource por defecto
Ahora crearemos el fichero para configurar el Datasource de grafana, en /grafana_provisioning/datasource/automatic.yml y agregamos lo siguiente:
apiVersion: 1
datasources:
- name: Prometheus_db
type: prometheus
access: proxy
url: http://prometheus:9090
password:
user:
database:
basicAuth: false
basicAuthUser:
basicAuthPassword:
withCredentials:
isDefault:
jsonData:
tlsAuth: false
tlsAuthWithCACert: false
secureJsonData:
tlsCACert: ""
tlsClientCert: ""
tlsClientKey: ""
version: 1
editable: false
Agregar Dashboard por defecto
Si queremos también dejar nuestros Dashboard prefijados, necesitaremos los siguientes ficheros.
Creamos un fichero en /grafana_provisioning/dashboards/dashboard.yml y agregamos lo siguiente:
apiVersion: 1
providers:
- name: 'Prometheus'
orgId: 1
folder: ''
type: file
disableDeletion: false
editable: true
options:
path: /etc/grafana/provisioning/dashboards
Ahora necesitaremos el fichero JSON del Dashboard, cogemos el fichero y lo copiamos en /grafana_provisioning/dashboards/
Abrimos la pagina y descargamos el fichero y lo copiamos en la ruta /grafana_provisioning/dashboards/ tantos como deseemos.
Reiniciamos el container de grafana.
Podemos descargar el json directamente desde grafana.com pero al llevar parametros para la configuración inicial habra que modificarlos para que sean correctos.
Os dejo algunos dashboard de Docker y Prometheus.
https://grafana.com/grafana/dashboards/893
https://grafana.com/grafana/dashboards/179
https://grafana.com/grafana/dashboards/11074
Validación
Accedemos al portal http://IP-Host:3000, usuario admin y password la que introducimos en el fichero de configuración.

Datasource creado automaticamente.

Ficheros
Os dejo los ficheros completos, docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus:/var/lib/prometheus
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
restart: unless-stopped
ports:
- '9090:9090'
networks:
- Monitoring
cadvisor:
image: google/cadvisor:latest
ports:
- '8080:8080'
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- Monitoring
node-exporter:
image: prom/node-exporter
ports:
- '9100:9100'
depends_on:
- prometheus
networks:
- Monitoring
grafana:
image: grafana/grafana-oss:latest
environment:
- GF_SECURITY_ADMIN_PASSWORD=password
volumes:
- ./grafana:/var/lib/grafana
- ./grafana_provisioning:/etc/grafana/provisioning
depends_on:
- prometheus
ports:
- '3000:3000'
networks:
- Monitoring
networks:
Monitoring:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.0.0.0/24
gateway: 10.0.0.1
Prometheus.yml
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090'] ## Nombre o IP del servidor prometheus
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080'] ## Nombre o IP de maquina configurado en el yml
- job_name: 'node-exporter'
static_configs:
- targets: ["node-exporter:9100"] ## Nombre o IP de maquina configurado en el yml