Cum să vizualizați istoricul evenimentelor instalării dvs. Docker

Publicat: 2022-08-11

Sigla Docker

Docker Engine înregistrează un eveniment ori de câte ori demonul întreprinde acțiuni semnificative. Puteți accesa jurnalul de evenimente pentru a identifica când a avut loc o acțiune și pentru a urmări modificările aduse obiectelor de-a lungul timpului.

În acest articol, vom explica ce sunt surprinse ca evenimente și când ați putea dori să le vizualizați. Vom arăta apoi cum să monitorizăm evenimentele în timp real folosind Docker CLI și API-ul REST.

Ce sunt evenimentele Docker?

Evenimentele Docker descriu activitățile efectuate de demonul dvs. Docker. Majoritatea interacțiunilor cu obiecte precum containere, imagini, volume și rețele înregistrează un eveniment, creând un jurnal pe care îl puteți utiliza pentru a inspecta modificările anterioare.

Există multe tipuri diferite de evenimente care identifică schimbări specifice în mediul dvs.:

  • Crearea și îndepărtarea containerelor
  • Starile de verificare a stării containerului
  • Comenzile executate în interiorul containerelor cu docker exec
  • Trage și împingând imagini
  • Crearea, distrugerea, montarea și demontarea volumelor
  • Activarea și dezactivarea pluginurilor Daemon Docker

Puteți vizualiza lista completă în documentația Docker.

Fiecare eveniment înregistrat include un marcaj de timp și ID-ul obiectului afectat. Puteți utiliza aceste informații pentru a aduna un istoric al modificărilor aduse mediului dvs., indiferent dacă ați observat sau nu declanșatorii lor inițiali.

Evenimentele stocate pot ajuta, de asemenea, la diagnosticarea problemelor, cum ar fi defecțiunile neașteptate ale containerului. Vizualizarea jurnalului vă permite să identificați momentul exact în care un container s-a oprit, oferind un punct de date pe care îl puteți corela cu celelalte jurnale ale dvs. Evenimentele pot stabili când verificările de sănătate ale unui container au început să eșueze, restrângând perioada de interes când trebuie să inspectați serviciile externe pentru a determina cauza principală a unei probleme.

Transmiterea în flux a evenimentelor Docker cu Docker CLI

Comanda CLI docker events transmite evenimente din daemonul Docker în fereastra terminalului. Evenimentele vor apărea în timp real până când încheiați procesul prin apăsarea combinației de tastatură Ctrl+C.

Rularea comenzii fără argumente nu va afișa nicio ieșire pentru început. Este afișată doar activitatea nouă, astfel încât rezultatul rămâne gol până când apare un eveniment. Puteți provoca unul pornind un nou container într-o altă carcasă:

 $ docker run --rm hello-world

Mai multe evenimente ar trebui să apară acum în fereastra terminalului care rulează comanda docker events :

 2022-05-31T15:20:00.267970018+01:00 extragere imagine hello-world:latest (nume=hello-world)
2022-05-31T15:20:00.347054862+01:00 container create 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f0237-879e8fdcc3cab4c82c4a341d719df56ec2e7f879ee8f0237-world
2022-05-31T15:20:00.347805277+01:00 atașarea containerului 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879e7f879e8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879e7f879e8f0237-world
2022-05-31T15:20:00.621070053+01:00 pornirea containerului 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f0237-879ee8fdcc3cab4c82c4a341d719df56ec2e7f879ee8f02hello7
...

Fiecare eveniment se afișează pe propria linie. Timpul evenimentului este afișat mai întâi, urmat de tipul de obiect afectat (cum ar fi image sau container ) și apoi acțiunea care a fost întreprinsă (cum ar fi create , attach și start ). Restul mesajului conține metadate utile despre obiect. Exemplul de mai sus arată că imaginea hello-world:latest a fost extrasă și a fost creat un container din ea.

Formatarea ieșirii

Lista de evenimente brute este adesea greoaie. Puteți reformata ieșirea folosind --format care acceptă un șir de șablon Go:

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

Rularea acestui exemplu va produce rezultate care arată astfel:

 1654006800 extragere imagine hello-world:latest
1654006800 creați container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 atașați containerul 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 pornire container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

Puteți obține evenimente reprezentate ca obiecte JSON utilizând {{ json . }} {{ json . }} ca șir de șablon:

 $ docker events --format „{{ json . }}' | jq
{
  "status": "creați",
  "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
  "de la": "bună-lumea",
  „Tip”: „container”,
  „Acțiune”: „creați”,
  "Actor": {
    „ID”: „4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378”,
    „Atribute”: {
      "image": "bună ziua, lume",
      "nume": "nifty_morse"
    }
  },
  "domeniu": "local",
  „timp”: 1654006800,
  „timeNano”: 1654006800347054800
}

Aici JSON brut este trecut prin jq , așa că este destul de imprimat în terminalul dvs. Acest lucru face ca informațiile să fie mai ușor de scanat.

Când creați șiruri de format personalizate, puteți utiliza proprietățile din rezultatul JSON ca referință pentru substituenții acceptați. În cele mai multe cazuri, va trebui să scrieți prima literă cu majuscule a fiecărei proprietăți, cum ar fi time până la {{ .Time }} .

