Docker Verilerini Kalıcı Hale Getiriyoruz

Selamlar arkadaşlar bu yazımda sizlere Docker Container’lar ile üretilen Dataların kalıcığını sağlayabileceğimiz Docker Volume’ları anlatacağım.

Docker Volume Nedir?

İlk olarak bir kısa hatırlatma ile başlıyorum. Çalıştırdığımız Container’lar bir süre sonra kapatılabilir. Bu kapatma işlemi olması durumunda eğer kalıcı bir alan belirtmediyseniz, image üzerine eklenen geçici RW katmanı üzerinde datalarınızı saklayacaktır ve kapatıldığı anda burada bulunan verilerinizde Container’ınız ile birlikte silinecektir. Silinen dataların ise geri dönüşü söz konusu değildir.

Bu kayıpların önüne geçebilmek ve container bağımlılıklarını ortadan kaldırabilmemiz gerekir. Container’larda üretilen verilerin sürekliliğini sağlamak ve dinamikleştirebilmek adına kullandığımız yönteme ise Docker Volume denmektedir.

Verileri kalıcı hale getirirken kullanılan bir diğer yöntem ise Bind Mount işlemidir. Bu yöntemde ise datalar Docker’ın üzerinde kurulu olduğu OS’de saklanmaktadır. Ancak Docker Volume’lar veriler Docker seviyesinde saklandığından dolayı CLI ile yöntilebilirken, Backup, Restore gibi işlemleri kolaylaştırırken ayrıca hem Linux hem de Windows sistemlerde çalışabilirler. Ayrıca Cloud ortamlarda da depolanabilirken, sunucu bağımlılığınıda ortadan kaldırmış olurlar.

Docker Volume Oluşturma :

Bu Volume’leri oluştururken iki farklı yöntem kullanabilirsiniz. DockerFile üzerinden yapılabileceği gibi Docker CLI ile de oluşturulabilmektedir.

> docker volume create depolama
> docker volume ls

Komutları yardımıyla listeme ve oluşturma yapabiliriz. Create ile oluşturma yaparken, ls ile listeleme işlemleri yaparız.

> docker volume inspect depolama

Komutu yardımıyla Volume ayrıntılarını görebilmenizde mümkündür. Depolama yerine Volume adınızı yazmanız yeterli olacaktır.

Şimdi burada oluşturmuş olduğumuz Volume alanını -v parametresi kullanarak Apache2 programının içerisine bulunan htdocs klasörü ile eşleştirelim. Yukarıdaki komutlarımızı açıklayarak ilerleyelim.

> docker container run --rm -d -p 80:80 --name webserver -v $(pwd)/depolama:/usr/local/apache2/htdocs/ httpd

Bir Container oluşturuyoruz. –rm komutu ile bu Container kapatıldığı an silinmesini istediğimizi belirtiyoruz. -d ile arkaplanda çalıştırırken, -p ile 80:80 portunu ayarlıyoruz. –name ile adını verdik ve sonrasında -v ile Volume alanımızı eşitliyoruz. Apache2’de bu eşitlemeyi yaparken Volume adının önüne $(pwd) ifadesini koyuyoruz. Ardından : (iki nokta üstüste) sonrasında /usr/local/apache2/htdocs/ ile Apache2 programı içerisindeki dosyamızın yerini belirliyoruz ve son olarak httpd ile de kurulacak olan image’ın adını giriyoruz.

Buradaki $(pwd) ise mevcut çalışma dizininin yolu (path) olarak değerlendirilir.

> docker container exec -it webserver

Komutu yardımıyla ise Container’ımızın içerisine bağlandık ve sonrasında cd komutunu kullanarak htdocs klaösürüne gittik ve Volume ile eşleşen klasörün içerisindeki dosyaları gördük. Buradaki index.html dosyasını ve deneme.txt dosyalarını önceden ben Volume klasörü içerisine eklemiştim bundan dolayı vardı. Son olarak apache programına erişmeyi denedim ve tarayıcıda “Bu Sistemdostunun dosyasidir.” çıktısını aldık. Yani Volume’umuzu başarılı bir şekilde bağlamış olduk.

> docker container run --rm -d -p 80:80 --name webserver -v $(pwd)/depolama:/usr/local/apache2/htdocs/:ro httpd

Volume’lar Read-Write mount edebildiğiniz gibi sadece Read-Only’de mount edebiliyorsunuz. Bunun için -v parametresinin en sonuna :ro eklemeniz yeterli olacaktır. Sonrasında Volume’unuz Read-Only olarak kayıt edilecektir.

> docker volume rm depolama
> docker volume prune -f -a

Sistemimiz içerisinde oluşturduğumuz Volume alanlarını silmek istiyorsak bunu yukarıdaki kodları kullanarak Volume adı belirterek yapabiliriz. Tüm Volume’leri silmek istiyorsanız ise prune -f (force) -a (all) yazarak yapabilirsiniz. Prune kodunu herhangi bir parametre olmadan kullanırsanız, kullanılmayan Volume’ları silecektir.

Volume Backup İşlemi yapacağız :

Bu işlemi yaparken aşağıdaki adımları izliyorum;

> docker volume create depolama
> /var/lib/docker/volumes/depolama/_data/

