Docker Kurulumunuzun Olay Geçmişini Nasıl Görüntüleyebilirsiniz?
Yayınlanan: 2022-08-11Docker 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
– Demodemo-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.