.NET Core Uygulamasını Dockerize Etme

Docker, açık kaynak kodlu bir sanallaştırma yazılımıdır. Sanallaştırmadan kasıt ise, işletim sisteminin dosya sistemini, ortam değişkenlerini her bir konteynera özel olarak sağlamasıdır. Aynı işletim sisteminde çalışan konteynerlar kendileri istemedikleri sürece birbirlerine erişemezler.

Peki  VMWare, Hyper-V gibi sanallaştırma platformlarının yanında neden Docker’a ihtiyaç duyarız?

  • Docker direk olarak işletim sistemi üzerinde çalışır. Yukarıda yazdığım diğer sanallaştırma platformları ise quest bir işletim sistemine ihtiyaç duyarlar. Sanallaştırma için gerekli disk alanı ciddi oranda azalır.
  • Hypervisor üzerinde çalışan sanallaştırma platformlarına bakım maliyeti oldukça yüksektir. Her bir sanal makina için işletim sistemi güncellemesi yapılması gerekir.

Docker Cli Genel Bakış

  • version -Bilgisayarımızda kurulu olan docker versiyonunu gösterir
  • pull -Uzaktaki imagaları local makinaya çekmek için kullanılır.
  • run -Elimizdeki imagedan çalıştırılabilir bir konteyner elde ederiz.
  • start -Durdurulan konteyneri başlatır.
  • stop -Konteyneri durdurur.
  • ps -[a]-[q] -Mevcut makineda çalışan konteyneri listeler. -[a] tüm konteynerleri gösterir. -[q] sadece konteyner Idlerini gösterir.
  • rm CONTAINER_ID -Konteyneri siler.
  • images -makinada kurulu olan tüm imajları listeleri
  • rmi IMAGE_ID -Imajları siler
  • logs CONTAINER_ID -Logları gösterir.

 

Docker CLI’ına kısaca göz attıktan sonra şimdi .NET Core 2.0 Web API projesi oluşturup bunun nasıl dockerize edileceğine bakalım.

Projemizi oluşturduktan sonra proje içine bir tane DockerFile oluşturuyoruz.

DockerFile içerisine yukarıdaki komutları yazıyoruz. Buradaki işlemler aslında çok basit.

  • Kullanacağımız imajı tanımlıyoruz.
  • Uygulamamızın kullanılacağı klasörü tanımlıyoruz.
  • Dotnet uygulamamızı restore ediyoruz.
  • Relase modda build ediyoruz.
  • Uygulamamızın kullanacağı portu envinronment veriable ile tanımlıyoruz.
  • Son olarak da konteyner ilk ayağa kalktığında uygulamamızı çalıştırıyoruz.

docker build -t sample/web-api:1.0.0 .” komutu ile docker imajımı yaratıyorum.

İşlemler ilk çalıştırmada biraz zaman alabilir. Başarılı bir şekilde bittikten sonra “docker images” komutu ile oluşan imajımızı görebilir.

 

docker run –name sample -p 5001:5001 sample/web-api:1.0.0” komutu ile uygulamamı ayağa kaldırıyorum. Basitçe bir .net core apimizi dockerize etmiş olduk.

 

Singleton Desing Pattern

Singleton patterni ile bir nesnenin çalışma zamanında tek olmasını garanti edebiliriz. Böyle söyleyince kafamızda bir şeyler canlanmadıysa daha somut örnekler veriyim. Örneğin;

  • veritabanı kullandığımız uygulamalarımızda connectionString bilgisini okumak için kullanabiliriz.
  • Projemizdeki konfigürasyon bilgilerini okumak için de kullanabiliriz.

 

İmplementasyonu çok basit. Aşağıdaki UML şemamızı inceleyerek işe başlayalım.

  • Singleton isimli bir class oluşturduk.
  • Bu class’ın constructorını private olarak tanımlıyoruz. Bunun sebebi ise herkes Singleton singleton=new Singleton() şeklinde belleğe yeni bir nesne yaratmasını engellemek.
  • Yine private olarak Singleton tipinde bir _instance yaratıyoruz.
  • Bu nesneye ulaşmak için ReturnInstance tipinde public bir metot yazıyoruz.
Bu şekilde classımız yazmış olduk. Ama asenkron işlemlerde kullanmak istersek bu metodumuzu thread safe hale getirmeliyiz. Bunu da lock koyarak halledebiliriz.
 

 

.NET Core ve Redis Kullanarak Distributed Cache Mekanizması Kurma

Redis Nedir?

Redis özünde key-value tipinde NoSQL bir veritabanıdır.  En önemli artısı ise verileri bellekte tutmasıdır. Çoğunuzun aklına bizim çok datamız var bu kadar belleği nereden bulacağız gibi sorular gelebilir. String-string tipinde datalar tutuyorsak 1M adet data 100 mb gibi bir yer kaplıyor.

Öncelikle Redis’i yükleyelim;

  • Komut satırını yönetici olarak çalıştırıp aşağıdaki kodu çalıştıralım.
  • Chocolatey yüklendikten sonra şimdi de Redis’i yükleyelim
  • Komut satırına “redis-server” yazdığımızda aşağıdaki gibi bir ekranla karşılaşmamız lazım.

Şimdi bir tane .NET Core Web API oluşturalım. Bu örnek projede database first olarak ilerleyeceğim. Hedefim ise öğrenci bilgilerini bu öğrencinin aldığı dersleri tutmak üzerine olacak. Basitçe aşağıdaki veritabanını tasarladım.

Şimdi API endpointlerimizi oluşturalım ve cache olmadan bir benchmark çalıştıralım. Sonuçlarımıza bakalım.

ID’si girilen öğrencinin adını soyadını ve aldığı dersleri bize dönen endpointimiz yazdık.

Şimdi “ab – Apache HTTP sunucusu başarım ölçme aracı” ile sunucumuza yük bindirelim.

Şimdi projemize Redis Cache ekleyelim.

  • Nuget üzerinden “Microsoft.Extensions.Caching.Redis.Core” paketini yükleyelim.
  • Controllerimize aşağıdaki değişkeni global olarak ekleyelim.
Controllerimizde gerekli değişikleri yapalım.
Benchmark sonuçlarımıza göz atalım.

 

Kaynak kod: https://github.com/limanerkan/RedisTutorial