Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Docker – Volume İle Verilerin Kalıcılığını Sağlama

Merhaba,

Bu içeriğimizde Docker’da Üretilen Verilerin Kalıcılığını Sağlama başlıklı yazımızın ikinci yöntemi olan Docker Volume ile containerda üretilen verilerin kalıcılığının nasıl sağlandığını inceleyeceğiz.

Docker Volume Nedir?

Docker, saniyeler içerisinde bir containerı ayağa kaldırıp bu container üzerinden uygulamamızı yayınlayabilen ve üretilen containerları imha etmediğimiz taktirde uzun bir süre kullanmamıza müsade edebilen bir platformdur. Lakin bizler üretilen containerları uzun soluklu bir kullanıma tabi tutmaktansa, içerisindeki uygulamanın gelişimine paralel olacak şekilde yeni güncellemeleri ve restorasyonlarıda barındıracak vaziyette kısa aralıklı üretilen containerlar üzerinden işlemlerimizi yapmayı ve bu işlemleri yaparken önceki üretilenleri imha etmeyi tercih edebiliriz.

Önceki makalelerimizden de biliyoruz ki, containerlar ayağa kaldırıldıkları esnada image üzerine eklenen okunabilir ve yazılabilir bir katman üzerinde üretilen verileri tutarlar. Halile Docker Host üzerinde herhangi bir durum bilgisi barındırmaksızın(stateless) çalışan bu containerlar herhangi bir imha söz konusu olduğunda bu okunabilir ve yazılabilir katmanında silinmesiyle birlikte tüm verileri geri dönüşsüz kaybedeceklerdir.

İşte böyle bir durum, her ne kadar geliştirilen uygulama için uygun olmasada, biz yazılımcılar ve süreçteki testerlar açısından da pek tercih edilebilir bir durum değildir. Nihayetin imajdan yaratılan bir containerın sırf içerisinde üretilen veriler kaybolmasın diye üretildiği ilk andan şu ana kadar imha edilmeden çalıştırılması ve kullanılması, yayın yapılan uygulama açısından da yersiz bir bağımlılık doğurmakta ve yapılan güncellemelerin ve restorasyonların ilgili yayına yansıtılamamasından dolayı Docker’ın da sanallaştırmanında pek bir anlamı kalmamaktadır. Ayrıca düzenli bir şekilde Docker containerlarında yayın yapan hasbel kader bir uygulamanın verilerinin tamamen kaybolması ve yeniden oluşturulması vs. gibi lüksü olmadığı için bu durum oldukça kritik arz etmektedir.

Zaten bu tarz, bir uygulamanın geliştirilmesiyle birlikte bir yandan da yayınının yapılması durumunu ifade eden Continuous Integration(Sürekli Entegrasyon)(CI) & Continuous Delivery/Deployment(Sürekli Teslimat/Dağıtım)(CD) yazılım geliştirme modellerinde de oluşturulmuş bir containerın işi bittiği taktirde imha edilip sonrasında ihtiyaç doğrultusunda bir yenisinin üretilmesi tavsiye edilmektedir.

Dolayısıyla böyle bir durumda üretilen containerlarda verisel açıdan bir kayıp yaşamamak için yapılan işlemler ve test sürecinde üretilen verileri kalıcı hale getirerek container bağımlılığını ortadan kaldırmamız gerekmektedir. Containerlarda üretilen verileri kalıcı hale getirebilmek ve dinamik bir gelişim sürecini destekleyebilmek için için Docker Valume teknolojisini kullanabilirsiniz.

Peki verileri kalıcı hale getirirken Docker Volume’ün Bind Mount‘tan ne farkı var?
Bind Mount’da container tarafında üretilen veriler ana makine üzerindeki işletim sisteminde ayrılan bir alanda tutulmaktadır. Docker Volume’de ise veriler Docker seviyesinde tutulmaktadır. Dolayısıyla Docker CLI ile yönetilebilmekte ve backup, restore, migrate vs. gibi işlemler daha dinamik gerçekleştirilebilmektedir. Hem Windows hem de Linux ortamlarda çalışabilmektedirler. Tüm bunların yanında cloud ortamda depolanabilmekte ve böylece ortam ile birlikte sunuculara olan bağımlılığı koparabilmektedirler.

Docker Volume Nasıl Kullanılır?

Docker üzerinde ayağa kaldırılan containerlar üretilen volumeler ile eşleşerek verilerini depolamaktadırlar. Dolayısıyla container imha edilse dahi eşleştikleri volumeler var olmaya devam edeceklerinden dolayı veri güvenliği sağlanmakta ve yeni üretilen containerlar ile mevcut volumeler tekrar eşleştirilerek var olan verilerle çalışmaya devam edebilmektedirler.

Docker Volume Nasıl Oluşturulur?