İlk olarak depolama adında Volume oluşturuyorum ve daha sonra sistem üzerinde bulunan path’ine giderek dosya içerisini kontrol ediyorum ve boş olduğunu görüyorum.

> docker container run -it --name ForBackup -v depolama:/depolama ubuntu bash

Daha sonra docker container run ile container oluşturmaya başlıyorum. Bu depolama volume’unun içerisini dolduracağım sistemimi çalıştırdığım alan olacak. -it ile container’ıma bağlanmak istediğimi belirtiyorum. –name ile adını belirliyorum ve -v ile volume dosyamı mount ediyorum sonrasında ise image’ımın adı olan ubuntu’yu yazıyorum ve bash ile bağlanmasını belirtip Enter tuşuna basıyorum.

Gerekli indirmeler yapılıyor ve Container’ım çalıştırılıp bağlantısı sağlanıyor.

> cd depolama/
> touch dosya1 dosya2 dosya3
> exit
> ls /var/lib/docker/volumes/depolama/_data/

Cd ile dosyama gidiyorum touch ile içerisine dosyalarımı ekliyorum ve Exit ile container bağlantımı sonlandırıyorum. Daha sonra ls ile Docker’ın yüklü olduğu işletim sistemimde dosyaların olup olmadığını kontrol ediyorum ve dosyaları orada görüyorum.

> mkdir depolama-backup
> chmod 777 depolama-backup/

İlk depolama-backup adında bir klasör oluşturuyorum. Daha sonra bu klasörün izinlerini 777 olarak ayarlıyorum.

> docker container run --rm --volumes-from ForBackup -v /home/semih/depolama-backup:/backup alpine tar cf /backup/backup.tar /depolama

Daha sonra backup işlemine başlıyoruz. Bunun için bir Container oluşturacağız ama –rm komudu sayesinde geçici bir container olacak. –volumes-from ile ForBackup Container’ında bulunan Volume’leri kullanacağımızı belirtiyoruz. /home/semih/depolama-backup: yoluna /backup adında volume olarak mount etmiş olduk. Alpine ise image adıdır ve çok ufak boyutlu bir linux image’ıdır. Sonrasında ise tar komutu ile backup.tar altına depolama’da olan dosyaları zipleyerek at demiş oluyoruz. Enter ile komutumuzu çalıştırıyoruz.

Bu sayede Backup’lama işlemini yapmış oluyoruz.

Volume Restore İşlemi yapacağız :

> docker volume create geriyukle

Geriyukle adında bir Volume oluşturdum ilk olarak.

> docker container run -it --name ForRestore -v geriyukle:/restore ubuntu bash
> docker container start bcbc

Daha sonra ForRestore adında bir container çalıştırdım ve burada Restore adında klasöre, oluşturmuş olduğum Volume’u Mount ettim ve sonrasında o dosyanın içerisine girerek ls ile içinin boş olduğunu gösterdim. Daha sonra exit ile çıkacağım ve Container’ım kapanacağı için start komutu yardımıyla çalıştırdım.

> docker run --rm -v geriyukle:/restore -v /home/semih/depolama-backup:/backup alpine tar xf /backup/backup.tar -C /restore

Daha sonra Backup işleminde olduğu gibi geçici bir alpine image’ına sahip container oluşturdum. Geriyukle volume’umu restore adıyla bağladım. /home/semih/depolama-backup yolunu ise backup adıyla bağladım ve sonrasında tar komutu ile backup.tar dosyasını restore klasörümün içerisine çıkarttım. Daha sonra klasörün içerisine giderek dosyaların gelip gelmediğini kontrol ettim ve sonuç olarak Restore işlemimizide yapmış olduk.

Ek Bilgiler :

Fark ettiyseniz bir Volume’u bir Container içerisine Mount ederken o çalıştırdığımız Container içerisinde herhangi bir klasör oluşturmadan yapıyoruz. Komutlarımızı çalıştırdığımız zaman direk olarak vermiş olduğumuz ad ile klasörümüz otomatik olarak oluşuyor.

Peki eğer image içerisinde olan bir klasöre volume’u mount edersek ne olur arkadaşlar. Bu durumda ise mount edilen klasör boş ise, volume içerisindeki dosyalar buraya kopyalanacaktır. Eğer image içerisindeki klasör dolu, yaratmış olduğumuz volume boş ise bu seferde; klasör içerisinde bulunan dosyalar volume alanımıza kopyalanacaktır. Bir diğer olasılık ise image içerisinde bulunan klasör boş ya da doluda olsa, volume içerisinde de datalar varsa yine volume içerisinde bulunanları göreceksiniz arkadaşlar.

– Backup/Restore yöntemi ise Mert Bakır adında bir arkadaşımın web sitesinden öğrendim. Anlayana kadar biraz uğraştım ve sonunda anladığım kadarını size aktarmak için yazdım. Teşekkürler Mert yardımların için.

Bir yazımında sonuna geldik arkadaşlar. Bana destek olmak isterseniz YouTube üzerinde SistemDostu kanalıma abone olabilirsiniz. Umarım yazılarım hepiniz için yararlı oluyordur. Şimdiden kolaylıklar diliyorum hepimize.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir