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.