Docker Uzerine Redis Kurulumu ve .Net Core ile Redise Erişim
Orcun Ten
Docker Nedir ve Ne İşe Yarar
Docker, uygulamalarınızı hızla derlemenize, test etmenize ve dağıtmanıza imkan tanıyan bir yazılım platformudur. Docker, kodunuzu çalıştırmanın standart bir yolunu sağlayarak çalışır. Docker, container'lara yönelik bir işletim sistemidir. Bir sanal makinenin sunucu donanımını sanallaştırmasına (doğrudan yönetme gereksinimini ortadan kaldırma) benzer şekilde container'lar da bir sunucunun işletim sistemini sanallaştırır. Docker her sunucuya yüklenir ve container'ları oluşturmak, başlatmak veya durdurmak için kullanabileceğiniz basit komutlar sağlar. LXC (Linux Container) üzerine kurulu bir teknoloji olan Docker, aynı linux işletim sistemi üzerinde birbirinden izole bir biçimde çalışan konteynerler oluşturmaktadır. Her bir konteyner bir process kullanmakta ve bu sayede konteynerler kolaylıkla çoğaltılabilmektedir. Ayrıca Docker, klasik sanal makinelerden (vmware, virtualbox vb.) farklı olarak bir Hypervisor katmanına sahip değildir. Bunun yerine Docker Engine üzerinden konak işletim sistemine erişerek sistem kaynaklarını paylaşımlı kullanır.
Image : İçerisinde uygulamaları barındıran container oluşturmak için kullanılan onceden hazırlanmış paketlerdir.
Container : İmagelardan türetilen host os üzerinde çalışan veya çalışmaya hazır ortamlardır.
Dockerfile : İmage üretmek için önceden belirlenmiş kuralları ve komutları içeren dockera özel dosya yapısı.
DockerHub : Docker imageların paylaşıldığı community deposu diyebiliriz. Bir çok official image barındırılmaktadır.
Redis (Remote Dictionary Server) Nedir ve Ne İşe Yarar
Redis, verileri disklerde (HDD veya SSD) tutan veri tabanlarının aksine bellek (RAM) üzerinde tutar bu sayede disklere erişim ihtiyacını ortadan kaldırarak gecikmeleri, I/O bağlantılarını önler ve daha az CPU kullanan basit algoritmalar ile verilere erişir. Load Balancer’a sahip bir ekosistemde Cachleri ortak bir sunucuda tutmaya yardımcı olur. Sıkça çekilen data sorgu sonuçlarını daha hızlı getirmeyi sağlar. Redis, verileri RAM bellek üzerinde tuttuğunu söylemiştik. Bu durumda eğer bir elektrik kesintisi veya sistemin yeniden başlatılması durumunda tüm veriler kaybolacağından bunun için Redis bize iki yöntem sunmaktadır.
Point-in-time Snapshots: Snapshots yönteminde belirli zaman aralıkları ile RAM üzerindeki verinin kaydı, kopyası diske kayıt edilir bu sayede olası bir elektrik kesintisi gibi durumlarda disk üzerinden verilere tekrar geri dönülebilir.
Append Only File (AOF): Append Only File yönteminde ise her değişikliği dosyanın sonuna yazarak oluşan veri değişikliklerinin kaydını tutar.
Windows Üzerinde Docker Kurulması
İşletim sisteminin docker’ı desteklediğinden emin olunmalı.
Kurduğum İşletim Sisteminin Özellikleri :


WSL (Windows Subsystem for Linux) Kurulumu :
WSL herhangi bir sanallaştırma uygulaması kurmadan (VMware Workstation, VirtualBox vs. gibi) Linux işletim sistemlerini doğrudan Windows işletim sistemi mimarisi üzerinde çalıştırabileceğimiz Microsoft teknolojisidir. WSL teknolojisinin bir Windows işletim sisteminde çalıştırılabilir olması için işletim sisteminin sürüm yapısı minimum Windows 10 version 1903 olması gerektiğini de unutmamak gerekir.
PowerShell Run As Admin
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
PowerShell Run As Admin
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
WSL2 Linux Kernel güncellemesi için “wsl_update_x64.msi” paketi kurulur.
İndirme Linki
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
Docker Download :
Docker’ın resmi sitesinden Docker Desktop for Windows indirilir.
İndirme Linki
Kurulum Esnasında Dikkat Edilmesi Gerekenler:
İndirilen exe çalıştırıldıktan sonra EnableWSL 2 Windows Feature check edilmelidir.
Kurulum Sonrası Test :
PowerShell Run As Admin
docker ps
Dönmesi Gereken Sonuç :

