Cara Membersihkan Image dan Volume Docker yang Menumpuk
Disk VPS penuh oleh Docker? Cek pemakaian dengan docker system df, lalu bersihkan image, container, build cache, volume, dan log dengan aman.
Jawaban singkat
Mulai dengan docker system df untuk melihat bagian yang paling boros, lalu bersihkan bertahap dengan docker image prune, docker builder prune, dan docker container prune. Volume dibersihkan paling akhir dan hati-hati, dan log container dibatasi lewat daemon.json.
Daftar isi
- Apa yang paling banyak memakan disk?
- Perintah pembersih dan apa yang dihapus
- Urutan membersihkan yang aman
- 1. Hapus container yang sudah berhenti
- 2. Hapus image yang tidak dipakai
- 3. Bersihkan build cache
- 4. Periksa volume satu per satu
- Bagaimana dengan log container yang membengkak?
- Bagaimana mencegah sampah menumpuk lagi?
- Perlukah dijadwalkan otomatis?
- Pertanyaan yang sering diajukan
Cara paling aman membersihkan Docker adalah melihat dulu apa yang memakan disk dengan docker system df, lalu menghapus bertahap: image tak terpakai, build cache, container mati, dan baru terakhir volume. Jangan langsung menjalankan perintah prune paling agresif.
Kenapa ini penting? Docker tidak pernah membuang apa pun secara otomatis. Setiap docker pull versi baru, setiap build, dan setiap container uji coba meninggalkan sisa. Di VPS dengan disk terbatas, sisa ini bisa membuat disk penuh, dan disk penuh bisa membuat database berhenti menulis atau layanan gagal start.
Apa yang paling banyak memakan disk?
Jalankan:
docker system df
Hasilnya memisahkan empat kelompok: Images, Containers, Local Volumes, dan Build Cache, lengkap dengan kolom RECLAIMABLE (bisa dibebaskan). Untuk rincian per item, tambahkan -v:
docker system df -v
Cocokkan dengan pemakaian disk sistem:
df -h
sudo du -sh /var/lib/docker
Kalau angka /var/lib/docker jauh lebih besar dari total di docker system df, kemungkinan besar penyebabnya adalah file log container, yang dibahas di bawah.
Perintah pembersih dan apa yang dihapus
| Perintah | Yang dihapus | Risiko |
|---|---|---|
docker container prune | Container yang sudah berhenti | Rendah, kecuali container berhenti itu masih kamu butuhkan |
docker image prune | Image dangling (tanpa tag) | Rendah |
docker image prune -a | Semua image yang tidak dipakai container mana pun | Sedang, image harus ditarik ulang bila dibutuhkan |
docker builder prune | Build cache | Rendah, build berikutnya lebih lama |
docker volume prune | Volume anonim yang tidak dipakai | Tinggi bila ada data di dalamnya |
docker volume prune -a | Semua volume tidak terpakai, termasuk bernama | Sangat tinggi |
docker system prune | Container berhenti, network tak terpakai, image dangling, build cache | Rendah sampai sedang |
Semua perintah di atas meminta konfirmasi kecuali diberi -f. Baca ringkasan yang ditampilkan sebelum menjawab y.
Urutan membersihkan yang aman
1. Hapus container yang sudah berhenti
docker ps -a --filter status=exited
docker container prune
Periksa daftarnya dulu. Container yang berhenti kadang masih menyimpan data di lapisan tulisnya.
2. Hapus image yang tidak dipakai
docker image prune -a --filter "until=168h"
Filter until=168h hanya menghapus image yang dibuat lebih dari tujuh hari lalu. Image versi sebelumnya yang baru diganti tetap ada sebagai cadangan rollback.
3. Bersihkan build cache
Bila server dipakai untuk docker build, build cache sering menjadi penyumbang terbesar:
docker builder prune
Tambahkan -a untuk menghapus seluruh cache, bukan hanya yang tidak terpakai.
4. Periksa volume satu per satu
docker volume ls -f dangling=true
Daftar ini berisi volume yang tidak terpasang ke container mana pun. Sebelum menghapus, intip isinya:
docker run --rm -v nama-volume:/data alpine ls -la /data
Hapus yang benar-benar tidak dibutuhkan dengan docker volume rm nama-volume. Mengetik nama satu per satu memang lebih lambat, tapi jauh lebih aman daripada prune massal.
Sejak Docker Engine 23.0, docker volume prune tanpa opsi hanya menghapus volume anonim. Volume bernama baru ikut dihapus bila memakai -a. Di versi lama, perilakunya berbeda, jadi cek versimu dengan docker version.
Bagaimana dengan log container yang membengkak?
Driver log bawaan Docker (json-file) menulis log setiap container ke /var/lib/docker/containers/<id>/ tanpa batas ukuran. Aplikasi yang cerewet bisa menghasilkan log berukuran besar dalam beberapa minggu.
Batasi lewat /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Lalu sudo systemctl restart docker. Setelan ini hanya berlaku untuk container yang dibuat setelahnya, jadi buat ulang container lama (misalnya dengan docker compose up -d --force-recreate). Di Compose, batas yang sama juga bisa ditulis per layanan lewat kunci logging.
Jangan menghapus file di dalam /var/lib/docker secara manual. Docker menyimpan metadata yang bisa rusak bila file dihapus di luar perintah resminya.
Bagaimana mencegah sampah menumpuk lagi?
Membersihkan sekali hanya menyelesaikan gejala. Beberapa kebiasaan kecil membuat disk tetap lega:
- Pakai tag versi yang jelas. Image dengan tag tetap lebih mudah dilacak dan dihapus daripada tumpukan image
latestyang kehilangan tag (dangling) setiap kali ditarik ulang. - Gunakan
docker run --rmuntuk container sekali pakai, seperti perintah backup atau uji coba, agar container langsung terhapus saat selesai. - Pisahkan server build dan server produksi bila memungkinkan. Build cache paling banyak tumbuh di mesin yang sering menjalankan
docker build. - Pakai multi-stage build dan image dasar yang ramping supaya ukuran image akhir lebih kecil.
- Pantau disk dengan peringatan sederhana, misalnya skrip yang mengirim notifikasi bila pemakaian
dfmelewati 80%.
Perlukah dijadwalkan otomatis?
Untuk image dan build cache, ya. Contoh baris cron mingguan yang konservatif:
0 3 * * 0 docker image prune -af --filter "until=168h" && docker builder prune -f --filter "until=168h"
Volume sebaiknya tidak dimasukkan ke jadwal otomatis. Biarkan keputusan menghapus data tetap di tanganmu. Saat memperbarui container, ikuti juga urutan di update container Docker tanpa kehilangan data supaya tidak ada volume penting yang terlepas dari container-nya.
Kalau setelah dibersihkan disk tetap cepat penuh, mungkin memang ukuran disknya sudah tidak sesuai beban. Pertimbangannya ada di memilih spesifikasi VPS, dan kebiasaan lain yang memicu masalah serupa dibahas di kesalahan umum Docker di produksi.
Pertanyaan yang sering diajukan
Apakah docker system prune menghapus volume?
Tidak, kecuali kamu menambahkan opsi --volumes. Tanpa opsi itu, volume tetap aman.
Kenapa disk tidak berkurang setelah menghapus image?
Lapisan image bisa dipakai bersama oleh beberapa image atau container yang masih ada. Cek ulang dengan docker system df -v, dan periksa juga ukuran file log container.
Apakah aman menjalankan prune saat container sedang berjalan?
Ya. Prune tidak menyentuh container yang berjalan maupun image dan volume yang dipakainya.


