Membersihkan Docker Images yang Sudah Tidak Terpakai Agar Disk Server Tetap Lega

·

Salah satu hal yang sering tidak disadari ketika menggunakan Docker dalam jangka waktu lama adalah ukuran penyimpanan yang terus bertambah.

Setiap kali melakukan build ataupun upgrade aplikasi, Docker biasanya menyimpan image lama sebagai cache atau referensi rollback. Lama-kelamaan image tersebut akan memenuhi storage server meskipun sudah tidak digunakan lagi oleh container mana pun.

Artikel ini merupakan catatan pribadi mengenai cara membersihkan Docker image yang sudah tidak dipakai dengan aman.

Mengapa Image Lama Tidak Langsung Dihapus?

Docker sengaja menyimpan image lama karena beberapa alasan:

  • mempercepat proses build berikutnya,
  • memungkinkan rollback,
  • menghindari download ulang image yang sama.

Akibatnya, setelah beberapa bulan penggunaan, jumlah image bisa menjadi sangat banyak.

Cek terlebih dahulu daftar image:

docker images

Contoh:

REPOSITORY        TAG       IMAGE ID       SIZE
nginx             latest    a12bc34d       195MB
postgres          16        b23cd45e       450MB
redis             latest    c34de56f       130MB
my-app            latest    d45ef67g       600MB
<none>            <none>    e56fg78h       600MB

Image dengan tag <none> biasanya merupakan image yang sudah tidak memiliki referensi (dangling image).


Menghapus Dangling Images

Cara paling aman adalah menghapus dangling images terlebih dahulu.

docker image prune

Docker akan meminta konfirmasi.

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

Tekan:

y

Perintah ini hanya menghapus image yang benar-benar tidak memiliki tag lagi.

Container yang sedang berjalan tidak akan terganggu.

Ini merupakan perintah yang paling sering saya gunakan setelah beberapa kali build aplikasi.


Menghapus Semua Image yang Tidak Dipakai Container

Jika ingin membersihkan lebih agresif, gunakan:

docker image prune -a

atau

docker image prune --all

Berbeda dengan perintah sebelumnya, opsi -a akan menghapus seluruh image yang tidak sedang digunakan oleh container mana pun, termasuk image yang masih memiliki tag tetapi sudah tidak dipakai.

Perintah ini cukup efektif untuk menghemat storage setelah beberapa kali upgrade aplikasi.


Melihat Penggunaan Disk Docker

Sebelum menghapus image, saya biasanya melihat terlebih dahulu penggunaan storage Docker.

docker system df

Contoh output:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          15        4         8.4GB     5.9GB (70%)
Containers      8         2         450MB     200MB
Volumes         6         3         4.2GB     0B
Build Cache     32        0         1.7GB     1.7GB

Penjelasan kolom:

  • TOTAL menunjukkan jumlah resource.
  • ACTIVE adalah resource yang masih digunakan.
  • SIZE merupakan total ukuran.
  • RECLAIMABLE menunjukkan ruang yang dapat dibebaskan.

Dari output tersebut kita bisa mengetahui apakah image memang menjadi penyebab storage penuh atau justru volume maupun build cache.

Perintah ini sangat berguna sebelum dan sesudah melakukan proses cleanup.


Menghapus Image Tertentu

Apabila hanya ingin menghapus image tertentu, tampilkan daftar image terlebih dahulu.

docker images

Misalnya:

REPOSITORY     TAG      IMAGE ID
nginx          latest   9f8ab1234abc
redis          latest   8c7de4567def

Kemudian hapus menggunakan IMAGE ID.

docker rmi 9f8ab1234abc

Atau menggunakan nama image.

docker rmi nginx:latest

Jika image masih digunakan oleh sebuah container, Docker akan menolak proses penghapusan dengan pesan serupa berikut.

Error response from daemon:
conflict: unable to remove repository reference

Hal ini merupakan mekanisme perlindungan agar container yang masih aktif tidak kehilangan image yang menjadi dasarnya.


Tips Maintenance Berkala

Agar storage server tetap terkendali, saya biasanya melakukan langkah berikut setelah selesai melakukan upgrade aplikasi:

docker compose pull

docker compose up -d

docker system df

docker image prune -a

Dengan workflow tersebut saya bisa:

  • memastikan aplikasi menggunakan image terbaru,
  • melihat berapa banyak storage yang dapat dibebaskan,
  • menghapus image lama yang sudah tidak digunakan,
  • menjaga kapasitas disk tetap lega tanpa mengganggu container yang sedang berjalan.

Penutup

Docker memang dirancang agar image lama tetap tersimpan untuk berbagai kebutuhan seperti cache dan rollback. Namun apabila server digunakan dalam jangka panjang, image yang menumpuk dapat menghabiskan storage tanpa disadari.

Perintah docker image prune cocok digunakan untuk membersihkan dangling image dengan aman, sedangkan docker image prune -a lebih tepat ketika ingin membersihkan seluruh image yang sudah tidak digunakan oleh container.

Sebelum melakukan penghapusan, saya juga membiasakan mengecek penggunaan storage menggunakan docker system df, dan jika hanya ingin membersihkan image tertentu, docker rmi menjadi pilihan yang paling tepat.