Docker sunucunuzun diski dolduğunda ilk yapılacak iş docker system df ile alanı neyin kapladığına bakmak, ardından kullanılmayan nesneleri prune komutlarıyla temizlemektir. docker system prune tek seferde durmuş container'ları, hiçbir container'ın kullanmadığı ağları, etiketsiz (dangling) imajları ve kullanılmayan build önbelleğini siler. Volume'lara varsayılan olarak dokunmaz. Daha hedefli temizlik için docker image prune, docker container prune, docker volume prune, docker network prune ve docker buildx prune komutları vardır.

Docker çöp toplama konusunda bilinçli olarak tutucu davranır: imajlar, container'lar, volume'lar, ağlar ve build önbelleği siz açıkça istemedikçe silinmez. Bu yüzden zamanla disk dolabilir. Bu yazıda her prune komutunun tam olarak neyi sildiğini, -a, --volumes ve --filter seçeneklerinin etkisini, verinin diskte nerede durduğunu ve veri kaybetmeden nasıl temizlik yapılacağını anlatıyoruz. Serinin tamamı için Docker öğrenme rehberine bakabilirsiniz.

Önce ölçün: docker system df ve veri dizini

Önce ölçün: docker system df ve veri dizini

Silmeden önce neyin yer kapladığını görmek gerekir. containerd image store belgesi, disk alanı kısıtlıysa disk kullanımını docker system df ile izlemeyi önerir. Komut -v bayrağıyla ayrıntılı bir döküm verir; Engine 29.5.0 sürüm notlarında bu çıktıdaki SHARED SIZE ve UNIQUE SIZE değerlerinin hesaplanmasına dair bir düzeltme yer alır. Çıktı ayrıca --format ile biçimlendirilebilir.

bash
docker system df

docker system df -v

Verinin fiziksel olarak nerede durduğunu bilmek de önemlidir. Docker daemon tüm verisini tek bir dizinde tutar; Linux'ta bu varsayılan olarak /var/lib/docker dizinidir. Engine 29.0 ve sonrasının yeni kurulumlarında varsayılan olan containerd image store kullanılıyorsa imaj içerikleri ve container snapshot'ları /var/lib/containerd altında, volume'lar ve yapılandırmalar gibi diğer veriler /var/lib/docker altında durur. Eski sürümden yükseltilmiş kurulumlarda varsayılan olan overlay2 gibi klasik depolama sürücülerinde ise tüm veri /var/lib/docker içindedir.

İmajları temizlemek: dangling ve kullanılmayan

docker image prune varsayılan olarak yalnızca dangling imajları siler. Dangling imaj, etiketi olmayan ve hiçbir container tarafından referans verilmeyen imajdır. Komut onay ister; belgelerde gösterilen uyarı şöyledir:

bash
docker image prune

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

-a bayrağı kapsamı genişletir: mevcut container'lardan hiçbiriyle ilişkili olmayan tüm imajlar silinir. Bu, şu anda çalışmayan ama ileride kullanacağınız etiketli imajları da kapsar; bir sonraki docker run ya da docker compose up bu imajları yeniden indirmek zorunda kalır.

bash
docker image prune -a

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y

Tüm prune komutları varsayılan olarak onay ister; onayı atlamak için -f veya --force kullanılır. --filter ile kapsamı daraltabilirsiniz; belgelerdeki örnek yalnızca 24 saatten eski imajları hedefler:

bash
docker image prune -a --filter "until=24h"

Durmuş container'ları temizlemek

Bir container'ı durdurduğunuzda, --rm bayrağıyla başlatmadıysanız otomatik olarak silinmez. Belgeler docker ps -a ile durmuş olanlar dahil tüm container'lara bakmanızı önerir; özellikle geliştirme yapılan sistemlerde sayının şaşırtıcı olabileceğini not eder. Durmuş bir container'ın yazılabilir katmanları diskte yer kaplamaya devam eder. docker container prune varsayılan olarak tüm durmuş container'ları siler:

bash
docker container prune

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
bash
docker container prune --filter "until=24h"

İkinci komut yalnızca 24 saatten eski durmuş container'ları kaldırır. Bakım için bilerek durdurduğunuz bir container varsa ve politikası unless-stopped ise, bu komut onu da siler; restart policy ile ilişkisi için restart policy yazısına bakın.

Volume'ları temizlemek: en riskli adım

Volume'lar bir veya daha fazla container tarafından kullanılabilir ve diskte yer kaplar. Belgeler volume'ların hiçbir zaman otomatik silinmediğini, çünkü bunun veriyi yok edebileceğini vurgular. docker volume prune varsayılan olarak yalnızca hiçbir container'a bağlı olmayan anonim volume'ları siler:

bash
docker volume prune

WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y

Bir container'a bağlı olmayan adlandırılmış (named) volume'lar, --all veya -a vermediğiniz sürece yerinde kalır. Bu ayrım önemlidir: veritabanınızın verisini tutan dbdata gibi bir volume, veritabanı container'ı o an silinmiş olsa bile varsayılan prune ile kaybolmaz. --all ise onu da siler.