Error response from daemon: Bad response from Docker engine Hatası verirse Quit Docker Desktop denilerek Docker yeniden başlatılmalıdır.
Docker üzerine Redis Kurulması
Docker üzerinde Redis’in son versiyonun indirilmesi
PowerShell Run As Admin
docker pull redis
Docker üzerine Redis Container oluşrurulması
ContainerName = y-redis
Redis Default Port = 6379
Redise Dışarıdan Ulaşılacak Port Adresi = 7000 (Tercih Meselesi)
PowerShell Run As Admin
docker run --name y-redis -p 7000:6379 -d redis
Oluşturulan Redis Container’ı görüntülemek için aşağıdaki kod çalıştırılır ve oluşturulan Redis Container gözlemlenir.
PowerShell Run As Admin
docker ps
Docker Üzerinden Redise Erişme ve Cache Değer Yazıp Okuma İşlemleri :
Oluşturulan y-redis Container’a sh bağlantısı yaparak deneme key’ine ‘araba’ value değeri set komuduyla setlendi. Belirtilen key’in içerisindeki değeri okuma get <key-name> komuduyla sağlandı. Redis’in Docker içerisinde 6379 Portundan çalıştığına dikkat edilmelidir. Dışarıdan (Yazdığımız Program veya Third Part uygulamalardan) ulaşılmak istendiğinde kendi belirlediğimiz Port Numarası (7000) üzerinden erişim sağlanacaktır.
PS C:\Windows\system32> docker exec -it y-redis sh
# redis-cli
127.0.0.1:6379> set deneme 'araba'
OK
127.0.0.1:6379> get deneme
"araba"
127.0.0.1:6379> get deneme

C# .Net Core 7 Üzerinden Redis Kullanımı
Yazılan kodlarda anlaşılması kolay olması amacıyla değişkenler kullanılmamıştır. Profesyonel yazımlarda Key isimleri değişkende, bağlantı bilgileri (localhost:7000) appsettings.json dan okunmalıdır. Kullanılan Methodların Async Methodları mevcut. Async Methodların kullanılması tavsiye edilir.
İndirilecek Nuget Package
StackExchange.Redis 2.6.111
Redis Bağlantı ve CRUD işlemler
Kodların Daha iyi anlaşılması için fonksiyon haline getirmeden CRUD işlemlerini yapan kodlar aşağıda verilmiştir.
using StackExchange.Redis;
// Docker üzerindeki Redis'e erişim.
ConnectionMultiplexer cm = ConnectionMultiplexer.Connect("localhost:7000");
// Redis içindeki bir veritabanına etkileşimli bir bağlantı elde edin.
IDatabase _cache = cm.GetDatabase();
// AdSoyad Keyi üzerine 1 saatlik setleme
bool setRes = _cache.StringSet("AdSoyad", "Orçun TEN", TimeSpan.FromHours(1));
if (setRes)
{
// AdSoyad Keyindeki değeri getirme
RedisValue getRes = _cache.StringGet("AdSoyad");
if (!getRes.IsNull)
{
Console.WriteLine(getRes.ToString()); // Responce : Orçun TEN
}
}
// AdSoyad Keyi üzerine 1 saatlik yeni değer setleme
bool setResUpdate = _cache.StringSet("AdSoyad", "Orçun TEN Update", TimeSpan.FromHours(1));
if (setResUpdate)
{
// AdSoyad Keyindeki değeri getirme
RedisValue getRes = _cache.StringGet("AdSoyad");
if (!getRes.IsNull)
{
Console.WriteLine(getRes.ToString()); // Responce : Orçun TEN Update
}
}
// Key içinde tutuğu değeri silme
_cache.KeyDeleteAsync("AdSoyad");
// Clear Cache
var endpoints = cm.GetEndPoints(true);
foreach (var endpoint in endpoints)
{
var server = cm.GetServer(endpoint);
server.FlushAllDatabases(); // Run As Admin Modda çalışır
}
.Net Core Web App Üzerinde Program.cs Yapılandırması
IConfiguration configuration = builder.Configuration;
var multiplexer = ConnectionMultiplexer.Connect(“localhost:7000”);
builder.Services.AddSingleton<IConnectionMultiplexer>(multiplexer);
Last updated