Docker Kurulumunuzun Olay Geçmişini Nasıl Görüntüleyebilirsiniz?

Yayınlanan: 2022-08-11

liman işçisi logosu

Docker Engine, arka plan programı tarafından önemli eylemler gerçekleştirildiğinde bir olayı kaydeder. Bir eylemin ne zaman gerçekleştiğini belirlemek ve zaman içinde nesnelerdeki değişiklikleri izlemek için olay günlüğüne erişebilirsiniz.

Bu makalede, nelerin olay olarak kaydedildiğini ve bunları ne zaman görüntülemek isteyebileceğinizi açıklayacağız. Ardından, Docker CLI ve REST API kullanarak olayların gerçek zamanlı olarak nasıl izleneceğini göstereceğiz.

Docker Olayları nedir?

Docker olayları, Docker arka plan programınız tarafından gerçekleştirilen etkinlikleri tanımlar. Kapsayıcılar, görüntüler, birimler ve ağlar gibi nesnelerle olan etkileşimlerin çoğu, bir olayı kaydederek, geçmişteki değişiklikleri incelemek için kullanabileceğiniz bir günlük oluşturur.

Ortamınızdaki belirli değişiklikleri tanımlayan birçok farklı olay türü vardır:

  • Kapsayıcı oluşturma ve kaldırma
  • Kapsayıcı sistem durumu denetimi durumları
  • docker exec ile konteynerlerin içinde yürütülen komutlar
  • Görüntüleri çekme ve itme
  • Birimler oluşturma, yok etme, monte etme ve ayırma
  • Docker daemon eklentilerini etkinleştirme ve devre dışı bırakma

Tam listeyi Docker'ın belgelerinde görüntüleyebilirsiniz.

Kaydedilen her olay, bir zaman damgası ve etkilenen nesnenin kimliğini içerir. Bu bilgileri, orijinal tetikleyicilerini gözlemlemiş olsanız da olmasanız da, ortamınızdaki değişikliklerin geçmişini bir araya getirmek için kullanabilirsiniz.

Saklanan olaylar, beklenmeyen kapsayıcı arızaları gibi sorunların tanılanmasına da yardımcı olabilir. Günlüğü görüntülemek, bir kapsayıcının durduğu zamanı tam olarak belirlemenize olanak tanır ve diğer günlüklerinizle ilişki kurabileceğiniz bir veri noktası sağlar. Olaylar, bir kapsayıcının sistem durumu denetimlerinin ne zaman başarısız olmaya başladığını belirleyebilir ve bir sorunun temel nedenini belirlemek için dış hizmetleri incelemeniz gerektiğinde ilgilenilen süreyi daraltabilir.

Docker CLI ile Docker Olaylarının Akışı

Docker docker events CLI komutu, olayları Docker arka plan programınızdan terminal pencerenize aktarır. Ctrl+C klavye kombinasyonuna basarak işlemi sonlandırana kadar olaylar gerçek zamanlı olarak görünecektir.

Komutu bağımsız değişkenler olmadan çalıştırmak, başlangıçta herhangi bir çıktı göstermez. Yalnızca yeni etkinlik görüntülenir, böylece bir olay gerçekleşene kadar çıktı boş kalır. Farklı bir kabukta yeni bir kapsayıcı başlatarak birini kışkırtabilirsiniz:

 $ docker run --rm merhaba-dünya

docker events komutunu çalıştıran terminal penceresinde şimdi birkaç olay görünmelidir:

 2022-05-31T15:20:00.267970018+01:00 resim çekme merhaba-dünya:en son (isim=merhaba-dünya)
2022-05-31T15:20:00.347054862+01:00 kapsayıcı 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse) oluştur
2022-05-31T15:20:00.347805277+01:00 kapsayıcı eki 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.621070053+01:00 konteyner başlangıcı 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
...