Korumak istediğiniz volume'lara etiket koyup filtreyle dışarıda bırakabilirsiniz. Belgelerdeki örnek keep etiketi olmayan volume'ları hedefler:

bash
docker volume prune --filter "label!=keep"

Ağları ve build önbelleğini temizlemek

Docker ağları diskte fazla yer kaplamaz, ama iptables kuralları, bridge ağ aygıtları ve yönlendirme tablosu girdileri oluşturur. docker network prune hiçbir container'ın kullanmadığı ağları siler; until filtresiyle yalnızca belirli bir süreden eski ağları hedefleyebilirsiniz.

bash
docker network prune

WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y

docker network prune --filter "until=24h"

Build önbelleği çoğu zaman en büyük kalemdir. docker buildx prune o anda seçili builder'ın önbelleğini siler. Birden fazla builder kullanıyorsanız her birinin kendi önbelleği vardır; belirli bir builder'ı --builder ile hedeflersiniz. --all bayrağı iç ve frontend imajlarını da kaldırır.

bash
docker buildx prune

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

Önbelleğin otomatik çöp toplama politikalarını yapılandırmak, yani belirli bir boyutu aşınca kendiliğinden temizlenmesini sağlamak build cache yazısında anlatılıyor.

docker system prune: hepsi bir arada

docker system prune: hepsi bir arada: docker system prune, docker system prune -a, docker system prune --volumes, docker volume prune --all

docker system prune imajları, container'ları, ağları ve kullanılmayan build önbelleğini (BuildKit cache mount'ları dahil) tek komutla temizleyen bir kısayoldur. Belgelerde gösterilen onay metni neyin silineceğini açıkça listeler:

bash
docker system prune

WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - unused build cache

Are you sure you want to continue? [y/N] y

Varsayılan davranışı belgelerdeki haliyle özetleyelim: kullanılmayan container'lar ve ağlar silinir, imajlardan yalnızca dangling olanlar gider; kullanılmayan etiketli imajlar ise -a / --all vermedikçe korunur. --volumes eklerseniz kullanılmayan anonim volume'lar da silinir, ama adlandırılmış volume'lar yine korunur. Onları silmek istiyorsanız ayrı olarak docker volume prune --all çalıştırmanız gerekir.

KomutSildikleriDokunmadıkları
docker system pruneDurmuş container, kullanılmayan ağ, dangling imaj, kullanılmayan build önbelleğiEtiketli kullanılmayan imajlar, tüm volume'lar
docker system prune -aYukarıdakiler ve container'ı olmayan tüm imajlarTüm volume'lar
docker system prune --volumesVarsayılanlar ve kullanılmayan anonim volume'larAdlandırılmış volume'lar
docker volume prune --allKullanılmayan anonim ve adlandırılmış volume'larContainer'a bağlı volume'lar
bash
docker system prune --filter "until=24h"

Son komut 24 saatten eski öğeleri temizler. Belgelerde başka filtre ifadelerinin de kullanılabildiği, ayrıntıların her komutun CLI başvuru sayfasında olduğu belirtilir.

Etiketlerle önemli nesneleri korumak

Prune komutlarının en güvenli kullanımı, korunacak nesneleri etiketleyip filtreyle dışarıda bırakmaktır. Compose dosyasında hem servise hem volume'a etiket verebilirsiniz. Aşağıdaki dosya docker compose config --quiet ile doğrulandı:

yaml
services:
  db:
    image: postgres:17
    labels:
      com.example.keep: "true"
    volumes:
      - dbdata:/var/lib/postgresql/data
volumes:
  dbdata:
    labels:
      com.example.keep: "true"

Normalize edilmiş çıktının sonundaki volumes bölümünde volume'un Compose proje adıyla ön eklenmiş gerçek adı ve etiketi görünür; filtreleri bu adlara göre yazacağınızı unutmayın:

bash
docker compose -f compose.yaml config
volumes:
  dbdata:
    name: prune_dbdata
    labels:
      com.example.keep: "true"
bash
docker volume prune --all --filter "label!=com.example.keep"

Birden fazla olumsuz etiket filtresini birleştirirken dikkat edin: filtre belgesine göre bunlar tek bir olumsuz koşul oluşturur ve mantıksal VE gibi davranır, yani yalnızca tüm etiketlere birden sahip nesneler korunur. Ayrıntılı örnek için --format ve --filter yazısına bakın. Bir de Compose tarafındaki tuzağı hatırlatalım: Compose hızlı başlangıç belgesine göre docker compose down -v container'larla birlikte adlandırılmış volume'ları da kaldırır ve saklanan veri kalıcı olarak silinir; bu bayrağı yalnızca bilerek kullanın.

Uygulamalı örnek: güvenli bir temizlik sırası

Diski dolmuş bir üretim sunucusunda her şeyi tek komutla silmek yerine, riski azdan çoğa doğru ilerleyen bir sıra izlemek daha güvenlidir. Aşağıdaki sıra bu yazıda anlatılan komutlardan oluşur; her adımdan sonra docker system df ile ne kadar yer açıldığına bakabilir, yeterli alan açıldığında durabilirsiniz.

bash
docker system df
docker ps -a

