Kalau kamu menjalankan Docker di VPS, ada satu penyebab disk penuh yang sering luput dari perhatian, yaitu log container yang tumbuh tanpa batas. Secara default, Docker di server memakai driver json-file tanpa rotasi, sehingga satu container yang cerewet bisa menulis log berbulan-bulan sampai partisi root kehabisan ruang. Kabar baiknya, masalah ini bisa dicegah dalam hitungan menit dengan rotasi log Docker yang benar. Pada Oktober 2026, Docker Desktop bahkan mengubah default container Linux baru ke driver local agar rotasi otomatis aktif dan pemakaian disk berkurang, menurut catatan rilis Docker Desktop. Di sisi server, Docker Engine masih memakai json-file tanpa batas, jadi VPS kamu tetap perlu disetel manual. Artikel ini memandu kamu langkah demi langkah, mulai dari memeriksa ukuran log sampai memverifikasi rotasi berjalan.
Setiap baris yang ditulis aplikasi ke stdout dan stderr ditangkap Docker dan disimpan di host. Dengan driver json-file, setiap baris dibungkus menjadi objek JSON lengkap dengan teks, stream, dan timestamp, lalu disimpan di /var/lib/docker/containers/<container-id>/<container-id>-json.log. Dokumentasi Docker sendiri menegaskan bahwa max-size pada driver ini defaultnya -1, alias tidak terbatas, dan Docker mempertahankan perilaku tanpa rotasi itu demi kompatibilitas mundur. Akibatnya, log Docker di VPS yang tidak pernah dibatasi akan terus membesar, apalagi untuk aplikasi yang mencatat setiap request, setiap query, atau setiap retry yang gagal.
Pengukuran independen yang diterbitkan DevOps Daily pada Oktober 2026 memberi gambaran yang jelas. Dengan Docker Engine 29.9.0, sebanyak 500.000 baris log atau sekitar 47,9 MB teks murni memakan 83,8 MB dalam format json-file tanpa batas, sementara driver local menyimpan baris yang sama hanya dalam 24,1 MB. Selisih itu penting di VPS kecil, karena disk yang penuh bisa membuat container gagal ditulis, database gagal checkpoint, dan deployment baru gagal ditarik. Karena itu, rotasi log Docker bukan sekadar kerapian, melainkan bagian dari perawatan server yang wajib dijadwalkan.
Sebelum mengubah apa pun, ada satu prinsip yang perlu kamu pegang. Setelan logging baru hanya berlaku untuk container yang dibuat setelah perubahan itu aktif. Container lama tetap memakai setelan lamanya sampai kamu recreate. Jadi, jangan heran bila disk tidak langsung lega sesudah mengubah daemon.json, kamu masih perlu langkah recreate dan bersih-bersih di bagian akhir artikel ini.
Masuk ke Docker VPS kamu lewat SSH, lalu cek driver default yang dipakai daemon dengan perintah berikut.
docker info --format '{{.LoggingDriver}}'
docker info | grep 'Logging Driver'
Di Docker Engine standar, hasilnya biasanya json-file. Selanjutnya, cari container dengan log terbesar. Perintah ini mengurutkan file log dari yang terkecil ke terbesar dan menampilkan sepuluh teratas.
sudo du -h /var/lib/docker/containers/*/*-json.log | sort -h | tail -n 10
Untuk satu container spesifik, kamu bisa memeriksa drivernya dengan docker inspect.
docker inspect -f '{{.HostConfig.LogConfig}}' nama-container
docker logs --tail 50 nama-container
Catat tiga hal dari pemeriksaan ini, yaitu driver yang aktif, ukuran file log terbesar, dan persentase disk yang tersisa dari df -h. Tiga angka ini menjadi patokan sebelum dan sesudah rotasi log Docker diterapkan, sehingga kamu bisa membuktikan sendiri apakah perubahannya berhasil.
Dokumentasi Docker merekomendasikan driver local untuk mencegah kehabisan disk, karena driver ini melakukan rotasi secara default dan memakai format file yang lebih efisien. Secara default, driver local menyimpan 5 file sebesar 20 MB per container, sehingga totalnya dibatasi sekitar 100 MB per container, dan file hasil rotasi dikompresi. Kelebihan lainnya, perintah docker logs tetap berfungsi penuh dengan driver local, jadi kamu tidak kehilangan cara membaca log yang biasa dipakai.
Alternatifnya, kamu bisa tetap memakai json-file asalkan rotasinya diaktifkan secara eksplisit. Pilihan ini masuk akal bila tooling kamu membaca file *-json.log secara langsung, misalnya kolektor log yang men-tail file tersebut. Perlu diingat, pengukuran DevOps Daily menemukan bahwa kolektor berbasis tail file yang disetel untuk format JSON tidak membaca file biner driver local, jadi bila kamu memakai cara itu, tetaplah di json-file berotasi. Untuk sebagian besar VPS mandiri, rekomendasi artikel ini adalah driver local, karena paling hemat disk dan minim perawatan.
Apa pun pilihanmu, dua opsi yang mengatur rotasi log Docker selalu sama, yaitu max-size untuk ukuran maksimum satu file sebelum dirotasi, dan max-file untuk jumlah file yang dipertahankan. Opsi max-file hanya efektif bila max-size juga disetel, dan opsi compress bisa ditambahkan pada json-file agar file hasil rotasi dikompresi. Kombinasi yang aman untuk VPS kecil adalah 10 MB dikali 5 file, atau sekitar 50 MB log per container.
Setelan global ditulis di file /etc/docker/daemon.json. Bila file itu belum ada, buatlah. Bila sudah ada isinya, tambahkan kunci logging tanpa menghapus kunci lain, dan pastikan seluruh isi tetap JSON yang valid.
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
Isi berikut memakai driver local dengan batas 10 MB dan 5 file per container.
{
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": "5"
}
}
Perhatikan bahwa nilai di dalam log-opts pada daemon.json wajib ditulis sebagai string, jadi max-file ditulis "5", bukan angka polos. Setelah menyimpan, validasi JSON-nya sebelum restart, karena JSON yang rusak membuat daemon gagal start.
python3 -m json.tool /etc/docker/daemon.json
sudo systemctl restart docker
docker info --format '{{.LoggingDriver}}'
Restart Docker di Docker VPS akan menghentikan container yang sedang berjalan, jadi lakukan pada jam sepi atau pastikan container kamu memakai restart: unless-stopped di Compose agar kembali hidup sendiri. Setelah restart, perintah docker info harus menampilkan local sebagai driver default yang baru. Ingat, rotasi log Docker global ini hanya berlaku untuk container baru, sehingga langkah recreate di bawah tetap diperlukan.
Setelan global adalah jaring pengaman, tetapi setelan per service memberi kamu kontrol yang lebih halus. Service yang cerewet, misalnya reverse proxy atau worker antrean, bisa diberi batas lebih ketat, sementara service yang lognya penting untuk audit bisa diberi batas lebih longgar. Di Docker Compose, tambahkan blok logging pada tiap service.
services:
web:
image: nginx:latest
logging:
driver: local
options:
max-size: "10m"
max-file: "5"
worker:
image: aplikasi-kamu:latest
logging:
driver: json-file
options:
max-size: "20m"
max-file: "3"
compress: "true"
Contoh di atas menunjukkan dua pola sekaligus. Service web memakai driver local yang hemat, sedangkan worker memakai json-file berotasi dengan kompresi karena tooling pemantau kamu membaca file JSON-nya. Nilai max-size dan max-file di Compose juga ditulis sebagai string. Pola ini adalah inti dari rotasi log Docker di lingkungan Compose, karena setiap service membawa batasnya sendiri dan tidak bergantung sepenuhnya pada default daemon.
Satu catatan penting untuk pengguna Docker Desktop yang membaca artikel ini sebagai pelengkap. Sejak Oktober 2026, container Linux baru di Docker Desktop sudah memakai driver local secara default, tetapi container lama tetap memakai driver lamanya. Di VPS Linux dengan Docker Engine, tidak ada perubahan default seperti itu, jadi kamu tetap harus menyetel daemon.json atau blok logging Compose seperti di atas.
Ini adalah langkah yang paling sering terlewat. Mengubah daemon.json atau file Compose tidak mengubah container yang sudah berjalan. Kamu harus membuatnya ulang agar konfigurasi logging yang baru dipakai.
docker compose up -d --force-recreate
Setelah recreate, verifikasi driver tiap container dengan docker inspect dan pastikan lognya masih bisa dibaca.
docker inspect -f '{{.HostConfig.LogConfig.Type}}' nama-container
docker logs --tail 20 nama-container
Bila container memakai driver yang tidak mendukung pembacaan log, seperti syslog atau none, perintah docker logs tidak akan menampilkan apa pun. Karena itu, jangan memakai driver penerus log eksternal untuk container yang lognya masih kamu baca lewat docker logs, kecuali kamu sudah menyiapkan tempat membaca log yang baru. Untuk Docker VPS mandiri, driver local dan json-file adalah pilihan yang aman karena keduanya mendukung docker logs.
Rotasi hanya membatasi pertumbuhan ke depan, ia tidak mengecilkan file log lama yang sudah telanjur raksasa. Untuk container yang sudah di-recreate, file log lamanya ikut terhapus bersama container lama. Namun bila kamu menemukan file *-json.log yatim atau container yang belum sempat di-recreate, bersihkan dengan truncate, bukan hapus file yang sedang ditulis.
sudo truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log
Jangan menghapus file log container yang sedang berjalan, karena proses Docker masih memegang file descriptor-nya dan ruang disk tidak akan benar-benar bebas sampai container di-restart. Setelah bersih-bersih, cek kembali dengan df -h dan bandingkan dengan angka sebelum perubahan. Pada titik ini, rotasi log Docker kamu sudah bekerja dua arah, yaitu pertumbuhan ke depan dibatasi dan beban lama sudah dibersihkan.
Perlu juga dicatat bahwa Docker Engine 29.9.1 yang dirilis 14 Oktober 2026 membawa perbaikan containerd 2.4.2 untuk tiga isu keamanan, menurut ringkasan rilis Oktober 2026. Menjaga Engine tetap mutakhir adalah pelengkap yang baik untuk perawatan log ini, tetapi jangan mencampur update Engine dengan perubahan logging dalam satu jendela perawatan tanpa snapshot atau cadangan konfigurasi terlebih dahulu.
Verifikasi adalah langkah yang membedakan setelan yang benar-benar jalan dari setelan yang hanya terlihat rapi di file konfigurasi. Jalankan pemeriksaan berikut seminggu setelah perubahan, lalu ulangi tiap bulan.
docker info --format '{{.LoggingDriver}}'
sudo du -sh /var/lib/docker/containers/
df -h /
docker system df
Perintah docker system df menunjukkan pemakaian disk oleh image, container, dan volume, sehingga kamu bisa memastikan bahwa log bukan lagi satu-satunya penyebab disk penuh. Bila satu container masih membengkak melewati batas max-size dikali max-file, periksa apakah container itu dibuat sebelum perubahan dan belum di-recreate, atau apakah blok logging di Compose-nya tertimpa setelan lain. Untuk pemantauan yang lebih proaktif, kamu bisa menambahkan pemeriksaan du di atas ke skrip monitoring harian server kamu, serupa dengan praktik perawatan VPS yang sudah dibahas di artikel Amankan VPS Ubuntu Baru dalam 30 Menit, 8 Langkah Anti Bobol untuk Pemula di situs ini.
Terakhir, atur ekspektasi soal retensi. Rotasi berarti log lama akan terhapus otomatis saat batas tercapai, jadi jangan mengandalkan log container lokal sebagai arsip jangka panjang. Bila kamu butuh audit trail berbulan-bulan, teruskan log ke sistem terpusat seperti syslog atau platform observability, dan biarkan log lokal hanya menjadi buffer jangka pendek. Dengan begitu, disk penuh karena log Docker tidak akan terulang, dan kamu tetap punya riwayat yang bisa dicari saat insiden terjadi.
Kesalahan pertama adalah mengubah daemon.json lalu lupa restart daemon atau lupa recreate container, sehingga tidak ada yang berubah di lapangan. Kesalahan kedua adalah menulis nilai log-opts tanpa tanda kutip di daemon.json, yang membuat JSON tidak valid dan daemon gagal start. Kesalahan ketiga adalah memakai max-file tanpa max-size, yang membuat batas jumlah file tidak berlaku sama sekali. Kesalahan keempat adalah menghapus file log container yang sedang berjalan dan mengira disk sudah bebas, padahal ruang baru benar-benar bebas setelah container di-restart. Terakhir, kesalahan yang paling mahal adalah mengaktifkan rotasi tanpa memikirkan retensi, lalu kehilangan log penting saat debugging insiden. Hindari kelimanya, dan rotasi log Docker kamu akan bekerja persis seperti yang direncanakan.
Ya, file hasil rotasi yang paling lama akan dihapus saat batas tercapai, jadi simpan log penting ke sistem terpusat sebelum batas itu tercapai bila kamu membutuhkannya lama.
Bisa, driver local mendukung docker logs penuh, berbeda dengan driver penerus seperti syslog yang tidak mendukung pembacaan lewat perintah itu.
Tidak, cukup restart service Docker yang dikelola systemd dengan sudo systemctl restart docker, lalu recreate container agar setelan baru berlaku.
Kombinasi 10 MB dikali 5 file, atau sekitar 50 MB per container, adalah titik awal yang aman, dan kamu bisa melonggarkannya untuk service yang lognya penting.
Disk VPS yang penuh karena log adalah masalah yang pelan, diam, dan bisa dicegah. Dengan memeriksa ukuran log saat ini, memilih driver local atau json-file berotasi, menyetel daemon.json dan blok logging Compose, me-recreate container, membersihkan log lama, lalu memverifikasi secara berkala, kamu sudah menutup salah satu penyebab downtime paling konyol di Docker VPS. Terapkan rotasi log Docker hari ini, sebelum notifikasi disk penuh yang berikutnya datang di tengah malam. Sumber data utama artikel ini adalah dokumentasi Docker tentang logging driver dan catatan rilis Docker Desktop Oktober 2026, serta pengukuran DevOps Daily atas Docker Engine 29.9.0 yang diterbitkan Oktober 2026 di DevOps Daily dan dokumentasi resmi Docker di Docker Docs.