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 :

İşletim Sistemi
Bilgisayar ö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

https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?utm_source=docker&utm_medium=webreferral&utm_campaign=dd-smartbutton&utm_location=module

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ç :

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
Exec komutu

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