İçeriğe geç

Volumes ile Docker Konteynerler Arasında Veri Paylaşımı

Kategori: Veritabanı Sistemleri, ve Web Sunucuları

Bir uygulamayı Docker ile çalıştırırken her konteyner kendi içinde izole bir yapıya sahiptir. Bu yapı sayesinde servisler birbirini etkilemeden çalışır. Fakat konteyner içinde oluşturulan dosyalar, konteyner silindiğinde otomatik olarak kaybolur. Birden fazla konteynerin aynı dosya veya dizinlere erişmesi gereken durumlarda, veriyi her konteynere ayrı ayrı koymak yönetimi zorlaştırır.

Bu rehberde Docker konteynerleri arasında aynı dosya ve dizinlerin nasıl paylaştıralacağını uygulayarak göstereceğiz.

Konteyner Dünyasında Veri Neden Kaybolur?

Docker konteynerleri geçicidir. Konteynerin katmanlı dosya sistemi, konteyner silindiğinde içindeki tüm yazma verilerini de beraberinde götürür. Çözüm ise veriyi konteynerin döngüsünden ayırmaktır. Docker bize bu noktada Volumes (Birimler) ve Bind Mounts (Bağlama Noktaları) olmak üzere iki ana yol sunar.

-v ile –mount Arasındaki Farkı Uygulamalı Görme

Docker’da birim bağlarken iki farklı yöntem kullanabilirsiniz. Aralarındaki fark sadece görünüş değil, aynı zamanda güvenliktir.

  • -v Volume: Daha eski ve kısa bir yöntemdir. Eğer belirttiğiniz kaynak dizin bilgisayarınızda yoksa, Docker bunu otomatik olarak oluşturur. Bu bazen hatalı dizinlerin oluşmasına sebep olabilir.
  • –mount: Daha yeni ve açık bir yöntemdir. Anahtar-değer çiftleri kullanır. Eğer kaynak dizin yoksa hata verir ve sizi uyarır. Profesyonel projelerde bu yöntem tercih edilir.

Biz bu çalışmamızda Volume üzerinden ilerleyeceğiz.

Docker Volume Nedir ?

Docker konteynerleri geçicidir. Konteyner silindiğinde içindeki veriler de silinir. Eğer bir uygulama veri üretiyorsa bu veriyi konteynerin dışına çıkarmak gerekir. Docker Volume,

  • Veriyi konteynerden bağımsız tutar
  • Birden fazla konteyner tarafından paylaşılabilir
  • Docker tarafından yönetilir

Bu rehberde tüm veri işlemleri volume üzerinden yapacağız.

Birim Oluşturma ve Listeleme

Öncelikle sistemimizde kullanacağımız ortak havuzu oluşturalım. Terminale şu komutu girerek başlayalım,

sudo docker volume create gfg_paylasim

Mevcut birimleri kontrol etmek için listeleme komutunu kullanabiliriz.

sudo docker volume ls

Birimin Detaylarını İnceleme

Docker’ın bu birimi bilgisayarınızda tam olarak nerede sakladığını görmek isterseniz inspect komutu size “Mountpoint” bilgisini verecektir.

sudo docker volume inspect gfg_paylasim

Volume’ü İlk Konteynere Bağlama ve Veri Yazma

Bir dosyayı bir konteynerde oluşturup diğerinden okuyacağız. Aşağıdaki komutla bir Ubuntu konteyneri açıyoruz ve oluşturduğumuz birimi /shared-volume dizinine bağlıyoruz.

sudo docker run -it -v gfg_paylasim:/shared-volume --name konteyner-01 ubuntu

Konteyner açıldıktan sonra konteynerin içindeyken şu komutlarla verimizi oluşturalım.

cd /shared-volume<br>echo "Bu veri paylasimli birimden geliyor" > mesaj.txt<br>exit

Bu adımda

  • test.txt dosyasını volume içine yazdık
  • Veri artık konteynerin değil, volume’ün içinde

İkinci Konteyneri Çalıştırma (Veri Okuma)

Şimdi ikinci bir konteyner açıp aynı birimi ona da bağlayalım.

sudo docker run -it -v gfg_paylasim:/shared-volume --name konteyner-02 ubuntu

İçeride kontrolümüzü yapıyoruz.

cat /shared-volume/test.txt

Eğer dosya görünüyorsa iki farklı mikro hizmet, aynı fiziksel veriye tek bir merkezi birim üzerinden erişmiş oldu.

Makineler Arası Veri Paylaşımı ve NFS

Eğer mikro hizmetleriniz tek bir bilgisayarda değil de farklı sunucularda çalışıyorsa, standart birimler yetersiz kalır. Bu durumda NFS sürücülerini kullanmanız gerekir.

docker volume create --driver local --opt type=nfs --opt o=addr=192.168.1.100,rw --opt device=:/data nfs_birimi

Bu komutla, uzaktaki bir sunucunun diskini yerel bir birimmiş gibi Docker konteynerlerinize bağlayabilirsiniz.

Temizlik ve Güvenlik İpuçları

Verilerinizle işiniz bittiğinde sistemi temiz tutmak önemlidir. Ancak unutmayın, birimi sildiğinizde içindeki tüm veriler kalıcı olarak gider.

  • Birim Silme: docker volume rm birim_adi
  • Kullanılmayanları Temizle: docker volume prune
  • Salt Okunur Bağlantı: Eğer bir konteynerin veriyi değiştirmesini istemiyorsanız :ro bayrağını ekleyin: -v birim:/yol:ro

Sık Sorulan Sorular

Volume’ü aynı anda onlarca konteynere bağlarsam performans sorunu yaşar mıyım?

Hizmetler aynı anda aynı dosya üzerinde yazma işlemi yapmaya çalışırsa, dosya kilitlenme sorunları yaşayabilirsiniz. Eğer sadece okuma odaklı bir paylaşım yapıyorsanız, Docker bu yükü çok rahat bir şekilde yönetir.

Bir konteyner silindiğinde içindeki veri kalıyor peki Docker birimini (volume) silersem ne olur?

Birim silindiği an içindeki tüm veriler kalıcı olarak yok olur. Docker, konteyner silindiğinde veriyi korur ama docker volume rm komutuyla birimi sildiğinizde Docker artık o veriden sorumlu değildir.

Birim (Volume) ve Bağlama Noktası (Bind Mount) arasındaki en net fark nedir?

En temel fark yönetimdir. Bind Mount kullandığınızda, host makinedeki bir klasöre bağımlı kalırsınız ve o klasörün izinleri, taşınabilirliği sizin sorumluluğunuzdadır. Volumes ise tamamen Docker’ın kontrolündedir.

  • Geliştirme yaparken: Bind Mount kullanın (kod değişikliklerini anında görmek için).
  • Canlı sistemlerde ve veritabanlarında: Her zaman Volume kullanın.

Farklı sunuculardaki konteynerler arasında birim paylaşabilir miyim?

Birim Sürücüleri kullanmanız gerekir. Yazımızda bahsettiğimiz NFS, SSHFS veya bulut tabanlı (AWS EBS, Azure Files) sürücüler sayesinde, fiziksel olarak farklı makinelerde bulunan konteynerlerin aynı merkezi depolama alanına erişmesini sağlayabilirsiniz.

Bunlara da Göz Atın

İlginizi Çekebilir – Docker konteynerleriniz arasında sadece veri paylaşmakla kalmayıp, onları doğru ağ mimarisiyle birbirine bağlayabilirsiniz.

Docker Network Driver Tipleri ve Özel Ağ Oluşturma

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir