Docker ile çalışırken bir süre sonra fark ediyorsunuz: sunucunuzun RAM'i anormal şekilde tükeniyor veya disk alanı daralıyor. Çoğu zaman suçlu, kontrolsüz büyüyen konteyner loglarıdır. Özellikle varsayılan ayarlarla çalışan Docker, konteyner çıktılarını sınırsız bir şekilde depolayarak hem diskinizi hem de belleğinizi şişirebilir. Neyse ki Docker, log rotation ayarları ile bu sorunu kökten çözmenizi sağlıyor. Gelin, adım adım inceleyelim.
Neden Loglar RAM'i Dolduruyor?
Docker'ın varsayılan log sürücüsü json-file'dır. Bu sürücü, her konteynerin stdout/stderr çıktısını JSON formatında bir dosyaya yazar. Eğer log rotation ayarı yapılmamışsa, bu dosya sürekli büyür. Peki RAM ile ne ilgisi var? İki senaryo var:
- Docker'ın logları bellekte tutması: Docker, log dosyasını okurken veya yazarken belirli bir miktar RAM kullanır. Loglar büyüdükçe bu kullanım artar, özellikle de journald gibi bir sistem loglayıcı kullanıyorsanız.
- Log dosyasının diski doldurması: Disk %100 dolduğunda, işletim sistemi yavaşlar ve RAM'i de etkileyebilir. Ayrıca, logların tmpfs gibi RAM tabanlı bir dosya sisteminde saklanması durumunda doğrudan RAM tüketimi olur.
Asıl sorun, çoğu Docker kurulumunda log rotation'ın varsayılan olarak devre dışı olması. Yani log dosyanız gigabaytlara ulaşabilir.
Docker Log Yapılandırması Nasıl Çalışır?
Docker'ın log yönetimi iki seviyede yapılır: daemon seviyesi (tüm konteynerler için genel ayar) ve konteyner seviyesi (bireysel konteyner için). Ayarları /etc/docker/daemon.json dosyasından veya docker run komutu ile --log-opt parametrelerinden yapabilirsiniz. En kritik iki parametre:
- max-size: Bir log dosyasının maksimum boyutu (örneğin 10m).
- max-file: Tutulacak maksimum log dosyası sayısı (örneğin 3).
Bu iki parametre ile log dosyası belirtilen boyuta ulaştığında otomatik olarak döndürülür (rotate) ve eski dosyalar sıkıştırılarak veya silinerek saklanır.
Log Rotation Ayarı: Adım Adım
İşlem basit. Önce daemon.json dosyasını düzenleyelim:
- Sunucunuza SSH ile bağlanın.
- /etc/docker/daemon.json dosyasını açın (yoksa oluşturun).
- Aşağıdaki ayarları ekleyin: { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
- Docker servisini yeniden başlatın: sudo systemctl restart docker.
Not: Mevcut konteynerler bu değişiklikten etkilenmez. Yeni konteynerler için geçerli olur. Mevcut konteynerlerin log rotation'ı için konteyneri yeniden oluşturmanız gerekir.
Tek bir konteyner için ayar yapacaksanız:
docker run --log-opt max-size=10m --log-opt max-file=3 nginxBu kadar. Artık loglarınız 10 MB'ı geçtiğinde otomatik olarak döndürülecek ve en fazla 3 dosya saklanacak.
Örnek Yapılandırma
Diyelimki yoğun log üreten bir uygulamanız var. Aşağıdaki ayar, logları 5 MB'da döndürüp sıkıştırarak 5 dosya tutar:
{ "log-driver": "json-file", "log-opts": { "max-size": "5m", "max-file": "5", "compress": "true" } }compress seçeneği eski log dosyalarını gzip ile sıkıştırarak disk alanından tasarruf sağlar.
Ek İpuçları
- Log sürücüsünü değiştirmek: local sürücüsü daha az kaynak tüketir ve otomatik rotation içerir. Denemeye değer.
- Log seviyesini ayarlayın: Uygulamanızda gereksiz DEBUG loglarını kapatarak çıktı miktarını azaltabilirsiniz.
- İzleme ve uyarı: Log dosya boyutlarını izleyin. Prometheus ve Grafana ile Docker log boyutlarını takip edebilirsiniz.
Unutmayın, doğru log rotation ayarları yapılmazsa, bir gün sunucunuzun disk veya RAM kaynaklı bir çökme yaşaması işten bile değildir. Bu basit ayarlarla hem kaynak kullanımını optimize eder hem de sisteminizin rahat nefes almasını sağlarsınız.