İçeriğe geç

Docker Boş/Dolu Volume Davranışı

Merhabalar. Bildiğiniz üzere Docker volume nesneleri ile, bizim için gerekli olan birtakım dosya, verileri vs container yaşam döngüsünden bağımsız olarak yönetebilmekteyiz. Böylece host üzerinde stateless olarak çalışan bir containerın yaşam döngüsü sona erdiğinde, yerine ayağa kalkacak olan container bu veri mirasını devralarak çalışmasına devam edebilmekte.

Bugün bir volume nesnesini containera mount ederken, volume’in boş ya da dolu olmasına göre ortaya çıkan davranışları inceleyeceğiz.


Durum durum incelemeye geçmeden önce ilk olarak bu blog yazısı içinde kullanacağımız bir volume yaratalım.

$ docker volume create volume_blog

Daha sonrasında bu blog yazısında kullanmak üzere yarattığım image’den bir container ayağa kaldıralım.

$ docker container run --rm egundogdu/volume-blog

Basitçe bir txt dosyasından tek bir satır yazı okuyan ve ekrana basan bir Python containeri.

Bizim için önemli olan ise container içinde uygulamanın yaşadığı bir dizin barındırması ve az sonra buraya mount edilecek boş ve dolu volumelere göre nasıl şekilleneceği. Hızlıca göz atacak olursak;

$ docker container run --rm egundogdu/volume-blog pwd  
/usr/src/myapp
$ docker container run --rm egundogdu/volume-blog ls  
main.py
volume.txt

 

Basit başlayalım.

Klasör container içerisinde yok ve volume boş ise.

Eğer mount edilen volume boş, mount edildiği klasörde container içerisinde mevcut değilse, container içerisinde bu klasör yaratılır ve volume içeriği klasöre kopyalanır. Şu haliyle volume boş olduğu için container içerisinde klasörü boş olarak görürüz. Örnekleyelim.

$ docker container run --rm -v volume_blog:/test_dir alpine ls -l test_dir 
total 0

Eğer volume’in mount edildiği klasör, container içerisinde mevcut ise burada davranışlar farklılık göstermekte.

Klasör boş, volume boş ise.

Klasör boş ise, bağlanan volumedeki tüm dosyalar klasöre kopyalanır. Şu haliyle volume boş olduğu için yukarıdaki örnekle tek farkı dosyanın container içerisinde yaratılmamış olmamasıdır.

Klasör dolu, volume boş ise.

Mount edilen volume boş fakat, mount edildiği klasörde dosya var ise, klasörde var olan dosyalar volume içerisine kopyalanır. Örnekleyecek olursak boş olan volume_blog‘u Python appimizin yaşadığı klasöre mount edelim ve yeni bir container olusturalım.

$ docker container run --rm -v volume_blog:/usr/src/myapp  egundogdu/volume-blog 
lorem ipsum dolor.

Ardından volume’i Alpine imajından yaratacağımız bir containera mount ederek içerisine göz atalım.

$ docker container run  --rm -v volume_blog:/test alpine ls test   
main.py
volume.txt

Çok güzel. Görüldüğü üzere mount edilen klasör içeriği volume içerisine kopyalandı. Göz atmamız gereken son bir durum var.

Klasör dolu, volume’de dolu ise.

Eğer bir volume dolu ise, mount edildiği klasörün dolu olup olmaması durumu göz ardı edilir ve klasörde, volume içeriğinde ne varsa o dosyalar gösterilir.

Bunu örnekleyecek olursak içerisinde dosyalar olan volume’i (volume_blog) öncelikle alpine imajından türeteceğimiz bir containera mount edelim. Bu container’ı interaktif modda açarak mount edilen klasörde değişikler yaparak, volume içeriğini de değişime uğratalım.

$ docker container run --rm -it -v volume_blog:/test alpine sh
/ # ls 
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    test   tmp    usr    var
/ # cd test/
/test # ls
main.py     volume.txt
/test # touch alpine.txt
/test # rm -rf volume.txt main.py 
/test # ls
alpine.txt
/test # exit

Volume’i değişime uğrattıktan sonra Python appimize mount edelim ve interaktif modda bir sh bağlantısı açarak container içerisine göz atalım.

$ docker container run --rm -it -v volume_blog:/usr/src/myapp egundogdu/volume-blog sh 
/usr/src/myapp # pwd
/usr/src/myapp
/usr/src/myapp # ls
alpine.txt
/usr/src/myapp # exit

App klasörüne mount edilmesine rağmen, volume boş olmadığı için container içerisindeki klasör içeriği göz ardı edilerek volume içeriği gösterilmekte.

Uygulamayı çalıştırmaya çalışacak olursak;

$ docker container run --rm -v volume_blog:/usr/src/myapp egundogdu/volume-blog 
python: can't open file '/usr/src/myapp/main.py': [Errno 2] No such file or directory

volume tarafından ezildikten sonra artık bir main.py dosyasına sahip değiliz 🙂


Volumeler Docker terminolojisinde önemli bir kısım. Bugün bir volume nesnesinin, veri içerip içermemesine göre mount edildiği container üzerindeki davranışlarını inceledik ve bilgi sahibi olduk.

Daha fazla bilgi için Docker volume dökümantasyonu linki, ve bu blogta daha fazla Docker ile ilgili okumak isterseniz o link de burada.

Bu yazıyı gözden geçiren ve beni destekleyen arkadaşım, abim Canberk Koç’a teşekkürler! ❤️

Umarım bu yazıyı faydalı bulmuşsunuzdur. Görüşmek üzere 🙂

 

Tarih:Blog

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Göster
Gizle