Docker’ı bir süre kullandıktan sonra disk dolmaya başlar: eski imajlar, durmuş container’lar, kullanılmayan volume’ler ve build önbelleği sessizce birikir. İyi haber: Docker bunu ölçmek ve temizlemek için yerleşik komutlar sunar. Kötü haber: prune komutları yanlış kullanılırsa veri kaybettirebilir. Bu yazıda önce ölçmeyi, sonra güvenle temizlemeyi öğreniyoruz.
Önce ölç: docker system df
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 4 0 161.5MB 94.98MB (58%)
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 14 0 76.44MB 57.34kB
Dört kalem vardır: imajlar, container’lar, volume’ler ve build önbelleği. RECLAIMABLE sütunu, şu anda hiçbir container’ın kullanmadığı ve güvenle geri kazanılabilecek alanı gösterir. Ayrıntı için docker system df -v her imaj, container ve volume’ü tek tek listeler.
Neyi temizlediğinizi bilin
| Komut | Neyi siler? | Risk |
|---|---|---|
docker container prune |
Durmuş tüm container’ları | Düşük — ama durmuş container’ın yazılabilir katmanındaki veri gider |
docker image prune |
Etiketsiz (“dangling”) imajları | Düşük |
docker image prune -a |
Çalışan bir container’ın kullanmadığı tüm imajları | Orta — sonra yeniden indirmeniz gerekir |
docker volume prune |
Kullanılmayan anonim volume’leri | Yüksek — veri kalıcı silinir |
docker builder prune |
Build önbelleğini | Düşük — sonraki build yavaşlar |
docker system prune |
Durmuş container + etiketsiz imaj + kullanılmayan ağ + (önbellek) | Orta |
Tuzak 1: system prune volume’lere dokunmaz
Sık yapılan bir varsayım “docker system prune her şeyi temizler” olsa da volume’ler varsayılan olarak hariçtir. Deneyde kullanılmayan, adlandırılmış bir volume oluşturup sırayla şunları çalıştırdık:
$ docker volume create vol_unused
$ docker system prune -f # volume hâlâ duruyor
$ docker system prune -f --volumes # volume HÂLÂ duruyor
$ docker volume prune -a -f # şimdi siliniyor
vol_unused
Docker 23’ten beri --volumes ve docker volume prune yalnızca anonim volume’leri siler; adlandırılmış (named) volume’leri silmek için -a (--all) bayrağını açıkça vermeniz gerekir. Bu, kazara veri kaybına karşı bilinçli bir güvenlik önlemidir — veritabanı volume’ünüz yanlışlıkla gitmez. -a kullanmadan önce docker volume ls çıktısına mutlaka bakın.
Tuzak 2: image prune -a beklediğinizden fazlasını siler
“Kullanılmayan imaj”, şu anda bir container’a bağlı olmayan imaj demektir. Test ortamımızda docker image prune -a -f çalıştırdığımızda, üzerinde çalışan container olmayan temel imajımız da dahil her şey silindi:
$ docker image prune -a -f
deleted: sha256:33c119...
deleted: sha256:032024...
$ docker images
(boş)
Bu, bir CI sunucusunda ya da bir geliştirme makinesinde sonraki build’lerin tüm temel imajları baştan indirmesi anlamına gelir. Yalnızca “bir haftadan eski” olanları temizlemek için filtre kullanın:
docker image prune -a --filter "until=168h"
Etiketsiz (dangling) imaj nedir?
Aynı etiketle yeni bir imaj build ettiğinizde eski imaj etiketini kaybeder ve <none> olarak görünür. Bu imajlar hiçbir şeye bağlı olmadığından docker image prune (-a olmadan) güvenle siler. Listelemek için:
docker images -f dangling=true
Not: Kendi denememizde (containerd imaj deposu kullanan Docker 29.4) aynı etiketi yeniden build ettikten sonra dangling=true listesi boş geldi; containerd deposunda etiketsiz imajlar eski depodan farklı davranabilir. Gerçek durumdan emin olmak için tahmin yürütmek yerine docker system df‘deki RECLAIMABLE değerine güvenin.
Önerilen rutin
docker system dfile durumu görün.- Önce güvenli olanlarla başlayın:
docker container prune,docker image prune,docker builder prune. - Hâlâ yer lazımsa
docker image prune -a --filter "until=168h"kullanın. - Volume’lere yalnızca
docker volume lsile tek tek baktıktan sonra, bilerek dokunun. - Sunucularda bunu bir cron görevi olarak zamanlayacaksanız
-fve--filter until=...kullanın,--volumes‘ı asla otomatikleştirmeyin.
Üretim sunucusunda temizlik komutlarını çalıştırmadan önce hangi volume’lerin veritabanı gibi kalıcı veri taşıdığını bildiğinizden emin olun. Volume mantığı için Docker Volumes yazısına bakın.
Sıradaki adım: imajları baştan küçük tutarak diskte yer kazanmak için Multi-Stage Build yazısına geçin.