So zeigen Sie den Ereignisverlauf Ihrer Docker-Installation an

Veröffentlicht: 2022-08-11

Docker-Logo

Docker Engine zeichnet ein Ereignis auf, wenn der Daemon wichtige Aktionen ausführt. Sie können auf das Ereignisprotokoll zugreifen, um festzustellen, wann eine Aktion aufgetreten ist, und Änderungen an Objekten im Laufe der Zeit verfolgen.

In diesem Artikel erklären wir, was als Ereignisse erfasst werden und wann Sie sie möglicherweise anzeigen möchten. Anschließend zeigen wir, wie Ereignisse mithilfe der Docker-CLI und der REST-API in Echtzeit überwacht werden.

Was sind Docker-Events?

Docker-Ereignisse beschreiben die Aktivitäten Ihres Docker-Daemons. Die meisten Interaktionen mit Objekten wie Containern, Images, Volumes und Netzwerken zeichnen ein Ereignis auf und erstellen ein Protokoll, das Sie verwenden können, um frühere Änderungen zu überprüfen.

Es gibt viele verschiedene Arten von Ereignissen, die bestimmte Änderungen in Ihrer Umgebung identifizieren:

  • Container erstellen und entfernen
  • Zustandsprüfungsstatus des Containers
  • Befehle, die in Containern mit docker exec ausgeführt werden
  • Bilder ziehen und schieben
  • Volumes erstellen, zerstören, mounten und unmounten
  • Aktivieren und Deaktivieren von Docker-Daemon-Plugins

Die vollständige Liste finden Sie in der Docker-Dokumentation.

Jedes aufgezeichnete Ereignis enthält einen Zeitstempel und die ID des betroffenen Objekts. Sie können diese Informationen verwenden, um einen Verlauf der Änderungen an Ihrer Umgebung zusammenzustellen, unabhängig davon, ob Sie ihre ursprünglichen Auslöser beobachtet haben oder nicht.

Gespeicherte Ereignisse können auch bei der Diagnose von Problemen wie unerwarteten Containerausfällen helfen. Durch Anzeigen des Protokolls können Sie den genauen Zeitpunkt ermitteln, zu dem ein Container gestoppt wurde, und einen Datenpunkt bereitstellen, den Sie mit Ihren anderen Protokollen korrelieren können. Ereignisse können feststellen, wann die Zustandsprüfungen eines Containers fehlgeschlagen sind, und den Zeitraum von Interesse eingrenzen, in dem Sie externe Dienste überprüfen müssen, um die Grundursache eines Problems zu ermitteln.

Streaming von Docker-Ereignissen mit der Docker-CLI

Der CLI-Befehl docker events streamt Ereignisse von Ihrem Docker-Daemon in Ihr Terminalfenster. Ereignisse werden in Echtzeit angezeigt, bis Sie den Vorgang beenden, indem Sie die Tastenkombination Strg+C drücken.

Wenn Sie den Befehl ohne Argumente ausführen, wird zunächst keine Ausgabe angezeigt. Nur neue Aktivitäten werden angezeigt, sodass die Ausgabe leer bleibt, bis ein Ereignis eintritt. Sie können einen provozieren, indem Sie einen neuen Container in einer anderen Shell starten:

 $ docker run --rm hallo-welt

Im Terminalfenster, in dem der docker events -Befehl ausgeführt wird, sollten nun mehrere Events erscheinen:

 2022-05-31T15:20:00.267970018+01:00 Bild-Pull-Hallo-Welt:neueste (Name=Hallo-Welt)
2022-05-31T15:20:00.347054862+01:00 Container erstellen 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.347805277+01:00 Container anhängen 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.621070053+01:00 Containerstart 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
...

Jedes Ereignis wird in einer eigenen Zeile angezeigt. Der Ereigniszeitstempel wird zuerst angezeigt, gefolgt vom Typ des betroffenen Objekts (z. B. image oder container ) und dann der durchgeführten Aktion (z. B. create , attach und start ). Der Rest der Nachricht enthält nützliche Metadaten zum Objekt. Das obige Beispiel zeigt, dass das Bild hello-world:latest abgerufen und ein Container daraus erstellt wurde.

