Docker üzerinde mikro hizmetler oluştururken her bir parçanın kendi kutusunda, yani konteynerinde çalışması büyük bir avantajdır. Ancak bu kutular silindiğinde içindeki veriler de onlarla birlikte yok olur. Özellikle farklı servislerin aynı dosyalara ihtiyaç duyduğu projelerde, veriyi her konteynere tek tek kopyalamak hem disk alanını boşa harcar hem de veri karmaşasına yol açar. Bu yazıda, Docker’ın sunduğu imkanlarla veriyi nasıl merkezi bir noktada toplayıp tüm konteynerlere paylaştıracağımızı öğreneceğiz.

Konteyner İçindeki Veriler Neden Silinir?
Docker konteynerleri kalıcı değildir, yani geçicidir. Bir konteyner silindiğinde, dosya sistemi içindeki tüm veriler de onunla birlikte yok olur. Bu durumun çözümü, veriyi konteynerin kendi işleyişinden ayırıp dışarıda saklamaktır. Docker bu noktada bize Volumes (Birimler) ve Bind Mounts (Bağlama Noktaları) adında iki farklı seçenek sunar.
Bağlama Yöntemleri Arasındaki Farklar
Docker üzerinde birim bağlarken iki seçeneğiniz vardır. Bu seçenekler arasındaki fark sadece komutun yazılışı değil, aynı zamanda kullanım güvenliğidir. Eski yöntem olan -v, belirttiğiniz klasör bilgisayarınızda yoksa onu otomatik oluşturur; bu da bazen hatalara yol açabilir. Daha yeni olan --mount yöntemi ise klasör yoksa sizi uyarır ve işlemi durdurur. Biz rehberimizde daha yaygın olan Volume üzerinden devam edeceğiz.
Docker Volume Nedir ve Ne İşe Yarar?
Docker konteynerlerinin içindeki veriler, konteyner silindiği an yok olur. Uygulamanızın ürettiği önemli bilgileri korumak için bu verileri dışarıda saklamanız şarttır. Docker Volume; veriyi konteynerden ayrı tutan, paylaşılabilir ve Docker kontrolünde olan bir depolama alanıdır. Uygulamaya geçmeden önce sistemimizde kullanacağımız bu ortak depolama birimini hazırlayalım.
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_paylasimBirimi Konteynere Bağlama ve İlk Veriyi Hazırlama
Hazırladığımız bu veri alanını şimdi ilk konteynerimize bağlayacağız. Amacımız, bir dosyayı bu konteyner içinde oluşturup daha sonra başka bir konteynerden bu dosyaya ulaşmak. Öncelikle bir Ubuntu konteyneri çalıştırıyoruz ve oluşturduğumuz birimi sistem içindeki /shared-volume isimli klasöre eşliyoruz. Bunun için şu komutu kullanabiliriz:
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 Sürücüleri ve Sunucular Arası Bağlantı
Tek bir bilgisayarda her şey yolunda giderken, işin içine ikinci bir sunucu girdiğinde standart Docker birimleri dosya paylaşamaz. Bu engeli aşmak için Docker’ın NFS sürücü desteğini kullanırız. NFS sürücüleri, merkezi bir depolama alanını tüm ağdaki konteynerlerin hizmetine sunarak veri kalıcılığını genişletir.
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.
Sistemi Temiz Tutma ve Veri Güvenliği
Çalışmalarınız tamamlandığında Docker sistemini temizlemek performans açısından yararlıdır. Ancak bir birimi silmeden önce dikkatli olmalısınız; çünkü silinen birim içindeki tüm veriler kalıcı olarak kaybolur. İhtiyacınız olmayan bir birimi docker volume rm komutuyla silebilir, boştaki tüm birimleri ise prune komutuyla temizleyebilirsiniz. Ayrıca, bir konteynerin verileri sadece okumasını istiyorsanız :ro ekleyerek “salt okunur” modunu kullanabilirsiniz.
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 Driver Çeşitleri Neler? Docker’da Özel Ağ Oluşturma