Jak wyświetlić historię zdarzeń instalacji Docker?

Opublikowany: 2022-08-11

Logo Dockera

Docker Engine rejestruje zdarzenie za każdym razem, gdy demon podejmuje znaczące działania. Możesz uzyskać dostęp do dziennika zdarzeń, aby określić, kiedy wystąpiła akcja i śledzić zmiany obiektów w czasie.

W tym artykule wyjaśnimy, co jest rejestrowane jako zdarzenia i kiedy warto je wyświetlić. Następnie pokażemy, jak monitorować zdarzenia w czasie rzeczywistym za pomocą interfejsu Docker CLI i REST API.

Co to są zdarzenia Dockera?

Zdarzenia platformy Docker opisują działania podejmowane przez demona platformy Docker. Większość interakcji z obiektami, takimi jak kontenery, obrazy, woluminy i sieci, rejestruje zdarzenie, tworząc dziennik, którego można użyć do sprawdzenia przeszłych zmian.

Istnieje wiele różnych rodzajów zdarzeń, które identyfikują określone zmiany w Twoim środowisku:

  • Tworzenie i usuwanie kontenerów
  • Stany kontroli stanu kontenera
  • Polecenia wykonywane wewnątrz kontenerów za pomocą docker exec
  • Ciągnięcie i pchanie obrazów
  • Tworzenie, niszczenie, montowanie i odmontowywanie woluminów
  • Włączanie i wyłączanie wtyczek demona Docker

Możesz wyświetlić pełną listę w dokumentacji platformy Docker.

Każde zarejestrowane zdarzenie zawiera sygnaturę czasową i identyfikator obiektu, którego dotyczy problem. Możesz użyć tych informacji, aby zebrać historię zmian w swoim środowisku, niezależnie od tego, czy zaobserwowałeś ich pierwotne wyzwalacze.

Przechowywane zdarzenia mogą również pomóc w diagnozowaniu problemów, takich jak nieoczekiwane awarie kontenera. Przeglądanie dziennika pozwala określić dokładny czas zatrzymania kontenera, zapewniając punkt danych, który można skorelować z innymi dziennikami. Zdarzenia mogą ustalić, kiedy kontrole kondycji kontenera zaczęły kończyć się niepowodzeniem, zawężając interesujący okres, gdy trzeba sprawdzić usługi zewnętrzne w celu określenia głównej przyczyny problemu.

Przesyłanie strumieniowe zdarzeń platformy Docker za pomocą interfejsu wiersza polecenia platformy Docker

Polecenie interfejsu wiersza polecenia docker events platformy Docker przesyła zdarzenia z demona platformy Docker do okna terminala. Zdarzenia będą pojawiać się w czasie rzeczywistym do momentu zakończenia procesu przez naciśnięcie kombinacji klawiszy Ctrl+C.

Uruchomienie polecenia bez argumentów nie spowoduje wyświetlenia żadnych danych wyjściowych. Wyświetlana jest tylko nowa aktywność, więc wyjście pozostaje puste do momentu wystąpienia zdarzenia. Możesz je sprowokować, uruchamiając nowy kontener w innej powłoce:

 $ docker run --rm hello-world

Kilka zdarzeń powinno teraz pojawić się w oknie terminala, w którym uruchomiono polecenie 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 kontener utwórz 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (obraz=hello-world, name=nifty_morse)
2022-05-31T15:20:00.347805277+01:00 dołączenie kontenera 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (obraz=hello-world, name=nifty_morse)
2022-05-31T15:20:00.621070053+01:00 start kontenera 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (obraz=hello-world, name=nifty_morse)
...

Każde zdarzenie wyświetla się w osobnym wierszu. Sygnatura czasowa zdarzenia jest wyświetlana jako pierwsza, następnie typ obiektu, którego dotyczy (np. image lub container ), a następnie podjęta czynność (np. create , attach i start ). Pozostała część wiadomości zawiera przydatne metadane dotyczące obiektu. Powyższy przykład pokazuje, że pobrano obraz hello-world:latest i utworzono z niego kontener.

Formatowanie wyjścia

Surowa lista wydarzeń jest często nieporęczna. Możesz ponownie sformatować dane wyjściowe za pomocą flagi --format , która akceptuje ciąg szablonu Go:

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

Uruchomienie tego przykładu da wynik, który wygląda tak:

 1654006800 obraz ściągania hello-world:ostatni
1654006800 Utwórz kontener 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 dołączyć pojemnik 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 Kontener startowy 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

Możesz uzyskać zdarzenia reprezentowane jako obiekty JSON, używając {{ json . }} {{ json . }} jako ciąg szablonu:

 $ docker events --format '{{ json . }}' | jq
{
  "status": "utwórz",
  "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
  "od": "witaj-świecie",
  „Typ”: „kontener”,
  "Akcja": "utwórz",
  „Aktor”: {
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    „Atrybuty”: {
      "image": "witaj-świecie",
      "name": "fajne_morse"
    }
  },
  "zakres": "lokalny",
  "czas": 1654006800,
  "czasNano": 1654006800347054800
}

Tutaj surowy JSON jest przekazywany przez jq , więc jest całkiem wydrukowany w twoim terminalu. Ułatwia to przeglądanie informacji.

Podczas tworzenia niestandardowych ciągów formatu możesz użyć właściwości w danych wyjściowych JSON jako odniesienia dla obsługiwanych symboli zastępczych. W większości przypadków musisz pisać wielką literą każdej właściwości, na przykład time to {{ .Time }} .

Filtrowanie wydarzeń

Dziennik zdarzeń zajętego demona platformy Docker może szybko stać się hałaśliwy. Możesz zawęzić zdarzenia do określonej akcji, obiektu lub typu obiektu za pomocą flagi --filter :

  • docker events --filter type=container — pobierz wszystkie zdarzenia związane z kontenerami.
  • docker events --filter event=create – Pobierz zdarzenia tworzenia kontenera.
  • docker events --filter container=demo-container — pobierz wszystkie zdarzenia zapisane dla kontenera o nazwie demo-container (możesz odwołać się do identyfikatora lub nazwy kontenera).

Oprócz container można filtrować według wszystkich obsługiwanych nazw typów obiektów, takich jak image , network i volume .

Wiele filtrów jest obsługiwanych, gdy powtarzasz flagę --filter . Odrębne filtry są interpretowane jako logiczne warunki AND ; wielokrotne użycie tego samego filtra staje się klauzulami OR . Oto przykład, który wyświetla zdarzenie create zarówno dla app-container api-container :

 $ zdarzenia dokowane \
    --filter container=app-container
    --filter container=api-container
    --filtruj zdarzenie=utwórz

Dostęp do wydarzeń historycznych

docker events domyślnie wyświetlają tylko zdarzenia przechowywane od czasu uruchomienia polecenia. Możesz uwzględnić wydarzenia historyczne, dodając flagę --since . Akceptuje czytelne dla człowieka wyrażenie czasu lub bezwzględny znacznik czasu:

 $ zdarzenia dokowane --od 1h
$ zdarzenia dockera --od „2021-05-01T16:00:00”

Zdarzenia zarejestrowane po określonym czasie natychmiast pojawią się w Twoim terminalu. Nowe wydarzenia będą nadal pojawiać się w czasie rzeczywistym w miarę ich rejestrowania.

Możesz wykluczyć zdarzenia po określonym czasie za pomocą flagi --until . Działa podobnie do --since . Użycie --until spowoduje wyłączenie przesyłania strumieniowego nowych wydarzeń w czasie rzeczywistym, ponieważ wypadłyby one poza żądanym przedziałem czasowym.

Przesyłanie strumieniowe zdarzeń platformy Docker z interfejsu Daemon REST API

Innym sposobem uzyskania dostępu do przechowywanych zdarzeń jest użycie interfejsu API REST demona platformy Docker. Możesz użyć punktu końcowego /events do strumieniowego przesyłania zdarzeń w czasie rzeczywistym po włączeniu interfejsu API na hoście platformy Docker. Zdarzenia będą zwracane w formacie JSON:

 $ curl http://127.0.0.1:2375/v1.41/wydarzenia
{
  „Typ”: „kontener”,
  "Akcja": "utwórz",
  „Aktor”: {
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    „Atrybuty”: {
      "image": "witaj-świecie",
      "name": "fajne_morse"
    }
  },
  "zakres": "lokalny",
  "czas": 1654006800,
  "czasNano": 1654006800347054800
}

Punkt końcowy interfejsu API obsługuje filter , since i until parametry, które mają takie same zachowania jak ich odpowiedniki CLI. Oto jak pobrać wszystkie zdarzenia tworzenia kontenera zarejestrowane w ciągu ostatniej godziny:

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

Wysyłanie zdarzeń do usługi zewnętrznej

Docker nie ma wbudowanego sposobu wysyłania zdarzeń do usługi zewnętrznej. Może to być przydatne, jeśli chcesz, aby wszystkie tworzone przez Ciebie kontenery były rejestrowane na istniejącej platformie monitorowania lub audytu.

Możesz skonfigurować własne rozwiązanie, tworząc usługę systemową, która stale uruchamia docker events . Powinien wysyłać każdą nową linię wyjścia do systemu zewnętrznego.

Najpierw napisz skrypt Bash, który implementuje potrzebną Ci funkcjonalność:

 #!/kosz/bash
zdarzenia docker --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | podczas czytania zdarzenia
robić
    zwijanie \
        -X POST \
        -H „Typ treści: aplikacja/json” \
        -d '{"zdarzenie": "$zdarzenie"}' \
        https://example.com/wydarzenia
Gotowe

Teraz utwórz nową jednostkę serwisową systemd w /etc/systemd/system/docker-events.service :

 [Jednostka]
Opis=Niestandardowa usługa monitorowania zdarzeń platformy Docker

[Usługa]
Typ = rozwidlenie
ExecStart=/usr/local/bin/docker-events.sh

[Zainstalować]
WantedBy=wielu użytkowników.cel

Na koniec przeładuj systemd , aby załadować usługę, a następnie uruchom i włącz urządzenie:

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

Twoja usługa będzie teraz przesyłać strumieniowo każde nowe wydarzenie na Twoją platformę monitorowania. Włączenie usługi powoduje jej automatyczne uruchamianie przy każdym ponownym uruchomieniu hosta.

Streszczenie

Zdarzenia Dockera są tworzone za każdym razem, gdy demon modyfikuje obiekty w Twoim środowisku. Przesyłanie strumieniowe dziennika zdarzeń umożliwia monitorowanie aktywności demonów w czasie rzeczywistym. Może to pomóc w debugowaniu problemów, kontroli zmian i zapewnieniu zgodności.

Ponieważ zdarzenia są pobierane bezpośrednio z serwera Docker, nie należy na nich polegać, jeśli będziesz musiał pobierać informacje w przyszłości. Tylko 1000 wpisów jest zachowywanych w sposób ciągły i nie można uzyskać dostępu do zdarzeń za pośrednictwem systemu plików hosta platformy Docker. Mechanizm najlepiej nadaje się do szybkich zadań ad hoc, w których szukasz konkretnych informacji związanych z ostatnią aktywnością. W przypadku długoterminowego przechowywania należy użyć własnej usługi systemowej do wysyłania zdarzeń do zewnętrznego repozytorium.