Come visualizzare la cronologia degli eventi dell'installazione di Docker

Docker Engine registra un evento ogni volta che vengono eseguite azioni significative dal daemon. È 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 catturato come eventi e quando potresti volerli visualizzare. Mostreremo quindi come monitorare gli eventi in tempo reale utilizzando l'interfaccia a riga di comando di Docker e l'API REST.
Gli eventi Docker descrivono le attività eseguite dal tuo demone Docker. La maggior parte delle interazioni con oggetti come contenitori, immagini, volumi e reti registra un evento, creando un registro che puoi utilizzare per ispezionare le modifiche passate.
Esistono molti tipi diversi 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 dei contenitori con
docker exec
- Estrarre e spingere le immagini
- Creazione, distruzione, montaggio e smontaggio di volumi
- Abilitazione e disabilitazione dei plug-in 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 ti consente di identificare l'ora precisa in cui un container si è fermato, fornendo un punto dati che puoi correlare con gli altri tuoi registri. Gli eventi possono stabilire quando i controlli dello stato 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 l'interfaccia a riga di comando di Docker
Il comando CLI docker events
trasmette gli eventi dal demone Docker alla finestra del 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 hello-world
Diversi eventi dovrebbero ora apparire nella finestra del terminale che sta eseguendo 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 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)
...
Ogni evento viene visualizzato su una propria riga. Il timestamp dell'evento viene visualizzato per primo, seguito dal tipo di oggetto interessato (come image
o container
) e quindi dall'azione intrapresa (come create
, attach
e start
). Il resto del messaggio contiene metadati utili sull'oggetto. L'esempio precedente rivela che l'immagine hello-world:latest
è stata estratta e da essa è stato creato un contenitore.
Output di formattazione
L'elenco degli eventi grezzo è spesso ingombrante. Puoi riformattare l'output usando il flag --format
che accetta una stringa modello Go:
$ docker events --format '{{ .Time }} {{ .Action }} {{ .Type}} {{ .ID }}'
L'esecuzione di questo esempio produrrà un output simile al seguente:
1654006800 pull image hello-world:latest
1654006800 create container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 attach container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 start container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
Puoi ottenere eventi rappresentati come oggetti JSON utilizzando {{ json . }}
come stringa modello:
$ 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
}
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 scrivere in maiuscolo la prima lettera di ciascuna proprietà, ad esempio da time
a {{ .Time }}
.
Filtrare gli eventi
Il registro eventi per un daemon Docker occupato può rapidamente diventare rumoroso. Puoi restringere gli eventi a una specifica azione, oggetto o tipo di oggetto con il flag --filter
:
docker events --filter type=container
– Ottieni tutti gli eventi relativi ai container.docker events --filter event=create
– Ottieni gli eventi di creazione del contenitore.docker events --filter container=demo-container
– Ottieni tutti gli eventi salvati per il contenitore chiamatodemo-container
(puoi fare riferimento all'ID o al nome del contenitore) .
Oltre a container
, puoi filtrare in base a tutti i nomi di tipi di oggetto 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; più utilizzi dello stesso filtro diventano clausole OR. Ecco un esempio che mostra l'evento create
per entrambi i contenitori app-container
e api-container
:
$ docker events \
--filter container=app-container
--filter container=api-container
--filter event=create
Accesso agli eventi storici
Per impostazione predefinita, docker events
mostra 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:
$ docker events --since 1h
$ docker events --since '2021-05-01T16:00:00'
Gli eventi registrati dopo l'ora indicata verranno immediatamente visualizzati nel tuo terminale. I nuovi eventi continueranno a essere visualizzati in tempo reale man mano che vengono registrati.
Puoi escludere gli eventi dopo un determinato periodo di tempo con il flag --until
. Funziona in modo simile a --since
. L'utilizzo di --until
disabiliterà lo streaming in tempo reale di nuovi eventi perché non rientrerebbero nell'intervallo di tempo richiesto.
Streaming degli eventi Docker dall'API REST del demone
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
{
"Type": "container",
"Action": "create",
"Actor": {
"ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
"Attributes": {
"image": "hello-world",
"name": "nifty_morse"
}
},
"scope": "local",
"time": 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.
Puoi configurare la tua soluzione creando un servizio di sistema che esegua continuamente eventi docker
. Dovrebbe inviare ogni nuova riga di output al tuo sistema esterno.
Per prima cosa scrivi uno script Bash che implementa la funzionalità di cui hai bisogno:
#!/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
Ora crea una nuova unità di servizio systemd
in /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
Infine ricarica systemd
per caricare il tuo servizio, quindi avvia e abilita l'unità:
$ sudo systemctl daemon-reload
$ sudo systemctl start docker-events
$ sudo systemctl enable docker-events
Il tuo servizio trasmetterà ora ogni nuovo evento alla tua piattaforma di monitoraggio. L'abilitazione del servizio lo configura per l'avvio automatico ogni volta che l'host si riavvia.
Riepilogo
Gli eventi Docker vengono creati ogni volta che il daemon modifica gli oggetti nel tuo 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 è necessario fare affidamento su di essi se è necessario recuperare informazioni in futuro. Vengono conservate solo 1.000 voci su base continuativa e non è possibile accedere agli eventi tramite il file system dell'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.
Articoli correlati:
- Linux での Docker の再起動: デーモン、コンテナー、コンポーザー、サービス
- コンテナセキュリティのベストプラクティス: Docker の保護
- Linux 上の Podman で docker-compose を使用する方法
- 開発スキルをレベルアップするための 11 の素晴らしい Docker ツール
- 無料の電子ブック: 「Docker コンテナーについて」ガイドの紹介
- 取引: DevOps Hacker Bundle - Docker や AWS などの必須ツールをマスターする
- ディール: この 9 コースで究極の DevOps マスタリー バンドルを学びましょう
- セール: この 8 コース バンドルで Linux、Docker、Git などを学習 [90% オフ]
- Docker イメージ、コンテナー、ボリュームを削除する方法
- ctop - Docker コンテナを監視するための Top のようなインターフェイス
- Docker コンテナに名前を付けるまたは名前を変更する方法
- Ubuntu で Docker をインストールし、Docker コンテナを実行する方法
- Docker コンテナをバックグラウンドで実行する (分離モード)
- Docker をインストールし、CentOS および RHEL 8/7 での基本的なコンテナ操作を学習する - パート 1
- Docker コンテナ内でアプリケーションをインストール、実行、削除する方法 - パート 2