Ausgabe formatieren

Die rohe Ereignisliste ist oft unhandlich. Sie können die Ausgabe mit dem Flag --format , das eine Go-Vorlagenzeichenfolge akzeptiert:

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

Wenn Sie dieses Beispiel ausführen, wird eine Ausgabe erzeugt, die wie folgt aussieht:

 1654006800 Pull-Bild hello-world:latest
1654006800 Container erstellen 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 Container anbringen 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 Startcontainer 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

Sie können Ereignisse als JSON-Objekte darstellen lassen, indem Sie {{ json . }} {{ json . }} als Ihre Vorlagenzeichenfolge:

 $ docker events --format '{{ json . }}' | jq
{
  "status": "erstellen",
  "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
  "von": "Hallo-Welt",
  "Typ": "Behälter",
  "Aktion": "erstellen",
  "Schauspieler": {
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Attribute": {
      "Bild": "Hallo Welt",
      "name": "nifty_morse"
    }
  },
  "Bereich": "lokal",
  "Zeit": 1654006800,
  "timeNano": 1654006800347054800
}

Hier wird das rohe JSON durch jq , damit es in Ihrem Terminal hübsch gedruckt wird. Dies erleichtert das Durchsuchen der Informationen.

Wenn Sie benutzerdefinierte Formatzeichenfolgen erstellen, können Sie die Eigenschaften in der JSON-Ausgabe als Referenz für unterstützte Platzhalter verwenden. In den meisten Fällen müssen Sie den ersten Buchstaben jeder Eigenschaft groß schreiben, z. B. time to {{ .Time }} .

Filtern von Ereignissen

Das Ereignisprotokoll für einen ausgelasteten Docker-Daemon kann schnell laut werden. Mit dem Flag --filter können Sie die Ereignisse auf eine bestimmte Aktion, ein bestimmtes Objekt oder einen bestimmten Objekttyp eingrenzen:

  • docker events --filter type=container – Ruft alle Ereignisse ab, die sich auf Container beziehen.
  • docker events --filter event=create – Containererstellungsereignisse abrufen.
  • docker events --filter container=demo-container – Holen Sie sich alle Ereignisse, die für den Container mit dem Namen demo-container gespeichert wurden (Sie können auf die ID oder den Namen des Containers verweisen).

Neben container können Sie nach allen unterstützten Objekttypnamen wie image , network und volume filtern.

Mehrere Filter werden unterstützt, wenn Sie das Flag --filter wiederholen. Eindeutige Filter werden als logische UND- Bedingungen interpretiert; mehrfache Verwendungen desselben Filters werden zu ODER -Klauseln. Hier ist ein Beispiel, das das create -Ereignis sowohl für die app-container als auch für die api-container -Container anzeigt:

 $ Docker-Ereignisse \
    --filter container=app-container
    --filter container=API-Container
    --filter event=erstellen

Zugriff auf historische Ereignisse

docker events zeigen standardmäßig nur Ereignisse an, die seit der Ausführung des Befehls gespeichert wurden. Sie können historische Ereignisse einbeziehen, indem Sie das Flag --since hinzufügen. Dies akzeptiert einen menschenlesbaren Zeitausdruck oder einen absoluten Zeitstempel:

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

Ereignisse, die nach der angegebenen Zeit aufgezeichnet werden, werden sofort in Ihrem Terminal angezeigt. Neue Ereignisse werden weiterhin in Echtzeit angezeigt, während sie aufgezeichnet werden.

Sie können Ereignisse nach einer bestimmten Zeit mit dem Flag --until . Es funktioniert ähnlich wie --since . Die Verwendung --until deaktiviert das Echtzeit-Streaming neuer Ereignisse, da sie außerhalb des angeforderten Zeitrahmens liegen würden.

