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

  1. docker system df ile durumu görün.
  2. Önce güvenli olanlarla başlayın: docker container prune, docker image prune, docker builder prune.
  3. Hâlâ yer lazımsa docker image prune -a --filter "until=168h" kullanın.
  4. Volume’lere yalnızca docker volume ls ile tek tek baktıktan sonra, bilerek dokunun.
  5. Sunucularda bunu bir cron görevi olarak zamanlayacaksanız -f ve --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.