Lewati ke isi

Server & Infrastruktur

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.

Terbit 5 menit baca

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
  1. Apa yang paling banyak memakan disk?
  2. Perintah pembersih dan apa yang dihapus
  3. Urutan membersihkan yang aman
  4. 1. Hapus container yang sudah berhenti
  5. 2. Hapus image yang tidak dipakai
  6. 3. Bersihkan build cache
  7. 4. Periksa volume satu per satu
  8. Bagaimana dengan log container yang membengkak?
  9. Bagaimana mencegah sampah menumpuk lagi?
  10. Perlukah dijadwalkan otomatis?
  11. 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

PerintahYang dihapusRisiko
docker container pruneContainer yang sudah berhentiRendah, kecuali container berhenti itu masih kamu butuhkan
docker image pruneImage dangling (tanpa tag)Rendah
docker image prune -aSemua image yang tidak dipakai container mana punSedang, image harus ditarik ulang bila dibutuhkan
docker builder pruneBuild cacheRendah, build berikutnya lebih lama
docker volume pruneVolume anonim yang tidak dipakaiTinggi bila ada data di dalamnya
docker volume prune -aSemua volume tidak terpakai, termasuk bernamaSangat tinggi
docker system pruneContainer berhenti, network tak terpakai, image dangling, build cacheRendah 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 latest yang kehilangan tag (dangling) setiap kali ditarik ulang.
  • Gunakan docker run --rm untuk 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 df melewati 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.

Sumber & referensi

Baca juga