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ırılacağını uygulayarak göstereceğiz.

Veri Kaybının Sebebi ve Çözüm Yolları
Docker’da konteynerlerin katmanlı bir dosya yapısı vardır. Konteyner kaldırıldığı an, o ana kadar yazılan tüm veriler silinir. Veriyi korumak istiyorsak, onu konteynerin yaşam süresine bağımlı olmaktan kurtarmalıyız. Docker bu sorunu aşmamız için Birimler ve Bağlama Noktaları üzerinden veriyi dış dünyada depolamamıza imkan tanır.
Hangi Bağlama Yöntemini Seçmelisiniz?
Docker’da dosyaları bağlamak için kullanılan -v ve --mount komutları farklı çalışma mantıklarına sahiptir. -v yöntemi kısa ve pratiktir, ancak olmayan dizinleri kendiliğinden oluşturduğu için bazen karmaşaya neden olabilir. --mount ise daha açık bir yazıma sahiptir ve hata yapma ihtimalinizi düşürür. Bu yazımızda herkesin kolayca uygulayabilmesi için Volume yöntemini tercih edeceğiz.
Kalıcı Veri İçin Docker Volume Kullanımı
Bir uygulama veri üretiyorsa ve bu verinin kaybolmasını istemiyorsanız, onu konteynerin dışına almalısınız. Docker Volume tam olarak bu işe yarar: Veriyi dışarıda tutar ve her servisin bu veriye ulaşmasına izin verir. Bu rehber boyunca veri paylaşımını bu yöntemle gerçekleştireceğiz. İlk olarak terminal üzerinden ortak kullanacağımız veri alanını oluşturarak işe başlıyoruz
sudo docker volume create gfg_paylasimMevcut birimleri kontrol etmek için listeleme komutunu kullanabiliriz.
sudo docker volume lsBirimin 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İlk Konteyner Üzerinden Veri Yazma Testi
Şimdi teoriyi pratiğe dökme zamanı. Birimimizin çalışıp çalışmadığını anlamak için bir dosyayı bir konteynerde hazırlayıp diğerinden okumayı deneyeceğiz. İlk adım olarak, bir Ubuntu imajı kullanarak yeni bir konteyner açıyoruz. Bu konteyneri başlatırken, az önce oluşturduğumuz birimi /shared-volume dizinine bağlıyoruz:
sudo docker run -it -v gfg_paylasim:/shared-volume --name konteyner-01 ubuntuKonteyner 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>exitBu adımda
test.txtdosyası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.txtEğer dosya görünüyorsa iki farklı mikro hizmet, aynı fiziksel veriye tek bir merkezi birim üzerinden erişmiş oldu.
NFS ile Uzaktaki Birimlere Bağlanma
Standart Docker birimleri genellikle aynı bilgisayar içindeki konteynerler için idealdir. Ancak servisleriniz farklı sunuculara yayıldığında, veri paylaşımını sağlamak adına NFS sürücülerini devreye sokmalısınız. Bu sayede bir sunucuda üretilen veri, ağ üzerinden diğer sunucudaki konteyner tarafından anında görülebilir hale gelir.
docker volume create --driver local --opt type=nfs --opt o=addr=192.168.1.100,rw --opt device=:/data nfs_birimiBu komutla, uzaktaki bir sunucunun diskini yerel bir birimmiş gibi Docker konteynerlerinize bağlayabilirsiniz.
Docker Birimlerinde Temizlik ve Koruma
İşiniz bittiğinde sistemi kalabalıktan kurtarmak önemlidir. Birimleri silerken verilerin tamamen kaybolacağını unutmayın. Tek bir birimi silmek için docker volume rm komutunu kullanırken, kullanılmayan her şeyi tek seferde temizlemek için docker volume prune komutunu kullanabilirsiniz. Güvenlik tarafında ise, bir konteynerin verilere zarar vermesini engellemek için bağlantı sonuna :ro ekleyerek veriyi yazmaya karşı koruyabilirsiniz.
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 Çeşitleri Nelerdir?