Volume Mapping Nedir? Docker'da Veri Kalıcılığı (Persistent Storage)
Docker'da en önemli konulardan biri de Volume Mapping yapısıdır. Container'lar varsayılan olarak geçici (stateless) çalıştıkları için, içerisine kaydedilen veriler container silindiğinde veya yeniden oluşturulduğunda kaybolur. Bu problemi çözmek için Docker'da Volume kullanılır.
Docker'da Neden Volume Kullanılır?
- Docker Host üzerinde container'lar stateless olarak çalışırlar. Yani herhangi bir bilgi içerisinde kayıt edilemez.
- Container durdurulduğunda kayıt ettiğimiz bilgiler sonsuza kadar silinir.
- Docker'da bu durumu ortadan kaldırmak için Volume kullanılır. (Storage benzeri)
Bunu yapmak için şu mantık kullanılır:
- Bir container'ı ayağa kaldırdığımızda kayıt edilecek klasörün Docker Host üzerindeki adresini belirtiriz.
- Daha sonrasında container durdurulduğunda bilgiler Docker Host üzerinde kalmaya devam eder.
Container İçindeki Veriler Neden Silinir?
Yukarıdaki örnekte olduğu gibi veriler aslında uygulama içerisinde tutulur ve container kaldırıldığında silinir.
Bunun yerine aşağıdaki mantıkla verileri Docker Host üzerindeki bir klasörde tutmamız mümkündür.
Docker'da Volume Nasıl Tanımlanır?
Bir container'a volume vermek için -v parametresi kullanılır.
docker run -v /opt/data:/data/db mongo
Bu komutta iki farklı yol (path) bulunur:
- /opt/data → Docker Host (bilgisayarımız) üzerindeki klasördür. Verilerin fiziksel olarak tutulacağı yerdir.
- /data/db → Container içerisindeki klasördür. Uygulama bu dizine veri yazar.
Yani container'ı bu şekilde başlatmak demek, container içerisindeki /data/db klasöründe oluşan veya değişen tüm verileri Docker Host üzerindeki /opt/data klasörüne aktarmak demektir.
Mounts Denied Hatası Nedir?
Host üzerine kaydedilmesini istediğimiz klasör, Docker Host tarafından izin verilmemiş bir klasör ise Mounts denied hatası alırız.
Bu durumda Docker Desktop üzerinden ilgili klasöre izin vermemiz gerekir.
İlgili klasörü ekledikten sonra Apply & Restart diyerek izni tamamlarız.
Docker Volume Tanımları
Docker'da volume tanımlamanın iki farklı yöntemi vardır.
1. Host Path Tabanlı Volume Tanımı (Container'da Direkt Kullanım)
Eğer host'taki belirli bir dizini Docker container içindeki bir dizine bağlamak istiyorsanız, bunu sadece container'ın volumes kısmında aşağıdaki gibi tanımlayabilirsiniz.
Bu durumda host makinenizdeki /Users/mustafaari/docker/data/elk/elasticsearch dizini, container içerisindeki /usr/share/elasticsearch/data dizinine mount edilir.
Yani burada yapılan işlem doğrudan host path → container path eşleştirmesidir. Host üzerindeki belirli bir klasör Docker container'a bağlanır.
2. Global Volume Tanımı (Named Volume)
Eğer Named Volume kullanmak istiyorsanız, bunu global volumes kısmında tanımlayıp container içerisinde kullanabilirsiniz.
Ancak Named Volume ile belirli bir host yolunu doğrudan bağlayamazsınız.
Named Volume, Docker'ın veri depolama sürücüsüne bağlıdır (genellikle local driver kullanılır) ve verilerin nerede saklanacağını Docker kendisi yönetir.
Bu durumda es-data isimli volume Docker tarafından yönetilen bir alanda depolanır. Bu alanın yerini doğrudan siz belirleyemezsiniz.
Genellikle bu veriler Docker'ın varsayılan volume dizininde tutulur.
Böylece veriler container silinse bile kalıcılığını korur. Ancak bu yöntem, host üzerindeki belirli bir klasör ile doğrudan eşleşmez.
Host Path Volume ve Named Volume Arasındaki Fark
| Host Path Volume | Named Volume |
|---|---|
| Host üzerindeki belirli bir klasöre bağlanır. | Docker'ın yönettiği depolama alanını kullanır. |
| Klasör yolunu siz belirlersiniz. | Depolama konumunu Docker belirler. |
| Dosyalara host üzerinden doğrudan erişebilirsiniz. | Veriler Docker volume dizininde tutulur. |
| Geliştirme ortamlarında sık kullanılır. | Production ortamlarında veri kalıcılığı için sık tercih edilir. |
Sonuç
Volume Mapping sayesinde Docker container'ları geçici çalışsa bile verilerimizi kalıcı hale getirebiliriz. Host Path Volume ile verileri doğrudan bilgisayarımızdaki bir klasöre yazabilirken, Named Volume kullanarak verilerin yönetimini Docker'a bırakabiliriz.