Her olay kendi satırında görüntülenir. Önce olay zaman damgası, ardından etkilenen nesnenin türü ( image veya container gibi) ve ardından gerçekleştirilen eylem ( create , attach ve start gibi) görüntülenir. Mesajın geri kalanı, nesne hakkında faydalı meta veriler içerir. Yukarıdaki örnek, hello-world:latest görüntünün çekildiğini ve bundan bir kapsayıcının oluşturulduğunu ortaya koymaktadır.

Çıktıyı Biçimlendirme

Ham olay listesi genellikle hantaldır. Bir Go şablon dizesini kabul eden --format bayrağını kullanarak çıktıyı yeniden biçimlendirebilirsiniz:

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

Bu örneği çalıştırmak şuna benzer bir çıktı üretecektir:

 165406800 çekme resmi merhaba-dünya:en son
1654006800 kapsayıcı oluştur 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 ek kapsayıcı 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 başlangıç ​​kapsayıcı 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

{{ json . }} {{ json . }} şablon dizginiz olarak:

 $ docker olayları --format '{{ json . }}' | jq
{
  "durum": "oluştur",
  "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
  "from": "merhaba dünya",
  "Tip": "konteyner",
  "Eylem": "oluştur",
  "Aktör": {
    "Kimlik": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Öznitellikler": {
      "image": "merhaba dünya",
      "isim": "nifty_morse"
    }
  },
  "kapsam": "yerel",
  "zaman": 165406800,
  "timeNano": 1654006800347054800
}

Burada ham JSON, jq geçiriliyor, bu nedenle terminalinizde oldukça yazdırılıyor. Bu, bilgilerin taranmasını kolaylaştırır.

Özel biçim dizeleri oluştururken, desteklenen yer tutucular için referans olarak JSON çıktısındaki özellikleri kullanabilirsiniz. Çoğu durumda, time gibi her özelliğin ilk harfini büyük harfle yazmanız gerekir, örneğin {{ .Time }} .

Olayları Filtreleme

Meşgul bir Docker arka plan programının olay günlüğü hızla gürültülü olabilir. --filter bayrağıyla olayları belirli bir eyleme, nesneye veya nesne türüne daraltabilirsiniz:

  • docker events --filter type=container – Konteynerlerle ilgili tüm olayları alın.
  • docker events --filter event=create – Kapsayıcı oluşturma olaylarını alın.
  • docker events --filter container=demo-container – Demo demo-container container adlı kapsayıcı için kaydedilen tüm olayları alın (konteynerin kimliğine veya adına başvurabilirsiniz).

container yanı sıra, image , network ve volume gibi desteklenen tüm nesne türü adlarına göre filtre uygulayabilirsiniz.

--filter bayrağını tekrarladığınızda birden çok filtre desteklenir. Farklı filtreler mantıksal AND koşulları olarak yorumlanır; aynı filtrenin birden çok kullanımı OR yan tümceleri olur. Hem app-container hem de api-container kapsayıcıları için create olayını gösteren bir örnek:

 $ liman işçisi olayları \
    --filter kapsayıcı=uygulama kapsayıcı
    --filtre kapsayıcı=api kapsayıcı
    --filter olayı=oluştur

Tarihi Olaylara Erişim

docker events varsayılan olarak yalnızca komut çalıştırıldığından beri depolanan olayları gösterecek şekildedir. --since bayrağını ekleyerek tarihsel olayları dahil edebilirsiniz. Bu, insan tarafından okunabilen bir zaman ifadesini veya mutlak bir zaman damgasını kabul eder:

 $ liman işçisi olayları -- 1 saatten beri
$ liman işçisi olayları --'2021-05-01T16:00:00'dan beri

Belirtilen saatten sonra kaydedilen olaylar anında terminalinizde gösterilecektir. Yeni etkinlikler kaydedildikçe gerçek zamanlı olarak görünmeye devam edecek.

--until bayrağıyla belirli bir zamandan sonra olayları hariç tutabilirsiniz. --since benzer şekilde çalışır. --until kullanılması, yeni etkinliklerin gerçek zamanlı akışını devre dışı bırakır, çünkü bunlar istenen zaman aralığının dışında kalır.

