Docker Volume

Docker volume, container’ların ürettiği verilerin kalıcı (persistent) olarak saklanmasını sağlayan Docker’ın resmi veri depolama mekanizmasıdır. Basitçe,  Container silinse bile veri kaybolmasın diye kullanılır.

Bunun en büyük sebebi, Container’lar geçicidir. Yani, Silinir, Yeniden oluşturulur, Güncellenir, Eğer veri volume içinde değilse Container silinince veri de silinir. Ama Volume varsa Container silinse bile veri korunur.

Volume Create

Basit bir volume oluşturmak için aşağıdaki komutu çalıştırmanız yeterlidir. 

docker volume create mydata

Volume’lar Host üzerinde nerede durduğunu ve detaylarını görmek için inspect komutunu kullanmanız yeterli olur.

docker volume inspect mydata 

En basit haliyle volume container’a bağlamak için aşağıdaki komut üzerinden örnekleme yapalım.

Sözdizimi olarak volume adı:container içinde bağlamak istediğiniz klasör olarak düşünebilirsiniz.

docker run -it -v mydata:/uygulama alpine sh

Komut çalıştıktan sonra biz kendimizi container içinde bulacağız. Burayı listelediğiniz zaman uygulama adında klasör göreceksiniz. Normalde böyle bir klasör yoktu. Biz oluşturduğumuz volume bunu bağladığımız için otomatik olarak sistem bu klasörü oluşturdu. Ancak böyle bir zorunluluk yok siz mevcut olan bir klasörüde bağlayabilirsiniz.

Uygulama klasörünün içine bir dosya oluşturalım.

cd uygulama
touch mehmet.txt
ls 

Containerdan exit veya CTRL + D kombinasyonunu kullanarak çıkış yapın. Container üzerinde çalışan bir şey olmadığı için otomatik olarak kapanacaktır. Bu container'ı bulun ve silin.

Şimdi yeni bir tane container oluşturalım. Bu sefer volume oluşturmayıp, daha önce oluşturduğumuz volume bağlayacağız. Container içinde anlaşılması adınada uygulama yerine test klasörüne bağlayacağız. Zaten oluşturduğunuz her container kendine özeldir. Silmeden yeniden oluştursak bile tamamen farklıdır. 

docker run -it -v mydata:/test alpine sh
ls test/ 

Using volume for multi-container applications.

Bir volume birden fazla container'a bağlanabilir. Örneğin aşağıdaki gibi ubuntu imajına bağladık ve dosyanın burada da var olduğunu görebildik.

docker run -it -v mydata:/test2 ubuntu sh
ls test2 

Read Only Volume Create

Bazı senaryolarda volume üzerinde sadece okuma yetkisi isteyebilirsiniz. Volumu read only yani sadece okunabilir olarak bağlayacaksanız container içindeki klasöre ro opsiyonunu eklemeniz yeterli olacaktır.

docker run -it -v mydata:/test3:ro ubuntu bash 

volume empty-full behavior

Docker volume’larda “boş–dolu” davranışı ilk başta kafa karıştırır ama mantığı nettir. 

Volume

  • Volume boş, container dizini boş ise → hiçbir veri kopyalanmaz, volume boş kalır.
  • Volume boş, container dizini dolu ise → Docker volume’u container içeriğiyle otomatik doldurur.
  • Volume dolu ise → container dizini ister dolu olsun ister boş olsun container içeriği görünmez olur ve volume içeriği kullanılır.(Container dizindeki dosyalar silinmez, sadece volume tarafından gizlenir)

Bind Mount

Bind Mount, host üzerindeki bir klasör ya da dosyayı container içerisine map etme işlemine denir. Prod (canlı) ortamlarda güvenlik, bağımlılık, denetin gibi durumlardan bind mount GENELDE önerilmez. Ama doğru yerde ve doğru amaçla kullanılırsa sorun değildir.

  • Bind mount klasör boşsa → container dizini boşmuş gibi görünür.
  • Bind mount klasör doluysa →  container dizini ister dolu olsun ister boş olsun container içeriği görünmez olur ve bind içeriği kullanılır. (Container dizindeki dosyalar silinmez, sadece volume tarafından gizlenir)

Bind mount için nginx ile örnek vermek gerekirse. Nginx ilk oluşturulduğunda varsayılan bir index.html sayfası olur. Ancak bizim bağladığımız bind klasör yolu boş olduğu için container içini ezerek index.html sayfalarını ezdi ve gözükmez hale geldi.

index.html dosyası gittiği için aşağıdaki gibi hata alınmıştır.

Bu yaşadığın durum tam olarak bind mount’un en tehlikeli ve beklenen davranışıdır. Docker hatası değildir. Bu yüzden geliştirme ortamı hariç bind mount tercih etmemeniz daha doğru olur. Sonuç olarak, Bind mount’ta host dizini boş bile olsa container içeriğini silmez ama TAMAMEN gizler.

Blog'a Dön