Streaming von Docker-Ereignissen von der Daemon-REST-API

Eine andere Möglichkeit, auf gespeicherte Ereignisse zuzugreifen, ist über die Docker-Daemon-REST-API. Sie können den /events -Endpunkt verwenden, um Ereignisse in Echtzeit zu streamen, nachdem Sie die API auf Ihrem Docker-Host aktiviert haben. Ereignisse werden im JSON-Format zurückgegeben:

 $ curl http://127.0.0.1:2375/v1.41/events
{
  "Typ": "Behälter",
  "Aktion": "erstellen",
  "Schauspieler": {
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Attribute": {
      "Bild": "Hallo Welt",
      "name": "nifty_morse"
    }
  },
  "Bereich": "lokal",
  "Zeit": 1654006800,
  "timeNano": 1654006800347054800
}

Der API-Endpunkt unterstützt filter , since und until -Parameter, die das gleiche Verhalten wie ihre CLI-Gegenstücke haben. So rufen Sie alle in der letzten Stunde aufgezeichneten Containererstellungsereignisse ab:

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

Senden von Ereignissen an einen externen Dienst

Docker fehlt eine integrierte Möglichkeit, Ereignisse an einen externen Dienst zu senden. Dies kann nützlich sein, wenn Sie möchten, dass alle Ihre Containererstellungen in einer vorhandenen Überwachungs- oder Auditing-Plattform protokolliert werden.

Sie können Ihre eigene Lösung einrichten, indem Sie einen Systemdienst erstellen, der kontinuierlich docker events . Es sollte jede neue Ausgabezeile an Ihr externes System senden.

Schreiben Sie zuerst ein Bash-Skript, das die benötigte Funktionalität implementiert:

 #!/bin/bash
docker events --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | während Leseereignis
tun
    locken \
        -X POST \
        -H "Inhaltstyp: Anwendung/json" \
        -d '{"Ereignis": "$Ereignis"}' \
        https://example.com/events
erledigt

Erstellen Sie nun eine neue systemd -Diensteinheit unter /etc/systemd/system/docker-events.service :

 [Einheit]
Description=Benutzerdefinierter Docker-Ereignisüberwachungsdienst

[Service]
Typ=Verzweigung
ExecStart=/usr/local/bin/docker-events.sh

[Installieren]
WantedBy=multi-user.target

Laden Sie schließlich systemd , um Ihren Dienst zu laden, und starten und aktivieren Sie dann die Einheit:

 $ sudo systemctl daemon-reload
$ sudo systemctl docker-events starten
$ sudo systemctl aktiviert Docker-Ereignisse

Ihr Dienst wird nun jedes neue Ereignis an Ihre Überwachungsplattform streamen. Wenn Sie den Dienst aktivieren, wird er so konfiguriert, dass er bei jedem Neustart Ihres Hosts automatisch gestartet wird.

Zusammenfassung

Docker-Ereignisse werden immer dann erstellt, wenn der Daemon Objekte in Ihrer Umgebung ändert. Durch das Streamen des Ereignisprotokolls können Sie die Daemon-Aktivität in Echtzeit überwachen. Dies kann Ihnen helfen, Probleme zu debuggen, Änderungen zu prüfen und die Einhaltung von Vorschriften sicherzustellen.

Da Ereignisse direkt vom Docker-Server abgerufen werden, sollten Sie sich nicht darauf verlassen, wenn Sie in Zukunft Informationen abrufen müssen. Nur 1.000 Einträge werden fortlaufend aufbewahrt und Sie können nicht über das Dateisystem Ihres Docker-Hosts auf Ereignisse zugreifen. Der Mechanismus eignet sich am besten für schnelle Ad-hoc-Aufgaben, bei denen Sie nach bestimmten Informationen zu einer kürzlich durchgeführten Aktivität suchen. Für eine langfristige Aufbewahrung sollten Sie Ihren eigenen Systemdienst verwenden, um Ereignisse an ein externes Repository zu senden.