Rotasi Log Docker: Cegah Disk Homelab Penuh
Log container adalah salah satu penyebab disk server penuh yang tidak terlihat sampai dampaknya terasa. Aplikasi tetap berjalan, tetapi Docker menyimpan keluaran standar dan pesan error ke file log di host. Jika sebuah service terus menulis pesan berulang, ukuran file dapat tumbuh selama berminggu-minggu tanpa batas. Pada server dengan SSD kecil, gejalanya bisa muncul sebagai kegagalan database, update yang tidak selesai, atau container yang tidak bisa menulis data.
Solusinya bukan menghapus log secara manual setiap kali disk hampir habis. Atur driver logging dengan batas ukuran dan jumlah file, lalu verifikasi bahwa konfigurasi benar-benar diterapkan. Panduan ini menggunakan driver bawaan Docker json-file, yang umum dipakai dan mendukung rotasi.
Kenali lokasi dan ukuran log
Docker biasanya menyimpan log container di bawah direktori data root, sering kali /var/lib/docker/containers/. Setiap container memiliki direktori sendiri dan file *-json.log. Hindari mengedit atau menghapus file tersebut langsung ketika Docker sedang berjalan. Docker mengelola berkas itu sendiri; perubahan manual dapat membuat perilaku logging tidak konsisten.
Untuk melihat penggunaan disk secara umum, jalankan:
df -h
sudo du -h -d 1 /var/lib/docker/containers 2>/dev/null | sort -h
Perintah kedua hanya untuk diagnosis. Jika tidak memiliki izin sudo, gunakan docker info untuk melihat lokasi data root dan periksa metrik disk melalui alat monitoring yang sudah tersedia. Tidak perlu membagikan keluaran yang mungkin berisi nama container privat ke publik.
Lihat container yang berjalan dan ukurannya:
docker ps --size
Ukuran yang ditampilkan di sini berfokus pada lapisan writable container dan bukan ukuran seluruh file log. Karena itu, docker ps --size bukan pengganti pemeriksaan direktori log atau pemantauan kapasitas filesystem.
Tetapkan batas global pada Docker daemon
Konfigurasi global cocok untuk host yang seluruh container-nya dikelola oleh administrator yang sama. Edit /etc/docker/daemon.json dan atur opsi logging berikut:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
max-size membatasi ukuran satu berkas log sebelum Docker memutar berkas tersebut. max-file menentukan jumlah berkas yang dipertahankan, termasuk berkas aktif. Dengan nilai ini, setiap container dibatasi sekitar 30 MB untuk log, walau kebutuhan sebenarnya bergantung pada beban dan detail implementasi.
Nilai dalam log-opts harus berupa string, sehingga gunakan tanda kutip untuk angka dan satuan. File JSON juga harus valid. Jika daemon.json sudah berisi konfigurasi lain, gabungkan properti dengan hati-hati; jangan menimpa pengaturan registry, runtime, atau alamat daemon yang sudah digunakan.
Validasi sintaks sebelum menerapkan:
python3 -m json.tool /etc/docker/daemon.json
Penerapan konfigurasi daemon biasanya memerlukan restart Docker. Restart dapat mengganggu workload, terutama jika container tidak memakai kebijakan restart yang sesuai. Jadwalkan saat aman dan pastikan akses konsol atau SSH tetap tersedia. Pada instalasi yang mendukungnya, beberapa perubahan dapat memengaruhi container baru saja; jangan mengasumsikan container lama otomatis memakai nilai baru. Periksa dokumentasi versi Docker yang berjalan dan lakukan uji terkontrol.
Sesudah restart, cek nilai default:
docker info --format '{{.LoggingDriver}}'
Informasi daemon ini menunjukkan driver default host, bukan bukti bahwa setiap container yang telah dibuat memakai pilihan yang sama. Periksa konfigurasi masing-masing container juga.
Atur secara eksplisit pada Compose
Untuk stack yang dikelola dengan Docker Compose, pengaturan per-service membuat maksud konfigurasi terlihat di repository dan mengurangi kejutan saat dipindahkan ke host lain. Tambahkan blok logging pada service:
services:
app:
image: example/app:latest
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
Terapkan perubahan dengan membuat ulang container yang relevan:
docker compose up -d --force-recreate app
Nama app adalah contoh; gunakan nama service di file Compose Anda. Gunakan docker compose config terlebih dahulu untuk memvalidasi hasil gabungan file Compose dan variabel lingkungan:
docker compose config
Jika Anda mengelola banyak service, pengaturan dapat diulang pada setiap service yang membutuhkan batas. Compose tidak menjamin semua service mewarisi konfigurasi logging dari satu blok global arbitrer. Gunakan YAML anchor jika tim memahami pola tersebut, tetapi konfigurasi eksplisit sering lebih mudah diaudit.
Perlu diketahui, opsi default daemon biasanya berlaku ketika container dibuat. Container yang sudah ada dapat tetap membawa konfigurasi lama sampai dibuat ulang. Karena itu, setelah mengubah daemon, inventarisasi container penting dan jadwalkan recreate bertahap. Jangan melakukan recreate seluruh stack secara membabi buta pada host produksi.
Verifikasi konfigurasi container
Periksa driver dan opsi aktual container:
docker inspect -f '{{.HostConfig.LogConfig.Type}} {{json .HostConfig.LogConfig.Config}}' nama-container
Ganti nama-container dengan nama sebenarnya. Keluaran yang diharapkan mencantumkan json-file serta max-size dan max-file. Untuk memeriksa semua container, jalankan inspeksi dalam loop, tetapi hindari menaruh keluaran sensitif ke log publik.
Setelah konfigurasi berjalan, amati ukuran direktori log pada beberapa interval. Pastikan ukuran tidak terus meningkat tanpa batas. Rotasi tidak mengurangi penggunaan disk yang sudah terakumulasi sebelum batas diberlakukan; Docker akan mengelola berkas sesuai siklus rotasi berikutnya. Jangan menghapus file aktif secara manual sebagai jalan pintas.
Pilih batas yang masuk akal
Batas 10 MB dengan tiga file adalah titik awal, bukan angka universal. Service yang jarang berbicara mungkin cukup dengan total beberapa megabyte. Service yang memproses banyak permintaan dapat memutar log lebih cepat dan membuat riwayat singkat. Jika investigasi insiden memerlukan jejak lebih panjang, kirim log ke sistem terpusat seperti Loki atau OpenSearch dengan retensi yang direncanakan, bukan memperbesar file tanpa batas di disk root.
Pertimbangkan kapasitas host, jumlah container, dan pola pesan. Misalnya, 20 container dengan batas sekitar 30 MB masing-masing berarti potensi ratusan megabyte untuk log. Sisakan ruang ekstra untuk database, image baru saat update, file sementara, serta operasi filesystem. Pemantauan disk sebaiknya memberi peringatan sebelum mencapai kondisi kritis, bukan ketika filesystem sudah 100 persen.
Masalah umum
Jika opsi tidak terlihat di docker inspect, kemungkinan container belum dibuat ulang atau blok YAML berada pada tingkat indentasi yang salah. Jalankan docker compose config, lalu recreate service yang sesuai.
Jika Docker gagal dimulai setelah mengedit daemon.json, validasi JSON dan periksa log service:
sudo journalctl -u docker --since "10 minutes ago" --no-pager
Pulihkan perubahan terakhir jika perlu agar daemon kembali tersedia. Jangan membuang konfigurasi lain hanya demi memperbaiki sintaks.
Jika file log tetap membesar, pastikan service benar-benar menggunakan json-file. Driver seperti journald memiliki kebijakan retensi yang diatur melalui journald, bukan opsi rotasi json-file. Periksa juga apakah aplikasi menulis log langsung ke bind mount; Docker tidak mengatur file yang ditulis aplikasi ke volume tersebut.
Checklist pemeliharaan
- Tetapkan
max-sizedanmax-filepada daemon atau tiap service Compose. - Validasi JSON dan Compose sebelum menerapkan.
- Buat ulang container yang perlu menerima konfigurasi baru.
- Verifikasi melalui
docker inspect, bukan hanya isi file konfigurasi. - Pantau ruang disk dan tren pertumbuhan log.
- Untuk pencarian jangka panjang, gunakan sistem log terpusat dengan retensi.
Rotasi log adalah pengaman sederhana yang mencegah satu service menghabiskan disk host. Tetapkan batas, uji pada satu container, dan pastikan retensi log sejalan dengan kebutuhan troubleshooting.