Filtrarea evenimentelor

Jurnalul de evenimente pentru un demon Docker ocupat poate deveni rapid zgomotos. Puteți restrânge evenimentele la o anumită acțiune, obiect sau tip de obiect cu --filter :

  • docker events --filter type=container – Obține toate evenimentele care se referă la containere.
  • docker events --filter event=create – Obțineți evenimente de creare a containerului.
  • docker events --filter container=demo-container – Obțineți toate evenimentele salvate pentru containerul numit demo-container (puteți face referire la ID-ul sau numele containerului).

Pe lângă container , puteți filtra după toate numele de tip de obiect acceptate, cum ar fi image , network și volume .

Sunt acceptate mai multe filtre atunci când repeți --filter . Filtrele distincte sunt interpretate ca condiţii logice ŞI ; utilizările multiple ale aceluiași filtru devin clauze SAU . Iată un exemplu care evidențiază evenimentul de create atât app-container api-container :

 $ evenimente docker \
    --filter container=app-container
    --filter container=api-container
    --filter event=creare

Accesarea evenimentelor istorice

docker events afișează implicit numai evenimentele stocate de când comanda a fost rulată. Puteți include evenimente istorice adăugând steagul --since . Aceasta acceptă o expresie temporală care poate fi citită de om sau un marcaj temporal absolut:

 Evenimente $ docker --din 1 oră
Evenimente $ docker --din '2021-05-01T16:00:00'

Evenimentele înregistrate după ora dată vor fi afișate imediat în terminalul dumneavoastră. Evenimentele noi vor continua să apară în timp real pe măsură ce sunt înregistrate.

Puteți exclude evenimente după o anumită perioadă de timp cu --until . Funcționează în mod similar cu --since . Folosirea --until va dezactiva transmiterea în timp real a evenimentelor noi, deoarece acestea nu se încadrează în intervalul de timp solicitat.

Transmiterea în flux a evenimentelor Docker din API-ul Daemon REST

O altă modalitate de a accesa evenimentele stocate este prin intermediul API-ului REST demonul Docker. Puteți folosi punctul final /events pentru a transmite evenimente în timp real după ce ați activat API-ul pe gazda Docker. Evenimentele vor fi returnate în format JSON:

 $ curl http://127.0.0.1:2375/v1.41/events
{
  „Tip”: „container”,
  „Acțiune”: „creați”,
  "Actor": {
    „ID”: „4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378”,
    „Atribute”: {
      "image": "bună ziua, lume",
      "nume": "nifty_morse"
    }
  },
  "domeniu": "local",
  „timp”: 1654006800,
  „timeNano”: 1654006800347054800
}

Punctul final API acceptă filter , since , și until parametrii care au aceleași comportamente ca și omologii lor CLI. Iată cum puteți prelua toate evenimentele de creare a containerelor înregistrate în ultima oră:

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

Trimiterea evenimentelor către un serviciu extern

Docker nu are o modalitate încorporată de a trimite evenimente către un serviciu extern. Acest lucru ar putea fi util dacă doriți ca toate creațiile dvs. de containere să fie conectate pe o platformă de monitorizare sau auditare existentă.

Vă puteți configura propria soluție creând un serviciu de sistem care rulează continuu docker events . Ar trebui să trimită fiecare nouă linie de ieșire către sistemul dumneavoastră extern.

Mai întâi scrieți un script Bash care implementează funcționalitatea de care aveți nevoie:

 #!/bin/bash
evenimente docker --format „{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}” | în timpul citirii evenimentului
do
    curl \
        -X POST\
        -H „Content-Type: application/json” \
        -d '{"eveniment": "$eveniment"}' \
        https://example.com/events
Terminat

Acum creați o nouă unitate de serviciu systemd la /etc/systemd/system/docker-events.service :

 [Unitate]
Descriere=Serviciul de monitorizare a evenimentelor Docker personalizat

[Serviciu]
Tip = bifurcare
ExecStart=/usr/local/bin/docker-events.sh

[Instalare]
WantedBy=multi-user.target

În cele din urmă, reîncărcați systemd pentru a vă încărca serviciul, apoi porniți și activați unitatea:

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

Serviciul dvs. va transmite acum fiecare eveniment nou pe platforma dvs. de monitorizare. Activarea serviciului îl configurează să pornească automat de fiecare dată când gazda repornește.

rezumat

Evenimentele Docker sunt create ori de câte ori demonul modifică obiecte din mediul dumneavoastră. Transmiterea în flux a jurnalului de evenimente vă permite să monitorizați activitatea demonului în timp real. Acest lucru vă poate ajuta să depanați problemele, să auditați modificările și să asigurați conformitatea.

Deoarece evenimentele sunt preluate direct de pe serverul Docker, nu trebuie să vă bazați pe ele dacă va trebui să recuperați informații în viitor. Doar 1.000 de intrări sunt reținute în mod continuu și nu puteți accesa evenimente prin sistemul de fișiere al gazdei Docker. Mecanismul este cel mai potrivit pentru sarcini ad-hoc rapide în care căutați informații specifice legate de o activitate recentă. Pentru păstrarea pe termen lung, ar trebui să utilizați propriul serviciu de sistem pentru a trimite evenimente la un depozit extern.