Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
Docker volume, bir container silinse veya yeniden oluşturulsa bile verilerin korunması için kullanılır. Container dosya sistemi geçicidir; uygulamanın veritabanı, yüklenen dosyaları veya kalıcı yapılandırmaları container katmanında tutulursa container kaldırıldığında bu veriler de kaybolabilir. Volume veriyi Docker tarafından yönetilen ayrı bir depolama alanında tutar ve container’a bağlayarak kalıcılık sağlar.

Örneğin bir uygulama /var/lib/app altında dosya üretiyorsa, bu dizini bir volume’a bağladığınızda uygulama container’ı değişse bile dosyalar volume içinde kalır. Yeni container aynı volume’a bağlandığında çalışmaya kaldığı verilerle devam eder.

Volume nasıl çalışır?​


Named volume, Docker’ın oluşturduğu ve yönettiği bir depolama nesnesidir. Container başlatılırken -v volume_adi:/container/yolu veya eşdeğer --mount seçeneğiyle bağlanır. Container içindeki ilgili dizine yazılan veriler volume’a gider; bu nedenle container’ın kendi geçici dosya katmanına bağlı kalmaz.

Aşağıdaki ayrım hangi yöntemin uygun olduğunu seçmeye yardımcı olur:

YöntemVeri nerede tutulur?Uygun kullanım
Named volumeDocker’ın yönettiği depolama alanındaVeritabanı ve uygulama verisi
Bind mountHost üzerindeki belirli dizindeGeliştirme sırasında kaynak kodu ve yapılandırma
Container katmanıContainer’ın geçici yazma katmanındaKalıcı olması gerekmeyen geçici dosyalar

Volume, yedekleme değildir. Volume silinirse içindeki veri de silinebilir; ayrıca host arızasına karşı tek başına koruma sağlamaz. Kalıcı veriler için volume yedekleme süreci ayrıca tasarlanmalıdır.

Çalışan örnek: container silinse de veriyi korumak​


Bu örnek, veriyi /data altında tutan küçük bir Alpine container ile volume davranışını gösterir. Docker’ın çalıştığı bir test makinesinde, yalnız bu deneme için ayrılmış boş bir volume ile uygulayın. demo-data veya writer zaten gerçek bir projeye aitse o adları kullanmayın; örnekteki bütün kullanımları yeni ve benzersiz deneme adlarıyla değiştirin:

  1. Volume oluşturun:
    Kod:
    docker volume create demo-data
    Başarıyla oluşturulursa komut çıktısında demo-data adı görünür. Volume zaten varsa Docker hata vermek yerine mevcut volume’u kullanabilir.
  2. Volume’a bağlı ilk container’ı çalıştırıp bir dosya yazın:
    Kod:
    docker run --name writer -v demo-data:/data alpine sh -c 'echo "kalici veri" > /data/mesaj.txt'
    Container komut tamamlandığında durur; volume silinmediği için dosya korunur.
  3. İlk container’ı silin:
    Kod:
    docker rm writer
    Bu işlem yalnızca container’ı kaldırır. demo-data volume’u ayrıca silinmediği için içindeki dosya kalır.
  4. Aynı volume’u yeni bir container ile okuyun:
    Kod:
    docker run --rm -v demo-data:/data alpine cat /data/mesaj.txt
    Beklenen çıktı kalici veri satırıdır. Bu çıktı, verinin eski container katmanından değil volume’dan okunduğunu gösterir.
  5. Volume’u ve kullanım durumunu inceleyin:
    Kod:
    docker volume inspect demo-data
    Docker volume’a ait sürücü ve host üzerindeki yönetilen konumla ilgili bilgileri gösterir. Bu konuma doğrudan dosya kopyalamak yerine volume’u bir container üzerinden kullanmak daha taşınabilir bir yaklaşımdır.

Dosya beklenen çıktıyı vermiyorsa önce her iki container’ın da aynı volume adını ve aynı container yolunu kullandığını kontrol edin. Örneğin ilk adımda demo-data:/data[ICODE] yerine başka bir volume veya [ICODE]/var/lib/app kullanıldıysa, ikinci container aynı veriyi göremez. Volume’u docker volume rm demo-data ile sildiyseniz veri geri gelmez; silmeden önce yedeğin bulunduğundan emin olun.

Hangi dizin volume’a bağlanmalı?​


Volume, uygulamanın kalıcı veri yazdığı dizine bağlanmalıdır. Veritabanlarında bu genellikle veritabanı motorunun veri dizinidir; web uygulamalarında yüklenen medya, kullanıcı dosyaları veya uygulamanın kalıcı çalışma verileri olabilir. Uygulamanın yalnızca geçici önbellek tuttuğu dizinleri volume’a bağlamak zorunlu değildir.

Bir volume’u yanlış dizine bağlamak iki soruna yol açabilir: Uygulama veriyi hâlâ geçici container katmanına yazabilir veya dolu bir volume bağlandığında image içindeki başlangıç dosyaları görünmez hale gelebilir. Boş bir volume’da ise Docker, varsayılan olarak o hedefteki image içeriğini volume’a kopyalayabilir; volume-nocopy ve uygulamanın başlangıç mantığı bu davranışı etkiler. Bu nedenle image dokümantasyonunda belirtilen veri dizinini kullanın ve ilk çalıştırmadan önce uygulamanın başlatma davranışını test edin.

Sık yapılan hatalar​


Container’ı volume sanmak: Container yeniden oluşturulabilir bir çalışma birimidir; kalıcı veri için volume ayrıca tanımlanmalıdır.

Volume ile yedeği karıştırmak: Volume, silinmeye veya disk arızasına karşı otomatik kopya oluşturmaz. Düzenli olarak başka bir depolama alanına yedek alınmalı ve geri yükleme test edilmelidir.

Kullanılmayan volume’ları rastgele silmek: Bir volume şu anda bağlı görünmese bile eski bir uygulamanın verisini içerebilir. Silmeden önce docker volume ls ile listeleyin ve hangi projenin kullandığını doğrulayın.

Bind mount ile named volume’u amaç dışı kullanmak: Host’taki dosyaları doğrudan düzenlemek gerekiyorsa bind mount daha uygun olabilir. Docker’ın veriyi yönetmesi ve uygulama container’ları arasında taşınması isteniyorsa named volume genellikle daha pratik seçimdir.

Kaynaklar​



Sık sorulan sorular​


Bir volume birden fazla container tarafından kullanılabilir mi?​

Evet. Aynı volume birden fazla container’a bağlanabilir. Ancak uygulamaların aynı dosyalara eşzamanlı yazması veri bozulmasına veya uygulama düzeyinde çakışmaya yol açabileceğinden, paylaşım davranışının uygulama tarafından desteklendiğinden emin olun.

Container silinince volume otomatik silinir mi?​

Adlandırılmış volume bu örnekteki docker rm işleminden sonra kalır. Anonim volume’lar --rm veya uygun kaldırma seçenekleriyle farklı davranabilir. Container’ı silmek ile volume’u silmek ayrı kararlardır. Volume’u da silmek için açıkça kaldırmanız gerekir; bu işlem içindeki kalıcı veriyi de silebilir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic