Docker log rotasyonunu bir Docker log sürücüsüyle yapılandırma: Docker journald loglama ve Docker local dosya sürücüsü
Seviye: Uzman
Tahmini süre: ~20 dakika
Amaç: Kesintisiz günlük yönetimi sağlamak ve disk alanının tükenmesini önlemek için Docker günlük rotasyonunu yapılandırmak.
Giriş
Yönetilmeyen Docker günlükleri sunucu depolama alanını hızla tüketebilir. Varsayılan olarak Docker arka plan programı (daemon), günlükleri boyut sınırı olmadan json-file biçiminde yazar. Güvenilir bir altyapıyı sürdürmek için ölçeklenebilir bir Docker günlük sürücüsü (logging driver) kullanarak Docker günlük rotasyonunu yapılandırmanız gerekir. Bu kılavuz, Docker günlük rotasyonunu Docker journald günlük kaydı veya Docker yerel dosya sürücüsü (local) ile genel (global) olarak nasıl uygulayacağınızı anlatır. Doğru yapılandırmayı seçmek, verimli günlük yönetimi ve sistem kararlılığı sağlar.
Terminoloji
Devam etmeden önce aşağıdaki temel kavramlara aşina olun:
- Docker: Uygulamaları konteyner adı verilen yalıtılmış ortamlarda çalıştırmaya yarayan platform.
- Docker günlükleri: Bir konteynerin Stdout (standart çıktı) ve Stderr (standart hata) akışlarından yakalanan çıktı akışları.
- Günlük rotasyonu: Yer açmak için eski günlüklerin arşivlenmesi ve silinmesi uygulaması.
- Günlük sürücüsü (logging driver): Docker'ın günlükleri yakalamak, biçimlendirmek ve yönlendirmek için kullandığı mekanizma.
- Journald: systemd'nin günlük kaydı hizmeti; merkezi ana bilgisayar günlüğü için idealdir.
- Yerel dosya sürücüsü (local): Yerel depolama için optimize edilmiş, yüksek performanslı, yerleşik sürücü.
- Json-file: Günlükleri JSON biçiminde yazan varsayılan sürücü.
- Docker arka plan programı (daemon): Docker işlemlerini yöneten arka plan hizmeti.
- Daemon.json: Arka plan programının yapılandırma dosyası.
- Günlük sürücüsü yapılandırması: Genel veya konteyner bazlı günlük kaydı ayarı.
- Günlük seçenekleri: Sürücüye aktarılan belirli parametreler.
- Max-size: Bir günlük dosyasının döndürüleceği eşik boyutu.
- Max-file: Saklanan döndürülmüş dosyaların azami sayısı.
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
- İşletim sistemi: Ubuntu 22.04 / 24.04 LTS, Debian 12 / 13, RHEL 9 / 10, AlmaLinux 9 / 10, Rocky Linux 9 / 10
- Docker: 24.x veya üzeri sürüm yüklü
- Erişim: sudo yetkileri
- Gerekli bilgi: Linux yönetimi ve Infrastructure as Code kavramları
Adım 1: Docker json-file ve local sürücü farklarını anlamak
Docker json-file ve local sürücülerini değerlendirirken seçimi performans ve ek yük belirler. Varsayılan json-file sürücüsü basittir, ancak JSON biçimlendirmesi nedeniyle daha fazla CPU ve disk alanı tüketir. Buna karşılık local dosya sürücüsü, özellikle rotasyon verimliliği için optimize edilmiş, yalnızca ekleme yapan (append-only) ikili bir biçim kullanır. Normal üretim iş yüklerinde Docker yerel dosya sürücüsü (local), disk ek yükünü azaltır ve rotasyonu yerel olarak güvenilir biçimde uygular.
Mevcut sürücünüzü kontrol etmek için şunu çalıştırın:
docker info --format '{{.LoggingDriver}}'
Beklenen çıktı:
json-file
json-file görüyorsanız daemon.json içindeki Docker günlük yapılandırmasını değiştirmeye geçin.
Adım 2: Docker yerel dosya sürücüsü (local) ile Docker günlük rotasyonunu yapılandırın
Tüm konteynerlere genel sınırlar uygulamak için /etc/docker/daemon.json dosyasını düzenleyeceksiniz. daemon.json içinde Docker günlük yapılandırması için önerilen yaklaşım budur.
Yapılandırma dosyasını açın:
Sisteminizde /etc/docker/daemon.json yoksa, nano kaydederken dosyayı oluşturur. Bu normaldir - dosya bulunmadığında Docker yerleşik varsayılanları kullanır.
sudo nano /etc/docker/daemon.json
Aşağıdaki günlük sürücüsü yapılandırmasını ekleyin:
{ "log-driver": "local", "log-opts": { "max-size": "50m", "max-file": "3" } }
Dosyayı kaydedip kapatın. Yeni ayarlar diske yazılır. Bu yapılandırma sürücüyü genel olarak uygular. Günlük seçenekleri, Docker'a günlükler 50 megabayta ulaştığında döndürmesini (Docker günlükleri için max-size) ve en fazla 3 dosya saklamasını (Docker günlükleri için max-file) söyler. local sürücüsünün, journald'ın aksine, bu açık boyut ve dosya sınırlarını hâlâ yerel olarak desteklediğini unutmayın.
Değişiklikleri uygulamak için Docker arka plan programını yeniden başlatın. docker.service konteynerleri yönetir, bu nedenle yeniden başlatılması sınırları devreye alır:
sudo systemctl restart docker
Arka plan programıyla bağlantınız birkaç saniye kesilecektir. Yeniden başlatıldıktan sonra yeni oluşturulan tüm konteynerler Docker yerel dosya sürücüsünü (local) kullanacak ve Docker günlükleri için bu max-size ve max-file sınırlarını devralacaktır.
Günlük sürücüsü konteyner bazında değiştirilemezdir. Mevcut konteynerler eski günlük sürücülerini korur; docker update bunu değiştiremez. Yeni Docker günlük sürücüsünü uygulamak için konteynerin yeniden oluşturulması gerekir (örn. docker compose up -d veya orkestrasyon üzerinden yeniden dağıtım), çünkü canlı geçiş (live migration) yoktur. Aksi takdirde ana bilgisayarınızda karışık günlük durumları oluşur.
Ayrıca günlük yapılandırmalarının öncelik sırasını bilin:
- CLI bayrakları (
docker run --log-driver) her şeyin önüne geçer. docker-compose.ymliçindeki günlük geçersiz kılmaları, konteyner oluşturulurken servis bazında çalışır.daemon.json, açıkça belirtilmemiş tüm konteynerler için varsayılan genel yedek değer olarak işlev görür.
Adım 3: Docker günlük sürücünüz olarak Docker journald günlük kaydını etkinleştirin
Alternatif olarak günlükleri doğrudan sistemin journald arka plan programına yönlendirebilirsiniz. Docker journald günlük kaydı, systemctl ve harici günlük iletici araçlarla sorunsuz bütünleşir.
Yapılandırma dosyasını açın:
sudo nano /etc/docker/daemon.json
İçeriği journald yapılandırmasıyla değiştirin. Dosya içeriğini tamamen değiştirin - önceki tüm log-opts girdilerini kaldırın, çünkü journald, max-size veya max-file seçeneklerini desteklemez:
{ "log-driver": "journald" }
Dosyayı kaydedip kapatın. Yapılandırma güncellendi.
Hizmeti yeniden başlatın. Günlük yönetimini journald'a kaydırmak için docker.service yeniden yüklenmelidir:
sudo systemctl restart docker
Docker günlüklerini journald ile kullandığınızda, journald sürücüsü Docker tarafındaki rotasyon denetimini ortadan kaldırır. Günlük rotasyonu hâlâ vardır, ancak tamamen Docker dışında, systemd günlüğü (journal) tarafından yürütülür. Günlüklerin doğrudan systemd günlüğüne yönlendirildiğini görürsünüz. Bu günlükler docker.service birimine bağlı olmak yerine konteyner meta veri alanlarıyla dizinlenir.
Operasyonel olarak journald bu günlükleri /etc/systemd/journald.conf dosyasında yapılandırılan somut sınırlarla yönetir; özellikle SystemMaxUse, RuntimeMaxUse ve MaxRetentionSec. Bu, önemli bir etki alanı (blast radius) riski taşır: journald'ın tükenmesi, üretimde ssh günlüklerini, çekirdek günlüklerini, denetim günlüklerini ve günlüğü paylaşan diğer tüm hizmetleri etkileyebilir. max-size ve max-file seçeneklerinin yalnızca json-file ve local sürücüleri için geçerli olduğunu, journald için geçerli olmadığını unutmayın.
journald yapılandırmasındaki değişiklikleri uygulamak için:
sudo systemctl restart systemd-journald # Or to trigger immediate rotation without a full restart: sudo systemctl kill -s SIGUSR2 systemd-journald
Günlüklerin doğrudan sistem günlüğünden (journal) toplandığı ortamlara dağıtım yaparken Docker günlüklerini journald ile kullanın.
Adım 4: journalctl çıktısını yönetme
journald üzerinden Docker günlük rotasyonunu yapılandırdığınızda, günlüklerle docker logs yerine journalctl kullanarak çalışırsınız. journald hizmeti bu günlükleri merkezi olarak işler.
Belirli bir konteynerin günlüklerini Docker journald günlükleri ile görüntülemek için şunu çalıştırın:
journalctl CONTAINER_NAME=<YOUR_CONTAINER_NAME> -o cat
Ad yerine kimliğe (ID) göre filtrelemeyi tercih ediyorsanız, tam kimlik için CONTAINER_ID_FULL=$(docker inspect -f '{{.Id}}' <YOUR_CONTAINER_NAME>) kullanın veya CONTAINER_ID içinde saklanan kısa biçimle eşleşmesi için kimliği cut -c1-12 üzerinden geçirin. _CONTAINER_ID alanı systemd-cgroup'a aittir ve Docker konteyner kimliğine karşılık gelmez.
Beklenen çıktı:
Application started successfully
Adım 5: Doğrulama
Çalışan bir konteynerde Docker günlük sürücüsü yapılandırmasını doğrulamak için bir test konteyneri başlatın:
docker run -d --name log-test nginx:latest
Konteynerin günlük seçeneklerini inceleyin:
docker inspect -f '{{.HostConfig.LogConfig.Type}}' log-test
local sürücüsü için beklenen çıktı:
local
journald yapılandırdıysanız çıktı bunun yerine journald olacaktır.
local sürücüsü için uygulanan parametreleri kontrol edin:
docker inspect -f '{{.HostConfig.LogConfig.Config}}' log-test
Beklenen çıktı:
map[max-file:3 max-size:50m]
Bu, daemon.json içindeki Docker günlük yapılandırmanızın Docker günlükleri için max-size ve max-file parametrelerini başarıyla uyguladığını doğrular. journald'ın burada max-size veya max-file seçeneklerini göstermediğini unutmayın, çünkü rotasyon işletim sistemine bırakılmıştır.
Hâlâ önceki sürücüyü kullanan mevcut konteynerleri belirlemek için bu komutu kullanın. Günlük sürücüsü konteyner oluşturulurken sabitlenir - bu konteynerlerin yeni yapılandırmayı devralması için yeniden oluşturulması gerekir (örn. docker compose up -d --force-recreate):
docker ps -aq | xargs -r docker inspect -f '{{.Name}}: {{.HostConfig.LogConfig.Type}}'
Değişiklikleri geri alma
Genel günlük sürücüsü yapılandırmasını varsayılan biçime döndürmek için yapılandırmayı daemon.json dosyasından kaldırın.
Dosyayı kaldırın (değiştirmeden önce yapılandırma dosyalarını her zaman yedekleyin) ve Docker hizmetini yeniden başlatın:
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak.$(date +%F) sudo rm /etc/docker/daemon.json sudo systemctl restart docker
Bu değişiklikleri geri almak, yeni oluşturulan tüm konteynerler için sınırları hemen kaldırır; bunlar yüksek hacimde günlük üretirse disk alanının tükenmesi riski doğar.
/etc/docker/daemon.json ilgisiz arka plan programı ayarları içeriyorsa (kayıt defteri yansıtmaları, depolama sürücüsü, DNS, MTU, insecure-registries vb.), dosyayı kaldırmak bunları da siler. Ya önce dosyayı yedekleyin (yukarıda gösterildiği gibi) ya da yalnızca log-driver ve log-opts bölümlerini kaldırmak için dosyayı elle düzenleyin.
Sorun giderme
journalctl,CONTAINER_IDiçin çıktı döndürmüyor: DockerjournaldsürücüsüCONTAINER_IDalanına 12 karakterlik kısa kimliği yazarkendocker inspect64 karakterlik tam kimliği döndürür. Bunun yerineCONTAINER_NAMEveyaCONTAINER_ID_FULLkullanın.- Mevcut konteynerler yeniden başlatmadan sonra hâlâ
json-filekullanıyor:docker updatekomutu günlük sürücüsünü değiştirmez. Yeni günlük sürücüsünü uygulamak için konteyneri yeniden oluşturmanız gerekir (örn.docker compose downve ardındanupile). max-sizevemax-file,journaldile etkisiz:journaldiçin günlük rotasyonu Docker'ınlog-optsayarlarıyla değil,/etc/systemd/journald.conf(örn.SystemMaxUse) üzerinden genel olarak yönetilir.
Sonuç
Konteyner çıktısını doğru yönetmek, güvenilir bir altyapının temel parçasıdır. Docker json-file ve local sürücüleri arasında doğru seçim yaparak depolama sorunlarını önlersiniz. Docker günlük rotasyonunu hafif Docker yerel dosya sürücüsü (local) ile yapılandırın ya da Docker journald günlük kaydı ile yerel olarak bütünleştirin, ortamınız artık büyük günlük akışlarını güvenle işlemeye hazırdır. Bu Docker günlük rotasyonu uygulamaları, Docker günlük sürücüsü yapılandırmanızın kararlı, ana bilgisayar kaynaklarınızın ise öngörülebilir kalmasını sağlar.
Doküman Sürümü: 1.0
Son Güncelleme: Mayıs 2026
Sorumlu: Teknik Dokümantasyon Ekibi