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

Container yeniden oluşturulunca veriler neden kaybolur?​


Eski container kaldırılıp yenisi oluşturulduğunda eski yazılabilir katman da kaldırılır; yeni container aynı image temeline dayanan yeni bir katmanla başlar. Uygulamanın verileri bu geçici katmana yazıldıysa dosyalar kaybolur. Verilerin kalıcı olması için uygulamanın veri dizinini bir Docker volume’una veya ana makinedeki bir bind mount dizinine bağlamanız gerekir.

Container depolama modeli nasıl çalışır?​


Bir image salt okunur temel katmanlardan oluşur. Container başlatıldığında bunun üzerine container’a özel, yazılabilir bir katman eklenir. Uygulamanın container içindeki /var/lib/app veya /data gibi bir dizine yazdığı dosyalar normalde bu katmanda tutulur.

Container yalnızca durdurulursa bu katman genellikle korunur. Ancak container silinip yeniden oluşturulursa, yeni container eski yazılabilir katmanı kullanmaz. docker compose up --force-recreate, image değişikliği, yapılandırma değişikliği veya bir orkestratörün yeniden dağıtımı gibi işlemler yeni bir container oluşturabilir.

Mevcut veriyi taşımadan eski container’ı kaldırmayın. Sonradan mount eklemek, eski container’ın kullanıcı verilerini otomatik olarak yeni depolamaya taşımaz. Önce uygulamaya uygun tutarlı yedeği alın, hedef depolamaya aktarımı ve geri yüklemeyi doğrulayın. Volume ve bind mount kullanıldığında ilgili dizin container’ın geçici katmanından ayrılır. Container silinse bile volume veya ana makinedeki bağlama dizini korunur; yeni container aynı depolamaya bağlanır.

Somut örnek​


Bir uygulama veritabanını /var/lib/app altında tutuyor ve bu dizin için hiçbir kalıcı depolama tanımlanmıyorsa, container içine yazılan users.db dosyası eski container’a aittir. Yeni container aynı image ile oluşturulsa bile image içinde sonradan oluşturulmuş bu dosya bulunmaz.

Aşağıdaki deneme, gerçek uygulamadan ayrı ve boş bir klasörde compose.yaml dosyasıyla yapılır. BusyBox yalnızca test dosyasını tutan bir container’dır; veritabanı kurulumu değildir:

Kod:
services:
  app:
    image: busybox:stable
    command: ["sleep", "3600"]
    volumes:
      - app-data:/data

volumes:
  app-data:

Burada /data örnek hedeftir. Gerçek uygulamada belgelenen veri dizinini kullanın; image dosyalarının bulunduğu bir yolu rastgele bağlamayın. Var olan dosyaların üstüne volume bağlamak o dosyaları görünmez kılabilir. Boş volume’un ilk bağlamada image içeriğiyle doldurulması, eski container’ın sonradan oluşan verisinin taşınmasıyla aynı şey değildir.

Hangi depolama türü ne zaman kullanılmalı?​


Seçim, verinin kimin tarafından yönetileceğine ve yedekleme yöntemine bağlıdır.

DepolamaVeri nerede tutulur?Uygun kullanım
Container katmanıContainer’ın geçici yazılabilir katmanındaGeçici dosyalar, önbellek
Named volumeDocker’ın yönettiği kalıcı depolamadaVeritabanı ve uygulama verisi
Bind mountAna makinede seçilen dizindeHost tarafından doğrudan yönetilecek dosyalar

Yeniden oluşturma testinin adımları​


Docker Engine ve Compose’un çalıştığı test ortamında, aynı klasörde aşağıdaki sırayı izleyin. Örnek bir saat uyuyan container kullanır; test boyunca çalışır durumda olmalıdır.

  1. Test projesini başlatın: docker compose -p persistence-demo up -d.
  2. Mount eşlemesini kontrol edin: docker inspect persistence-demo-app-1 çıktısındaki Mounts bölümünde hedef /data ve volume türü bulunmalı.
  3. Test dosyasını yazın: docker compose -p persistence-demo exec app sh -c 'echo kalici-test > /data/persistence-test.txt'.
  4. Aynı proje adıyla container’ı yeniden oluşturun: docker compose -p persistence-demo up -d --force-recreate.
  5. Dosyayı okuyun: docker compose -p persistence-demo exec app cat /data/persistence-test.txt.

Beklenen çıktı kalici-test olur. Bu, dosyanın aynı named volume üzerinden yeni container’a ulaştığını gösterir; yedek alındığını veya gerçek uygulama veritabanının tutarlı olduğunu kanıtlamaz. Dosya yoksa önce Mounts alanındaki kaynak adı/hedef yolu, proje adını ve komut hatalarını karşılaştırın.

Named volume kullanımı container yaşam döngüsünden bağımsızlığı kolaylaştırır. Bind mount ise dosyaların host üzerinde açıkça görülmesini ve başka araçlarla yönetilmesini sağlar; ancak izinler, sahiplik ve yol bağımlılığı yöneticiye aittir.

Sık yapılan hatalar​


Volume’u yanlış hedefe bağlamak: Uygulama /var/lib/app/data dizinine yazarken volume’u yalnızca /var/lib/app yerine başka bir konuma bağlamak beklenen sonucu vermez. Uygulamanın gerçek veri yolunu doğrulayın.

Image içine veri yazılacağını sanmak: Çalışan container’da oluşturulan dosyalar otomatik olarak image’a eklenmez. Kalıcı uygulama verisi image güncellemesiyle korunmaz; image yalnızca uygulamanın temel dosyalarını taşır.

Volume ile volume içindeki veriyi karıştırmak: Container’ı silmek ile volume’u silmek aynı işlem değildir. Fakat volume silinirse içeriği de gider. Yeniden oluşturma öncesinde önemli volume’lar için ayrıca yedek alın.

Veritabanını yalnızca dosya kopyasıyla yedeklemek: Çalışan veritabanı dosyasını kopyalamak tutarsız bir yedek oluşturabilir. Veritabanının kendi dump veya yedekleme yöntemini kullanın; volume yedeği bunun yerine her zaman geçmez.

Sık sorulan sorular​


Aynı Compose dosyasıyla farklı klasörde çalıştırınca neden boş veri görüyorum?​


Varsayılan named volume adları Compose proje adıyla kapsamlanır; proje adı değişirse farklı bir volume oluşturulabilir. Eski verinin silindiğini varsaymadan önce eski/yeni volume adlarını ve Mounts alanını karşılaştırın. Testteki -p persistence-demo değeri proje adını açıkça sabitler.
 

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