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.
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 🙂