Come visualizzare la cronologia degli eventi dell'installazione Docker
Pubblicato: 2022-08-11Docker Engine registra un evento ogni volta che il demone esegue azioni significative. È possibile accedere al registro eventi per identificare quando si è verificata un'azione e tenere traccia delle modifiche agli oggetti nel tempo.
In questo articolo, spiegheremo cosa viene acquisito come eventi e quando potresti volerli visualizzare. Mostreremo quindi come monitorare gli eventi in tempo reale utilizzando la Docker CLI e l'API REST.
Cosa sono gli eventi Docker?
Gli eventi Docker descrivono le attività svolte dal tuo demone Docker. La maggior parte delle interazioni con oggetti come contenitori, immagini, volumi e reti registra un evento, creando un registro che è possibile utilizzare per esaminare le modifiche precedenti.
Esistono diversi tipi di eventi che identificano cambiamenti specifici nel tuo ambiente:
- Creazione e rimozione di contenitori
- Stati del controllo dello stato del contenitore
- Comandi eseguiti all'interno di container con
docker exec
- Tirare e spingere le immagini
- Creazione, distruzione, montaggio e smontaggio di volumi
- Abilitazione e disabilitazione dei plugin del demone Docker
È possibile visualizzare l'elenco completo nella documentazione di Docker.
Ogni evento registrato include un timestamp e l'ID dell'oggetto interessato. Puoi utilizzare queste informazioni per assemblare una cronologia delle modifiche al tuo ambiente, indipendentemente dal fatto che tu abbia osservato o meno i loro trigger originali.
Gli eventi archiviati possono anche aiutare a diagnosticare problemi come errori imprevisti del contenitore. La visualizzazione del registro consente di identificare l'ora precisa in cui un container si è fermato, fornendo un punto dati che è possibile correlare con gli altri registri. Gli eventi possono stabilire quando i controlli di integrità di un container hanno iniziato a fallire, restringendo il periodo di interesse quando è necessario ispezionare i servizi esterni per determinare la causa principale di un problema.
Streaming di eventi Docker con Docker CLI
Il comando Docker docker events
CLI trasmette gli eventi dal tuo demone Docker alla finestra del tuo terminale. Gli eventi appariranno in tempo reale fino a quando non terminerai il processo premendo la combinazione di tasti Ctrl+C.
L'esecuzione del comando senza argomenti non mostrerà alcun output per cominciare. Viene visualizzata solo la nuova attività, quindi l'output rimane vuoto finché non si verifica un evento. Puoi provocarne uno avviando un nuovo contenitore in una shell diversa:
$ docker run --rm ciao-mondo
Ora dovrebbero apparire diversi eventi nella finestra del terminale che esegue il comando docker events
:
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 contenitore allegare 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse) 2022-05-31T15:20:00.621070053+01:00 inizio container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse) ...
Ogni evento viene visualizzato su una propria riga. Viene visualizzato prima il timestamp dell'evento, seguito dal tipo di oggetto interessato (come image
o container
) e quindi dall'azione eseguita (come create
, attach
e start
). Il resto del messaggio contiene utili metadati sull'oggetto. L'esempio sopra rivela che l'immagine hello-world:latest
è stata estratta e da essa è stato creato un contenitore.
Formattazione dell'output
L'elenco degli eventi grezzo è spesso ingombrante. Puoi riformattare l'output usando il flag --format
che accetta una stringa modello Go:
$ eventi docker --format '{{ .Time }} {{ .Action }} {{ .Type}} {{ .ID }}'
L'esecuzione di questo esempio produrrà un output simile al seguente:
1654006800 pull image hello-world:latest 1654006800 crea contenitore 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 1654006800 allegare contenitore 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 1654006800 avviare il contenitore 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
Puoi ottenere eventi rappresentati come oggetti JSON utilizzando {{ json . }}
{{ json . }}
come stringa del modello:
$ eventi docker --format '{{ json . }}' | jq { "stato": "crea", "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", "da": "ciao-mondo", "Tipo": "contenitore", "Azione": "crea", "Attore": { "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", "Attributi": { "image": "ciao-mondo", "nome": "nifty_morse" } }, "ambito": "locale", "tempo": 1654006800, "timeNano": 1654006800347054800 }
Qui il JSON grezzo viene passato attraverso jq
, quindi è abbastanza stampato nel tuo terminale. Ciò semplifica la scansione delle informazioni.
Quando crei stringhe di formato personalizzate, puoi utilizzare le proprietà nell'output JSON come riferimento per i segnaposto supportati. Nella maggior parte dei casi dovrai mettere in maiuscolo la prima lettera di ogni proprietà, ad esempio time
to {{ .Time }}
.
Filtraggio di eventi
Il registro eventi per un demone Docker occupato può diventare rapidamente rumoroso. Puoi restringere gli eventi a un'azione, un oggetto o un tipo di oggetto specifico con il flag --filter
:
-
docker events --filter type=container
– Ottieni tutti gli eventi correlati ai contenitori. -
docker events --filter event=create
– Ottieni eventi di creazione del contenitore. -
docker events --filter container=demo-container
– Ottieni tutti gli eventi salvati per il container chiamatodemo-container
(puoi fare riferimento all'ID o al nome del container).
Oltre al container
, puoi filtrare in base a tutti i nomi dei tipi di oggetti supportati come image
, network
e volume
.
Sono supportati più filtri quando si ripete il flag --filter
. I filtri distinti vengono interpretati come condizioni AND logiche; usi multipli dello stesso filtro diventano clausole OR . Ecco un esempio che mostra l'evento create
sia per il app-container
api-container
:
$ eventi della finestra mobile \ --filter container=app-contenitore --filter container=api-contenitore --filter evento=crea
Accesso agli eventi storici
Per impostazione predefinita docker events
mostrano solo gli eventi archiviati dall'esecuzione del comando. Puoi includere eventi storici aggiungendo il flag --since
. Questo accetta un'espressione temporale leggibile dall'uomo o un timestamp assoluto:
$ eventi docker --da 1 ora $ eventi docker --da '2021-05-01T16:00:00'
Gli eventi registrati dopo l'orario stabilito verranno immediatamente visualizzati nel tuo terminale. I nuovi eventi continueranno a essere visualizzati in tempo reale mentre vengono registrati.
Puoi escludere eventi dopo un determinato periodo di tempo con il flag --until
. Funziona in modo simile a --since
. L'uso --until
disabiliterà lo streaming in tempo reale di nuovi eventi perché non rientrerebbero nel periodo di tempo richiesto.
Streaming di eventi Docker dall'API REST di Daemon
Un altro modo per accedere agli eventi archiviati è tramite l'API REST del demone Docker. Puoi utilizzare l'endpoint /events
per eseguire lo streaming di eventi in tempo reale dopo aver abilitato l'API sul tuo host Docker. Gli eventi verranno restituiti in formato JSON:
$ curl http://127.0.0.1:2375/v1.41/events { "Tipo": "contenitore", "Azione": "crea", "Attore": { "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378", "Attributi": { "image": "ciao-mondo", "nome": "nifty_morse" } }, "ambito": "locale", "tempo": 1654006800, "timeNano": 1654006800347054800 }
L'endpoint API supporta i parametri filter
, since
e until
che hanno gli stessi comportamenti delle loro controparti CLI. Ecco come recuperare tutti gli eventi di creazione di container registrati nell'ultima ora:
$ curl http://127.0.0.1:2375/v1.41/events?since=1h&filters={'type':'container','action':'create'}
Invio di eventi a un servizio esterno
Docker non dispone di un modo integrato per inviare eventi a un servizio esterno. Questo potrebbe essere utile se desideri che tutte le tue creazioni di container vengano registrate in una piattaforma di monitoraggio o auditing esistente.
È possibile configurare la propria soluzione creando un servizio di sistema che esegue continuamente docker events
. Dovrebbe inviare ogni nuova riga di output al tuo sistema esterno.
Per prima cosa scrivi uno script Bash che implementi la funzionalità di cui hai bisogno:
#!/bin/bash eventi docker --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | durante la lettura dell'evento fare ricciolo \ -X POST \ -H "Tipo di contenuto: application/json" \ -d '{"evento": "$evento"}' \ https://example.com/events fatto
Ora crea una nuova unità di servizio systemd
in /etc/systemd/system/docker-events.service
:
[Unità] Description=Servizio di monitoraggio eventi Docker personalizzato [Servizio] Tipo = biforcazione ExecStart=/usr/local/bin/docker-events.sh [Installare] WantedBy=multiutente.target
Infine ricarica systemd
per caricare il tuo servizio, quindi avvia e abilita l'unità:
$ sudo systemctl daemon-reload $ sudo systemctl avvia docker-events $ sudo systemctl abilita gli eventi docker
Il tuo servizio ora trasmetterà in streaming ogni nuovo evento alla tua piattaforma di monitoraggio. L'abilitazione del servizio ne configura l'avvio automatico ogni volta che l'host si riavvia.
Riepilogo
Gli eventi Docker vengono creati ogni volta che il demone modifica gli oggetti nell'ambiente. Lo streaming del registro eventi consente di monitorare l'attività del demone in tempo reale. Questo può aiutarti a eseguire il debug dei problemi, controllare le modifiche e garantire la conformità.
Poiché gli eventi vengono recuperati direttamente dal server Docker, non dovrebbero essere considerati affidabili se sarà necessario recuperare informazioni in futuro. Vengono conservate solo 1.000 voci su base continuativa e non puoi accedere agli eventi tramite il filesystem del tuo host Docker. Il meccanismo è più adatto per attività rapide ad hoc in cui stai cercando informazioni specifiche relative a un'attività recente. Per la conservazione a lungo termine è necessario utilizzare il proprio servizio di sistema per inviare eventi a un repository esterno.