- Konu sahibi
- #1
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
Named volume, Docker’ın oluşturduğu ve yönettiği bir depolama nesnesidir. Container başlatılırken
Aşağıdaki ayrım hangi yöntemin uygun olduğunu seçmeye yardımcı olur:
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.
Bu örnek, veriyi
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
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.
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
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.
Ö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öntem | Veri nerede tutulur? | Uygun kullanım |
|---|---|---|
| Named volume | Docker’ın yönettiği depolama alanında | Veritabanı ve uygulama verisi |
| Bind mount | Host üzerindeki belirli dizinde | Geliştirme sırasında kaynak kodu ve yapılandırma |
| Container katmanı | Container’ın geçici yazma katmanında | Kalı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:- Volume oluşturun:
Başarıyla oluşturulursa komut çıktısındaKod:docker volume create demo-datademo-dataadı görünür. Volume zaten varsa Docker hata vermek yerine mevcut volume’u kullanabilir. - Volume’a bağlı ilk container’ı çalıştırıp bir dosya yazın:
Container komut tamamlandığında durur; volume silinmediği için dosya korunur.Kod:docker run --name writer -v demo-data:/data alpine sh -c 'echo "kalici veri" > /data/mesaj.txt' - İlk container’ı silin:
Bu işlem yalnızca container’ı kaldırır.Kod:docker rm writerdemo-datavolume’u ayrıca silinmediği için içindeki dosya kalır. - Aynı volume’u yeni bir container ile okuyun:
Beklenen çıktıKod:docker run --rm -v demo-data:/data alpine cat /data/mesaj.txtkalici verisatırıdır. Bu çıktı, verinin eski container katmanından değil volume’dan okunduğunu gösterir. - Volume’u ve kullanım durumunu inceleyin:
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.Kod:docker volume inspect demo-data
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.