Daemon REST API'sinden Docker Olaylarının Akışı

Depolanan olaylara erişmenin başka bir yolu da Docker arka plan programı REST API'sidir. Docker ana makinenizde API'yi etkinleştirdikten sonra olayları gerçek zamanlı olarak yayınlamak için /events uç noktasını kullanabilirsiniz. Olaylar JSON formatında döndürülecektir:

 $ kıvrılma http://127.0.0.1:2375/v1.41/events
{
  "Tip": "konteyner",
  "Eylem": "oluştur",
  "Aktör": {
    "Kimlik": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Öznitellikler": {
      "image": "merhaba dünya",
      "isim": "nifty_morse"
    }
  },
  "kapsam": "yerel",
  "zaman": 165406800,
  "timeNano": 1654006800347054800
}

API uç noktası, CLI karşılıklarıyla aynı davranışlara sahip olan filter , since ve until parametreleri destekler. Son bir saatte kaydedilen tüm kapsayıcı oluşturma olaylarının nasıl alınacağı aşağıda açıklanmıştır:

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

Olayları Harici Bir Hizmete Gönderme

Docker, olayları harici bir hizmete göndermek için yerleşik bir yoldan yoksundur. Bu, tüm kapsayıcı oluşturmalarınızın mevcut bir izleme veya denetleme platformunda günlüğe kaydedilmesini istiyorsanız yararlı olabilir.

Sürekli olarak docker events çalıştıran bir sistem hizmeti oluşturarak kendi çözümünüzü kurabilirsiniz. Her yeni çıktı satırını harici sisteminize göndermelidir.

Önce ihtiyacınız olan işlevselliği uygulayan bir Bash betiği yazın:

 #!/bin/bash
docker olayları --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | olay okurken
yapmak
    kıvırmak \
        -X YAYINLAMA \
        -H "İçerik Türü: uygulama/json" \
        -d '{"event": "$event"}' \
        https://example.com/events
tamamlamak

Şimdi /etc/systemd/system/docker-events.service adresinde yeni bir systemd hizmet birimi oluşturun:

 [Birim]
Açıklama=Özel Docker Olay İzleme Hizmeti

[Hizmet]
Tip=çatallama
ExecStart=/usr/local/bin/docker-events.sh

[Düzenlemek]
WantedBy=çok kullanıcılı.hedef

Son olarak, hizmetinizi yüklemek için systemd yeniden yükleyin, ardından birimi başlatın ve etkinleştirin:

 $ sudo systemctl arka plan programı yeniden yükle
$ sudo systemctl liman işçisi olaylarını başlat
$ sudo systemctl liman işçisi olaylarını etkinleştir

Hizmetiniz şimdi her yeni etkinliği izleme platformunuza aktaracak. Hizmeti etkinleştirmek, ana makineniz her yeniden başlatıldığında otomatik olarak başlayacak şekilde yapılandırır.

Özet

Docker olayları, arka plan programı ortamınızdaki nesneleri her değiştirdiğinde oluşturulur. Olay günlüğünün akışı, arka plan programı etkinliğini gerçek zamanlı olarak izlemenize olanak tanır. Bu, sorunlarda hata ayıklamanıza, değişiklikleri denetlemenize ve uyumluluğu sağlamanıza yardımcı olabilir.

Olaylar doğrudan Docker sunucusundan alındığından, gelecekte bilgi almanız gerekirse bunlara güvenilmemelidir. Sürekli olarak yalnızca 1.000 giriş tutulur ve olaylara Docker ana makinenizin dosya sistemi aracılığıyla erişemezsiniz. Mekanizma, yakın zamanda gerçekleşen bir etkinlikle ilgili belirli bilgileri aradığınız hızlı geçici görevler için en uygunudur. Uzun süreli saklama için, olayları harici bir havuza göndermek için kendi sistem hizmetinizi kullanmalısınız.