Cara Melihat Riwayat Acara Instalasi Docker Anda

Diterbitkan: 2022-08-11

logo buruh pelabuhan

Docker Engine mencatat suatu peristiwa setiap kali tindakan signifikan diambil oleh daemon. Anda dapat mengakses log peristiwa untuk mengidentifikasi kapan suatu tindakan terjadi dan melacak perubahan pada objek dari waktu ke waktu.

Dalam artikel ini, kami akan menjelaskan apa yang ditangkap sebagai peristiwa dan kapan Anda mungkin ingin melihatnya. Kami kemudian akan menunjukkan cara memantau peristiwa secara real-time menggunakan Docker CLI dan REST API.

Apa itu Acara Docker?

Peristiwa Docker menggambarkan aktivitas yang dilakukan oleh daemon Docker Anda. Sebagian besar interaksi dengan objek seperti wadah, gambar, volume, dan jaringan merekam peristiwa, membuat log yang dapat Anda gunakan untuk memeriksa perubahan sebelumnya.

Ada banyak jenis peristiwa yang mengidentifikasi perubahan spesifik di lingkungan Anda:

  • Membuat dan menghapus wadah
  • Status pemeriksaan kesehatan kontainer
  • Perintah dieksekusi di dalam container dengan docker exec
  • Menarik dan mendorong gambar
  • Membuat, menghancurkan, memasang, dan melepas volume
  • Mengaktifkan dan menonaktifkan plugin daemon Docker

Anda dapat melihat daftar lengkapnya di dokumentasi Docker.

Setiap peristiwa yang direkam menyertakan stempel waktu dan ID objek yang terpengaruh. Anda dapat menggunakan informasi ini untuk mengumpulkan riwayat perubahan pada lingkungan Anda, terlepas dari apakah Anda mengamati pemicu aslinya atau tidak.

Peristiwa tersimpan juga dapat membantu mendiagnosis masalah seperti kegagalan penampung yang tidak terduga. Melihat log memungkinkan Anda mengidentifikasi waktu yang tepat saat sebuah container berhenti, menyediakan titik data yang dapat Anda korelasikan dengan log Anda yang lain. Peristiwa dapat terjadi ketika pemeriksaan kesehatan kontainer mulai gagal, mempersempit periode minat saat Anda perlu memeriksa layanan eksternal untuk menentukan akar penyebab masalah.

Streaming Acara Docker Dengan Docker CLI

Perintah docker events CLI mengalirkan event dari daemon Docker Anda ke jendela terminal Anda. Acara akan muncul secara real-time hingga Anda menghentikan proses dengan menekan kombinasi keyboard Ctrl+C.

Menjalankan perintah tanpa argumen tidak akan menampilkan output apa pun untuk memulai. Hanya aktivitas baru yang ditampilkan sehingga output tetap kosong hingga suatu peristiwa terjadi. Anda dapat memprovokasi satu dengan memulai wadah baru di shell yang berbeda:

 $ docker run --rm hello-world

Beberapa peristiwa sekarang akan muncul di jendela terminal yang menjalankan perintah docker events :

 2022-05-31T15:20:00.267970018+01:00 tarik gambar hello-world:latest (nama=hello-world)
2022-05-31T15:20:00.347054862+01:00 membuat container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.347805277+01:00 wadah melampirkan 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (gambar=hello-world, nama=nifty_morse)
2022-05-31T15:20:00.621070053+01:00 container start 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
...

Setiap acara ditampilkan pada barisnya sendiri. Stempel waktu acara ditampilkan terlebih dahulu, diikuti dengan jenis objek yang terpengaruh (seperti image atau container ) dan kemudian tindakan yang diambil (seperti create , attach , dan start ). Sisa pesan berisi metadata yang berguna tentang objek. Contoh di atas menunjukkan bahwa gambar hello-world:latest ditarik dan sebuah wadah dibuat darinya.

Memformat Keluaran

Daftar acara mentah seringkali berat. Anda dapat memformat ulang output menggunakan flag --format yang menerima string template Go:

 $ peristiwa buruh pelabuhan --format '{{ .Waktu }} {{ .Action }} {{ .Type}} {{ .ID }}'

Menjalankan contoh ini akan menghasilkan output yang terlihat seperti ini:

 1654006800 tarik gambar hello-world:terbaru
1654006800 membuat wadah 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 melampirkan wadah 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 mulai wadah 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

Anda bisa mendapatkan acara yang direpresentasikan sebagai objek JSON dengan menggunakan {{ json . }} {{ json . }} sebagai string template Anda:

 $ peristiwa buruh pelabuhan --format '{{ json . }}' | jq
{
  "status": "buat",
  "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
  "from": "halo-dunia",
  "Jenis": "wadah",
  "Tindakan": "buat",
  "Aktor": {
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Atribut": {
      "image": "halo-dunia",
      "nama": "nifty_morse"
    }
  },
  "lingkup": "lokal",
  "waktu": 1654006800,
  "timeNano": 1654006800347054800
}

Di sini JSON mentah sedang melewati jq sehingga cukup dicetak di terminal Anda. Ini membuat informasi lebih mudah untuk dipindai.

Saat Anda membuat string format kustom, Anda dapat menggunakan properti di output JSON sebagai referensi untuk placeholder yang didukung. Dalam kebanyakan kasus, Anda harus menggunakan huruf kapital pada huruf pertama dari setiap properti, seperti time to {{ .Time }} .