docker container prune --filter "until=24h"
docker image prune
docker buildx prune

docker image prune -a --filter "until=24h"

docker system df

İlk iki komut durumu ölçer ve durmuş container'ları gözden geçirmenizi sağlar. Ardından en az riskli olanlar gelir: bir günden eski durmuş container'lar, dangling imajlar ve build önbelleği. Etiketli imajları silen -a adımı daha sonra ve yine bir süre filtresiyle uygulanır, çünkü silinen imajlar yeniden indirilmek zorunda kalır. Volume temizliği bu listede bilerek yok: veri içeren volume'lar için önce yedek alın, sonra etiket filtresiyle ve elle karar vererek ilerleyin.

Disk dolmasının diğer kaynakları

Prune komutları imaj, container, volume, ağ ve build önbelleğini kapsar; ama sunucuda diski dolduran tek şey bunlar değildir. Loglama belgesine göre varsayılan json-file log sürücüsünde log döndürme yapılmaz ve log dosyaları zamanla diski tüketebilir; belge bunu önlemek için local sürücüsünü önerir. max-size ve max-file ile log döndürme ayarı Docker log boyutu yazısında anlatılıyor. Bind mount ile container'a bağladığınız ana makine dizinleri de prune komutlarının kapsamında değildir; bu dizinlerdeki dosyaları kendiniz yönetirsiniz.

Engine 29 sürüm notlarında prune ile ilgili düzeltmeler de vardır. Örneğin 29.6.0'da containerd image store kullanılırken docker system prune komutunun geri kazanılan alan raporuna açılmış (unpacked) imaj verisini de dahil etmesi sağlandı; 29.4.1'de ise containerd image store ile docker image prune --filter label!=key=value komutunun etiketi olmayan imajları yanlışlıkla atlaması giderildi. Eski bir sürüm kullanıyorsanız raporlanan rakamların ve filtre davranışının farklı olabileceğini aklınızda tutun.

Sık yapılan hatalar

Sık yapılan hatalar: docker system prune -a komutunu sonuçlarını bilmeden çalıştırmak. Kullanılmayan..., --volumes bayrağının adlandırılmış volume'ları sildiğini ya da...
  • docker system prune -a komutunu sonuçlarını bilmeden çalıştırmak. Kullanılmayan tüm etiketli imajlar silinir ve bir sonraki başlatmada yeniden indirilir.
  • --volumes bayrağının adlandırılmış volume'ları sildiğini ya da silmediğini karıştırmak. system prune --volumes yalnızca anonim volume'ları, volume prune --all adlandırılmışları da siler.
  • Bir veritabanı container'ını kaldırdıktan sonra docker volume prune --all çalıştırmak. Volume artık hiçbir container'a bağlı olmadığı için silinir.
  • Otomasyon betiğinde -f ile onayı atlayıp filtre koymamak. Zamanlanmış temizlikte en azından until ve etiket filtreleri kullanın.
  • Build önbelleğini yalnızca varsayılan builder'da temizleyip diğer builder'ları unutmak; her builder'ın kendi önbelleği vardır.
  • Disk dolduğunda yalnızca prune'a bakıp büyüyen log dosyalarını gözden kaçırmak.

Sık Sorulan Sorular

docker system prune çalışan container'ları siler mi?

Hayır. Belgelerdeki listeye göre durmuş container'lar, hiçbir container'ın kullanmadığı ağlar, dangling imajlar ve kullanılmayan build önbelleği silinir. Çalışan bir container ve onun kullandığı imaj, ağ ve volume yerinde kalır.

Dangling imaj ile kullanılmayan imaj arasındaki fark nedir?

Dangling imaj etiketi olmayan ve hiçbir container'ın referans vermediği imajdır; docker image prune varsayılan olarak yalnızca bunları siler. Kullanılmayan imaj ise etiketli olabilir ama hiçbir container ile ilişkili değildir; bunlar için -a gerekir.

Prune işlemini zamanlanmış bir göreve koymalı mıyım?

Koyabilirsiniz, ancak onayı atlamak için -f gerekeceğinden filtrelerle kapsamı daraltın. until=24h gibi bir süre filtresi ve korunacak nesneler için etiket filtresi, yanlışlıkla veri silme riskini azaltır. Volume'ları zamanlanmış görevle temizlemekten kaçının.

Hangi nesnenin ne kadar yer kapladığını nasıl görürüm?

docker system df genel özeti, docker system df -v ayrıntılı dökümü verir. Bu komutları temizlikten önce ve sonra çalıştırarak ne kadar alan kazandığınızı karşılaştırabilirsiniz.

docker system prune veritabanı volume'umu siler mi?

Varsayılan haliyle hayır; docker system prune volume'lara hiç dokunmaz. --volumes eklerseniz yalnızca kullanılmayan anonim volume'lar silinir. Compose'da volumes: altında adıyla tanımladığınız bir veritabanı volume'u adlandırılmış volume'dur ve ancak docker volume prune --all veya docker compose down -v gibi açık bir komutla silinir.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Docker öğrenme rehberi · Docker log boyutu sınırlama · Volume yedekleme · Build cache backend'leri · Docker Compose başlangıç rehberi