Docker Volume’ü

  1. Dockerfile
  2. Docker CLI

olmak üzere 2 farklı yolla oluşturabilmekteyiz. Şimdi gelin sırasıyla bu yolları inceleyelim…

Dockerfile Dosyası İle Docker Volume Oluşturma

Docker Volume’ü oluşturabilmek için Dockerfile dosyasında bir ‘VOLUME’ belirlenebilir.
Örneğin;

FROM mcr.microsoft.com/dotnet/core/sdk as sdkimage
VOLUME ["/images"]
WORKDIR /app
COPY . .
RUN dotnet restore
RUN dotnet publish DockerizeExampleProject.csproj -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=sdkimage /app/out .
ENV ASPNETCORE_URLS="http://*:1453"
ENTRYPOINT ["dotnet", "DockerizeExampleProject.dll"]

şeklinde tasarlanan bir Dockerfile dosyasında 2. satırda görüldüğü üzere ‘VOLUME [“/images”]’ bir volume talimatı verilmiştir. Bu Dockerfile’dan üretilen tüm imajlardan ayağa kaldırılacak containerlarda bu volume ile eşleştirme sağlanarak veriler depolanabilir.

Docker CLI İle Docker Volume Oluşturma

En kullanışlı yöntem ise CLI kullanmaktır diyebiliriz. Aşağıdaki komutla bir volume rahatça oluşturulabilir.

PROTOTİP
docker volume create <volume_name>

KOD
docker volume create images

Böylece ‘images’ adında bir volume hali hazırda kullanılmayı bekler vaziyette oluşturulmuştur.

Container İle Docker Volume Eşleştirme

Yukarılarda bahsettiğim gibi containerlar mevcut volumeler ile eşleştirilerek verilerini kalıcı hale getirmektedirler. Dolayısıyla artık üretilen volumelerin bir container ile nasıl eşleştirilebildiğini inceleyebiliriz. Ayağa kaldırılan bir containerın bir volume ile eşleştirilebilmesi için aşağıdaki çalışmayı gerçekleştirmelisiniz.

PROTOTİP
docker run –rm -d -p <port_out>:<port_in> –name <container_name> -v <volume_name>:”<target_path>” <image_name>
AÇIKLAMA
-v <volume_name>:”<target_path>” : -v parametresi –volume olarak da belirtilebilir. Ayağa kaldırılacak containerın hangi volume ile eşleşeceğini(volume_name) ve hangi hedefteki verileri depoyalacağını(target_path) belirtir.

ÖRNEK KOD : docker run --rm -d -p 1071:1453 --name cont1 -v images:"/app/wwwroot/images" appimage:v1

Örnek Kullanım
Docker – Volume İle Verilerin Kalıcılığını Sağlama
Yukarıda yazılan Docker CLI komutlarını incelerseniz eğer ‘cont1’ ve ‘cont2’ containerları ‘images’, ‘cont3’ ve ‘cont4’ containerları ise de ‘images2’ volumelerini kullanmak üzere dört farklı container üretilmiştir. Bu containerlardaki uygulamaların kullanımı aşağıdaki gibi olacaktır;

Docker - Volume İle Verilerin Kalıcılığını Sağlama
Görüldüğü üzere oluşturulan tüm containerlar kullandıkları volumelerden verisel olarak beslenmekte ve birbirlerinden izole edilmiş bir vaziyette çalışmaktadırlar.

Docker Volume Backup Alma

Docker Volume backup alabilmek için aşağıdaki prototipte CLI kodunu çalıştırınız.

PROTOTİP
docker run -v <volume_name>:/volume -v <target_path>:/backup –rm loomchild/volume-backup backup <backup_name>

KOD
docker run -v images:/volume -v C:/Users/Gençay/Desktop/Backup:/backup --rm loomchild/volume-backup backup some_archive

Docker Volume Restore Etme

Restore işlemi içinse aşağıdaki CLI kodunu kullanabilirsiniz.
PROTOTİP
docker run -v <volume_name>:/volume -v <target_path>:/backup –rm loomchild/volume-backup restore <backup_name>

KOD
docker run -v images:/volume -v C:/Users/Gençay/Desktop/Backup:/backup --rm loomchild/volume-backup restore some_archive

Docker Volume İle İlgili Diğer İşlemler

Tüm Volumeleri Listeleme

docker volume ls

Volume Silme

docker volume rm <volume_name>
Tüm volumlerin silinmesi için;
docker volume prune

Nihai olarak;
Önemli ve süregelen verilerin containerdan bağımsız bir şekilde kalıcı olmasını sağlayabilmek için Docker Volumelerin nasıl kullanıldığını detaylıca incelemiş olduk.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 03 Nisan 2020

    […] Docker – Volume İle Verilerin Kalıcılığını Sağlama […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*