Cómo ver el historial de eventos de la instalación de Docker


Docker Engine registra un evento cada vez que el daemon realiza acciones significativas. Puede acceder al registro de eventos para identificar cuándo ocurrió una acción y realizar un seguimiento de los cambios en los objetos a lo largo del tiempo.

En este artículo, explicaremos qué se captura como eventos y cuándo es posible que desee verlos. Luego mostraremos cómo monitorear eventos en tiempo real usando la CLI de Docker y la API REST.

Los eventos de Docker describen las actividades realizadas por su demonio de Docker. La mayoría de las interacciones con objetos como contenedores, imágenes, volúmenes y redes registran un evento, creando un registro que puede usar para inspeccionar cambios pasados.

Hay muchos tipos diferentes de eventos que identifican cambios específicos en su entorno:

  • Creación y eliminación de contenedores.
  • Estados de verificación de estado del contenedor
  • Comandos ejecutados dentro de contenedores con docker exec
  • Tirando y empujando imágenes
  • Creación, destrucción, montaje y desmontaje de volúmenes
  • Habilitación y deshabilitación de complementos de daemon de Docker

Puede ver la lista completa en la documentación de Docker.

Cada evento registrado incluye una marca de tiempo y el ID del objeto afectado. Puede usar esta información para armar un historial de cambios en su entorno, ya sea que haya observado o no sus desencadenantes originales.

Los eventos almacenados también pueden ayudar a diagnosticar problemas como fallas inesperadas de contenedores. Ver el registro le permite identificar la hora precisa en que se detuvo un contenedor, lo que proporciona un punto de datos que puede correlacionar con sus otros registros. Los eventos pueden establecer cuándo comenzaron a fallar las comprobaciones de estado de un contenedor, lo que reduce el período de interés cuando necesita inspeccionar los servicios externos para determinar la causa raíz de un problema.

Transmisión de eventos de Docker con la CLI de Docker

los docker events El comando CLI transmite eventos desde su demonio Docker a la ventana de su terminal. Los eventos aparecerán en tiempo real hasta que finalice el proceso presionando la combinación de teclado Ctrl+C.

Para empezar, ejecutar el comando sin argumentos no mostrará ningún resultado. Solo se muestra la actividad nueva, por lo que la salida permanece vacía hasta que se produce un evento. Puede provocar uno iniciando un nuevo contenedor en un caparazón diferente:

$ docker run --rm hello-world

Ahora deberían aparecer varios eventos en la ventana de terminal que está ejecutando el docker events dominio:

2022-05-31T15:20:00.267970018+01:00 image pull hello-world:latest (name=hello-world)
2022-05-31T15:20:00.347054862+01:00 container create 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.347805277+01:00 container attach 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.621070053+01:00 container start 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
...

Cada evento se muestra en su propia línea. La marca de tiempo del evento se muestra primero, seguida del tipo de objeto afectado (como image o container) y luego la acción que se tomó (como create, attachy start). El resto del mensaje contiene metadatos útiles sobre el objeto. El ejemplo anterior revela que el hello-world:latest Se extrajo la imagen y se creó un contenedor a partir de ella.

Formato de salida

La lista de eventos sin procesar suele ser difícil de manejar. Puede reformatear la salida usando el --format bandera que acepta una cadena de plantilla Go:

$ docker events --format ' .Time   .Action   .Type  .ID '

Ejecutar este ejemplo producirá una salida similar a esta:

1654006800 pull image hello-world:latest
1654006800 create container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 attach container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 start container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

Puede obtener eventos representados como objetos JSON usando json . como su cadena de plantilla:

$ docker events --format ' json . ' | jq

  "status": "create",
  "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
  "from": "hello-world",
  "Type": "container",
  "Action": "create",
  "Actor": 
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Attributes": 
      "image": "hello-world",
      "name": "nifty_morse"
    
  ,
  "scope": "local",
  "time": 1654006800,
  "timeNano": 1654006800347054800

Aquí se pasa el JSON sin procesar jq por lo que está bastante impreso en su terminal. Esto hace que la información sea más fácil de escanear.

Cuando crea cadenas de formato personalizado, puede usar las propiedades en la salida JSON como referencia para los marcadores de posición admitidos. En la mayoría de los casos, deberá escribir en mayúscula la primera letra de cada propiedad, como time a .Time .

Filtrado de eventos

El registro de eventos de un demonio Docker ocupado puede volverse ruidoso rápidamente. Puede restringir los eventos a una acción, objeto o tipo de objeto específico con el --filter bandera:

  • docker events --filter type=container – Obtener todos los eventos relacionados con los contenedores.
  • docker events --filter event=create – Obtener eventos de creación de contenedores.
  • docker events --filter container=demo-container – Obtenga todos los eventos guardados para el contenedor llamado demo-container (puede hacer referencia al ID o nombre del contenedor).

Además containerpuede filtrar por todos los nombres de tipos de objetos admitidos, como image, networky volume.

Se admiten varios filtros cuando repite el --filter bandera. Los filtros distintos se interpretan como lógicos Y condiciones; múltiples usos del mismo filtro se vuelven O cláusulas. He aquí un ejemplo que emerge de la create evento tanto para el app-container y api-container contenedores:

$ docker events 
    --filter container=app-container
    --filter container=api-container
    --filter event=create

Acceso a eventos históricos

docker events por defecto solo muestra los eventos almacenados desde que se ejecutó el comando. Puede incluir eventos históricos agregando el --since bandera. Esto acepta una expresión de tiempo legible por humanos o una marca de tiempo absoluta:

$ docker events --since 1h
$ docker events --since '2021-05-01T16:00:00'

Los eventos registrados después de la hora dada se mostrarán inmediatamente en su terminal. Los nuevos eventos seguirán apareciendo en tiempo real a medida que se registren.

Puede excluir eventos después de un tiempo determinado con el --until bandera. Funciona de manera similar a --since. Usando --until deshabilitará la transmisión en tiempo real de nuevos eventos porque estarían fuera del período de tiempo solicitado.

Transmisión de eventos de Docker desde la API REST de Daemon

Otra forma de acceder a los eventos almacenados es a través de la API REST del demonio Docker. Puedes usar el /events endpoint para transmitir eventos en tiempo real después de habilitar la API en su host Docker. Los eventos se devolverán en formato JSON:

$ curl http://127.0.0.1:2375/v1.41/events

  "Type": "container",
  "Action": "create",
  "Actor": 
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Attributes": 
      "image": "hello-world",
      "name": "nifty_morse"
    
  ,
  "scope": "local",
  "time": 1654006800,
  "timeNano": 1654006800347054800

El extremo de la API admite filter, sincey until parámetros que tienen el mismo comportamiento que sus contrapartes CLI. Aquí se explica cómo recuperar todos los eventos de creación de contenedores registrados en la última hora:

$ curl http://127.0.0.1:2375/v1.41/events?since=1h&filters='type':'container','action':'create'

Envío de eventos a un servicio externo

Docker carece de una forma integrada de enviar eventos a un servicio externo. Esto podría ser útil si desea que todas sus creaciones de contenedores se registren en una plataforma de monitoreo o auditoría existente.

Puede configurar su propia solución creando un servicio del sistema que se ejecuta continuamente docker events. Debería enviar cada nueva línea de salida a su sistema externo.

Primero escriba un script Bash que implemente la funcionalidad que necesita:

#!/bin/bash
docker events --format ' .Time   .Action   .Type   .ID ' | while read event
do
    curl 
        -X POST 
        -H "Content-Type: application/json" 
        -d '"event": "$event"' 
        https://example.com/events
done

Ahora crea una nueva systemd unidad de servicio en /etc/systemd/system/docker-events.service:

[Unit]
Description=Custom Docker Event Monitoring Service

[Service]
Type=forking
ExecStart=/usr/local/bin/docker-events.sh

[Install]
WantedBy=multi-user.target

Finalmente recargar systemd para cargar su servicio, luego inicie y habilite la unidad:

$ sudo systemctl daemon-reload
$ sudo systemctl start docker-events
$ sudo systemctl enable docker-events

Su servicio ahora transmitirá cada nuevo evento a su plataforma de monitoreo. Habilitar el servicio lo configura para que se inicie automáticamente cada vez que se reinicia el host.

Resumen

Los eventos de Docker se crean cada vez que el daemon modifica objetos en su entorno. La transmisión del registro de eventos le permite monitorear la actividad del demonio en tiempo real. Esto puede ayudarlo a depurar problemas, auditar cambios y garantizar el cumplimiento.

Dado que los eventos se recuperan directamente del servidor Docker, no se debe confiar en ellos si necesita recuperar información en el futuro. Solo se conservan 1000 entradas de forma continua y no puede acceder a los eventos a través del sistema de archivos de su host Docker. El mecanismo es más adecuado para tareas ad hoc rápidas en las que busca información específica relacionada con una actividad reciente. Para la retención a largo plazo, debe usar su propio servicio del sistema para enviar eventos a un repositorio externo.





Source link-39