Acara Penyaringan

Log peristiwa untuk daemon Docker yang sibuk dapat dengan cepat menjadi berisik. Anda dapat mempersempit peristiwa menjadi tindakan, objek, atau jenis objek tertentu dengan flag --filter :

  • docker events --filter type=container – Dapatkan semua event yang berhubungan dengan container.
  • docker events --filter event=create – Dapatkan event pembuatan container.
  • docker events --filter container=demo-container – Dapatkan semua event disimpan untuk container yang disebut demo-container (Anda dapat merujuk ID atau nama container).

Selain container , Anda dapat memfilter menurut semua nama jenis objek yang didukung seperti image , network , dan volume .

Beberapa filter didukung saat Anda mengulangi tanda --filter . Filter berbeda diinterpretasikan sebagai kondisi AND logis; beberapa penggunaan filter yang sama menjadi klausa OR . Berikut adalah contoh yang memunculkan event create untuk app-container dan api-container container:

 $ acara buruh pelabuhan \
    --filter container=app-container
    --filter container=api-wadah
    --filter acara=buat

Mengakses Peristiwa Bersejarah

docker events default hanya menampilkan acara yang disimpan sejak perintah dijalankan. Anda dapat menyertakan peristiwa bersejarah dengan menambahkan tanda --since . Ini menerima ekspresi waktu yang dapat dibaca manusia atau stempel waktu absolut:

 $ acara buruh pelabuhan --sejak 1 jam
$ acara buruh pelabuhan --sejak '2021-05-01T16:00:00'

Acara yang direkam setelah waktu yang ditentukan akan segera ditampilkan di terminal Anda. Acara baru akan terus muncul secara real-time saat direkam.

Anda dapat mengecualikan acara setelah waktu tertentu dengan flag --until . Ini bekerja mirip dengan --since . Menggunakan --until akan menonaktifkan streaming acara baru secara real-time karena berada di luar jangka waktu yang diminta.

Streaming Acara Docker Dari Daemon REST API

Cara lain untuk mengakses peristiwa tersimpan adalah melalui REST API daemon Docker. Anda dapat menggunakan titik akhir /events untuk melakukan streaming peristiwa secara real-time setelah Anda mengaktifkan API di host Docker Anda. Acara akan dikembalikan dalam format JSON:

 $ curl http://127.0.0.1:2375/v1.41/events
{
  "Jenis": "wadah",
  "Tindakan": "buat",
  "Aktor": {
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Atribut": {
      "image": "halo-dunia",
      "nama": "nifty_morse"
    }
  },
  "lingkup": "lokal",
  "waktu": 1654006800,
  "timeNano": 1654006800347054800
}

Titik akhir API mendukung filter , since , dan until parameter yang memiliki perilaku yang sama dengan rekan CLI mereka. Berikut cara mengambil semua peristiwa pembuatan penampung yang direkam dalam satu jam terakhir:

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

Mengirim Acara ke Layanan Eksternal

Docker tidak memiliki cara bawaan untuk mengirim acara ke layanan eksternal. Ini bisa berguna jika Anda ingin semua kreasi penampung Anda dicatat di platform pemantauan atau audit yang ada.

Anda dapat mengatur solusi Anda sendiri dengan membuat layanan sistem yang terus-menerus menjalankan docker events . Itu harus mengirim setiap baris keluaran baru ke sistem eksternal Anda.

Pertama, tulis skrip Bash yang mengimplementasikan fungsionalitas yang Anda butuhkan:

 #!/bin/bash
docker event --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | acara saat membaca
melakukan
    ikal \
        -X POSTING \
        -H "Jenis Konten: aplikasi/json" \
        -d '{"acara": "$acara"}' \
        https://example.com/events
selesai

Sekarang buat unit layanan systemd baru di /etc/systemd/system/docker-events.service :

 [Satuan]
Description=Layanan Pemantauan Acara Docker Khusus

[Melayani]
Jenis = garpu
ExecStart=/usr/local/bin/docker-events.sh

[Install]
WantedBy=multi-pengguna.target

Terakhir, muat ulang systemd untuk memuat layanan Anda, lalu mulai dan aktifkan unit:

 $ sudo systemctl daemon-reload
$ sudo systemctl start docker-events
$ sudo systemctl aktifkan acara buruh pelabuhan

Layanan Anda sekarang akan mengalirkan setiap acara baru ke platform pemantauan Anda. Mengaktifkan layanan mengonfigurasinya untuk memulai secara otomatis setiap kali host Anda melakukan boot ulang.

Ringkasan

Peristiwa Docker dibuat setiap kali daemon memodifikasi objek di lingkungan Anda. Streaming log peristiwa memungkinkan Anda memantau aktivitas daemon secara real-time. Ini dapat membantu Anda men-debug masalah, mengaudit perubahan, dan memastikan kepatuhan.

Karena peristiwa diambil langsung dari server Docker, peristiwa itu tidak boleh diandalkan jika Anda perlu mengambil informasi di masa mendatang. Hanya 1.000 entri yang dipertahankan secara bergulir dan Anda tidak dapat mengakses acara melalui sistem file host Docker Anda. Mekanisme ini paling cocok untuk tugas ad-hoc cepat di mana Anda mencari informasi spesifik yang terkait dengan aktivitas terbaru. Untuk retensi jangka panjang, Anda harus menggunakan layanan sistem Anda sendiri untuk mengirim acara ke repositori eksternal.