16 Kasım 2020 Pazartesi

Docker Container Yapısı -1

Bu yazıda Docker Container yapısında yer alan Docker CLI kullanımına, komutlarına ve bilmemiz gerek temel özelliklere değinmeye çalışacağım.

Docker CLI (Command Line Interface): Bir docker kurulumu yaptığımızda sisteme yüklenen ve o Docker Engine yi yönetmemizi sağlayan komut satırı ara yüzüdür.

terminal satırına aşağıda ki komutu yazarak makinemizde kurulu olan docker engine hakkında bilgileri görelim:

docker info

komut çalıştırıldığında, makinemizde kurulu olan docker engine hakkında ki bilgileri ekrana yazar.




Çıktıda göreceğimiz gibi mevcutta kaç containerımız var, bu containerların kaç tanesi çalışıyor kaç tanesi durmuş durumda gibi temel bilgilere docker info komutu ile ulaşabiliriz.

Docker içinde kullanabileceğimiz bütün komutlara erişmek için komut satırına "docker" yazmamız yeterli olacaktır

docker

Terminal satırına "docker" komutunu yazıp çalıştırırsak Docker içinde kullanabileceğimiz bütün komutları görmüş oluruz.




Ekran çıktısında Management Commands ve Commands başlıkları altında kullanabileceğimiz komut formatlarını görebiliriz.


Docker ilk ortaya çıktığında komut satırı docker command ( docker run hello-world gibi) şeklindeydi. Bu kullanım Docker'ın geriye dönük uyumlu olamak istemesinden hala çalışıyor.
Docker geliştikçe ve daha kompleks işlemler yapmaya başladıkça komut satırını üç kademeli bir yapıya geçirdi. Bu nedenle hemen hemen her Command kendi Management komutuna sahip oldu. Bu üç kademeli yapıyı da docker management-command command( docker conntainer run hello-world ) şeklinde yapılandırdı.

Kısacası Docker da hangi Management Command ile işlem yapmak istiyorsak önce onu yazıyoruz ardından Command komutunu yazıyoruz. Bu kısımda bütün komutları ezberlememize tabi ki olanak yok. Ezberlemeye çalışmak yerine --help yardım komutunu kullanmak bizim için daha faydalı olacaktır. Mesela "image" lerle ilgili bir işlem yapmak istiyoruz, terminal satırına docker image --help komutunu yazalım.

docker image --help




Ekran çıktısından da gördüğünüz gibi image Management Commands'ı ile yapabileceğimiz komutlar karşımıza çıkıyor. Örnek olarak bir tane image silmek istiyorsak. Commands lara baktığımızda silme komutunun "rm" olduğunu görüyoruz. Peki "docker image rm" komutunu nasıl kullancağız?
Komut satırına "docker image rm --help" yazarsak image içinde "rm" i nasıl kullanabileceğimizi bize gösterecektir.




En üstte gördüğümüz gibi docker image rm [OPTIONS] IMAGE [IMAGE...] yapısıyla image management-commands' ını kullanabiliyoruz.
Örnek olarak:

docker image rm -f hello-world

Docker Container:
Bir docker container'ı nasıl oluşturacağımızı komut satırına "--help" fonksiyonu ile öğrenelim.

docker container --help




Ekran çıktısını incelediğimizde "create" komutu bir container oluşturmamızı, "start" komutu ise o container'ı başlatmamızı sağlıyor.
Her defasında önce container'ı oluşturup sonra start ile çalıştırmak yerine "run" komutunu da kullanabiliriz. Bu komut (run) yukarıda da açıklandığı gibi container yoksa önce oluşturuyor sonra da çalıştırıyor.

Peki docker container run komutunu nasıl kullanacağız?

docker container run --help

Bu komutu yazdığınızda karşınıza uzunca bir liste çıkacaktır. Bu listeyi inceleyip farklı komutlar kullanabilirsiniz. Ben örnek olması amacıyla "run" komutunu inceleyeceğim.

Ekran çıktısında önemli olan kısım Usage kısmıdır. Docker, Usage kısmında bu komutu nasıl kullanacağımızı  bize söylüyor.                                                                                                                                                                                                                   
"Usage:  docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]"

docker container run daha sonra girmek istediğim bir "OPSIONS" varsa bunu yazıyorum sonra hangi "IMAGE" den bir container yaratmak istiyorsam o image'nin adını giriyorum en son olarak ta bu image içinde farklı bir komut çalıştırmak istiyorsam o komutları giriyorum. Hadi deneyelim:

docker container run --name ilkcontainer emrahakin/ilkcontainer
Komut satırına aşağıda ki komutu yazdığımızda ilkcontainer adında emrahakin/ilkcontainer image sinden bir container oluşturacağız.
docker container run --name ilkcontainer emrahakin/ilkcontainer 




Görüldüğü gibi docker run komutundan sonra emrahakin/ilkcontainer image si bizde olmadığı için önce docker hub dan bu image yi çekti ve ardından bu image den ilkcontainer isminde bir container oluşturdu ve container içerisinde ki uygulamayı çalıştırdı "Merhaba İlk Container Başarıyla Oluşturuldu" yazısını yazdı ve container kapatıldı.

https://github.com/emrakin/DockerLearningRepo/tree/main/CreateDockerImage/CreateDockerImage  dilerseniz bu linkte ki Dockerfile dosyasını ve ilkcontainer olarak indirdiğimiz .NET Console Uygulamasını inceleyebilirsiniz.

docker container ls -a
Komut satırına docker container ls -a yazarsak sistemimizde oluşturulmuş bütün container ları görebiliriz. (-a yazmazsak sadece çalışan container ları görebiliriz.)

ilkcontainer isimli container a baktığınız da "STATUS" kısmında Exited (yani kapatılmış) yazdığını göreceksiniz. Kapatılmasının sebebini şöyle açıklayabiliriz.
Bir docker imajından container oluşturduğumuz zaman içinde  varsayılan olarak çalışması için bir uygulama vardır. Bu uygulama çalıştığı sürece container ayakta kalır. Uygulama çalışmayı bıraktığı zaman container da kapanır. Bizim docker imajımızda yer alan uygulama da ekrana "Merhaba İlk Container Başarıyla Oluşturuldu" yazısını yazdıktan sonra kapandığı için ilkcontainer adında oluşturduğumuz container da Exited olmuş durumda. Yukarıda da bahsettiğim gibi ben burada bir .NET Console App uygulaması yaptım Dockerfile ve uygulamaya https://github.com/emrakin/DockerLearningRepo/tree/main/CreateDockerImage/CreateDockerImage bu linkten ulaşabilir ve inceleyebilirsiniz.

Bir sonra ki anlatımda container yapısına devam edeceğim ve bir web uygulamasının docker içinde nasıl çalıştırıldığından bahsedeceğim.

13 Mart 2020 Cuma

C# Dersleri 9 - Veri Tipleri : Enum Veri Tipi


Enum Veri Tipi

Enum, sabitlerle tanımlanmış ayırt edici bir veri tipidir. Enum kullanmanın en temel amacı, programlamada "magic string" denilen değerler tutmak yerine bir Enum sabiti ile bu değerleri getirmektir.

magic string nedir derseniz? Mesela
string gunler = "Salı";
gibi bir değişken tanımladığımızda burada ki "Salı" bir magic stringtir.

Eğer Günlerden birini getirmek istiyorsak bir Enum sabiti vasıtasıyla bunu yapabiliriz.

Örnek Uygulama:

Örnek Çıktısı:
Sali
1

Uygulamanın çıktısına baktığımızda "(int)Gunler.Salı" için "1" değerini verdiğini görüyoruz. Enum sabitleri de eğer bir tanımlama yapılmamışsa "Pazartesi=1 gibi" değerlerini sıfırdan başlatırlar.

Enum sabitlerinin "if" bloglarıyla kullanımı içinde bir örnek uygulama yazalım.

if bloglarına bir sonra ki yazıda değineceğiz fakat enum sabitlerini anlamamız için güzel bir örnek olacağını düşünüyorum

Örnek Uygulama:

Örnek Çıktısı:
Seçtiginiz Gün Haftasonu Günü Degildir


Github Adresi : https://github.com/emrakin/CSharpDersleri

Tüm Derslerin Listesi için Tıkla




C# Dersleri 8 - Veri Tipleri : Decimal Veri Tipi

Decimal Veri Tipi

Decimal veri tipleri 128 bitlik gerçek sayı değerleridir. Integer için long neyse double içinde decimal odur.

Decimal değişkeninde eğer tam sayı olmayan bir değer tutmak istiyorsak sayının sonuna M veya m harfini koymamız ve bu değerin bir decimal değişkeni olduğunu belirtmemiz gerekmektedir. Bunun sebebi C# ortamında ondalıklı sayıların varsayılan değeri double'dır. 

Decimal değişkeninde bir tam sayı kullanacaksak sonuna bu M veya m harfini yazmamıza gerek yoktur.

Örnek Uygulama:

Örnek Çıktı:
Birinci sayi: 10
Ikinci sayi: 10.5
Üçüncü sayi: -10
Dördüncü sayi: -10.5
Maksimum deger: 79228162514264337593543950335
Minimum deger: -79228162514264337593543950335

Github Adresi : https://github.com/emrakin/CSharpDersleri

Tüm Derslerin Listesi için Tıkla

12 Mart 2020 Perşembe

C# Dersleri 7 - Veri Tipleri : Double Veri Tipi

Double Veri Tipi

Double veri tipleri 64 bitlik gerçek sayı değerleridir. Double olarak tanımlanmış değişkenlerde tam sayılardan farklı olarak ondalıklı sayıları da tutabiliriz.

double deger = 10.4;

Örnek Uygulama: 



Örnek Çıktı: 

Birinci degisken: 243.14
Ikinci degisken: -1432
Maksimum deger: 1.7976931348623157E+308
Minimum deger: -1.7976931348623157E+308


Github Adresi : https://github.com/emrakin/CSharpDersleri

Tüm Derslerin Listesi için Tıkla

C# Dersleri 6 - Veri Tipleri : Char Veri Tipi

Char Veri Tipi

Char veri tip 16 bit uzunluğunda unicode standartlarında karakterlerin karşılığını tutan bir veri tipidir. Her karakterin unicode standartları çerçevesinde bir karşılığı bulunmaktadır ve char tipinde ki değişkene bir değer atandıktan sonra o değişken bir karakteri temsil etmektedir.

Char veri tiplerine doğrudan karakter atayabilirsiniz.
char deger1 = 'A';
 Char veri tipine hexadecimal karakter karşılında değer atabilirsiniz.
char deger2 ='\x0058'
Char veri tipine ASCII sayısal karşılığından Char tipine dönüşüm yapabilirsiniz.
char deger3 = (char)55;
Char veri tipine Unicode karakter ataması yapabilirsiniz.
char deger4 = '\u0058';

Örnek Uygulama:


Örnek Çıktı:

A
X
7
X

Github Adresi : https://github.com/emrakin/CSharpDersleri

Tüm Derslerin Listesi için Tıkla

C# Dersleri 5 - Veri Tipleri : Bool Veri Tipi

Bool Veri Tipi

Bool veri tipi "Doğru" veya "Yanlış" olmak üzere iki değer alabilen mantıksal bir veri tipidir. Daha çok kontrol işlemlerinde kullanılır. 
bool dogru= true;
bool yanlis = false;
İleri ki yazılarda şart ve kontrol bloklarını incelerken bool değişkenini bolca kullanacağız. Şimdilik sadece iki değer aldığınız ve bunları "True" veya "False" olduğunu bilmeniz yeterli olacaktır.

Örnek bir uygulama da bunu göstermek istersek. Mesela elimizde değeri 8 olan integer bir değişken olsun ve bunun 12 den büyük olup olmadığını kontrol edelim.

Örnek Uygulama:



Örnek Çıktısı:
False

sayi değişkenine atadığımız 8 değeri 12 sayısından küçük olduğu için sonuç "False" olarak döndü.

Son olarak bool veri tipinin de bir Değer Tipi olduğunu unutmayın.

Github Adresi : https://github.com/emrakin/CSharpDersleri

Tüm Derslerin Listesi için Tıkla

C# Dersleri 4 - Veri Tipleri : Byte Veri Tipi

Byte Veri Tipi:

Byte(byte) tam sayıları tuttuğumuz 8 bitlik veri depolayan bir değer tipidir.

Byte veri tipi 0 ile 255 arasında ki değerleri alabilir. Görüldüğü üzere eksi (negatif) bir tam sayı değeri alamaz.

Örnek Uygulama:



Örnek Çıktı:
Ilk Sayi: 5
Ilk Sayi: 8
Max Sayi: 255
Min Sayi: 0


Github Adresi : https://github.com/emrakin/CSharpDersleri

Tüm Derslerin Listesi için Tıkla

C# Dersleri 3 - Veri Tipleri : Short Veri Tipi

Short Veri Tipi:

Short(short) tam sayıları tuttuğumuz 16 bitlik veri depolayan bir değer tipidir.

Integer ve Long veri tiplerine göre bellekte daha az yer kaplarlar ve değer aralıkları da daha küçüktür. Short veri tipi -32768 ile 32767 arasında ki değerleri alabilir.
short ilknumara = 10;

Örnek Uygulama:

Örnek Çıktı:
Ilk Sayi: 10
Ilk Sayi: -15
Max Sayi: 32767
Min Sayi: -32768



Github Adresi : https://github.com/emrakin/CSharpDersleri

Tüm Derslerin Listesi için Tıkla

11 Mart 2020 Çarşamba

C# Dersleri 2 - Veri Tipleri : Long Veri Tipi

Long Veri Tipi:

Bir önce ki yazı da Integer Veri Tipini öğrendik ve -2147483648 ile 2147483647 arasında değer alabileceğini belirttik. Peki kullanmak istediğim değer bu sayı değerlerinin arasında yer almıyorsa ne yapmalıyız? 

Bu tarz durumlarda integer veri tipinden daha büyük aralığa sahip"long" veri tipini kullanabiliriz. Long veri tipi integer veri tipinin aldığı her değeri alabilir.

long ilknumara = 2147483647 ;
Burada aklınıza şu soru gelebilir. Madem long veri tipi integer veri tipinin aldığı tüm değerleri ve daha fazlasını alabiliyor o zaman neden integer kullanayım her değişkeni long tanımlarım.

Long veri tipi 64 bitlik veri depolamasından dolayı bellek üzerinde kapladığı alan integer veri tipinden büyüktür. Bu bakımdan zorunlu kalınmadıkça (integer ihtiyacımızı karşılıyorsa) long veri tipini kullanmak bellek üzerinde fazladan bir alan kaybına neden olacaktır.

Bellekte ayrılan alanın, tuttuğumuz değerle bir alakası yoktur, değer tipimizle bir alakası vardır. Bu bakımdan long veri tipinde değeri 15 olan bir değişkeni tutmak istediğimizde kullandığımız bellek alanı ile int veri tipinde değeri 15 olan bir değişkeni tutmak istediğimizde kullandığımız bellek alanı arasında fark vardır.

Bu bakımdan integer ihtiyacımızı karşılıyor iken long veri tipini tutmamızın bir anlamı yoktur.


Örnek Uygulama:
static void Main(string[] args)
{
    long ilknumara = 92233720368547;
    long ikincinumara = -92233720368547;

    Console.WriteLine("İlk Sayı: {0}", ilknumara);
    Console.WriteLine("İkinci Sayı: {0}", ikincinumara);
    Console.ReadLine();
}


Uygulama Çıktısı:
    Ilk Sayi: 92233720368547
    Ikinci Sayi: -92233720368547


Long veri tipinin değer aralığı –9,223,372,036,854,775,808 ile 9,223,372,036,854,775,807 arasındadır.


Örnek Uygulama:
static void Main(string[] args)
{
    long ilknumara = 92233720368547;
    long ikincinumara = -92233720368547;

    long maxdeger = 9223372036854775807;
    long mindeger = -9223372036854775808;

    Console.WriteLine("İlk Sayı: {0}", ilknumara);
    Console.WriteLine("İkinci Sayı: {0}", ikincinumara);

    Console.WriteLine("Max Sayı: {0}",maxdeger);
    Console.WriteLine("Min Sayı: {0}",mindeger);

    Console.ReadLine();
}


Uygulama Çıktısı:
    Ilk Sayi: 92233720368547
    Ikinci Sayi: -92233720368547
    Max Sayı: 9223372036854775807
    Min Sayı: -9223372036854775808


Github Adresi : https://github.com/emrakin/CSharpDersleri

Tüm Derslerin Listesi için Tıkla

C# Dersleri 1 - Veri Tipleri : Integer Veri Tipi


Değer ve Referans Tipleri

C# dilinde iki tür veri tipi mevcuttur.Bunlar değer ve referans tipleridir. Değer tipleri; veriyi taşıyan ve taşıdığı veriye göre bellek üzerinde yer dolduran değişken türleridir. Referans türleri ise, bellek bölgesinde veri yerine verinin bellekteki adresini tutarlar ve o adresin gösterdiği yerde de veri tutulur.

Değer tipleri:  "int", "long", "float", "double", "decimal", "char", "bool", "byte", "short", "struct", "enum"
Referans tipleri:  "string", "object", "class", "interface", "array", "delegate", "pointer"

Integer Veri Tipi:

Integer (int) tam sayıları tuttuğumuz 32 bitlik veri depolayan bir değer tipidir (Value Type). Integer bir veri tipini tanımlamak için int keyword ünden faydalanırız. 
Eğer veri tipi integer ve değeri 15 olan bir değişken tanımlamak istersek.
int ilknumara = 15; 
bura da "int" veri tipini, ilknumara değişkeni, 15 ise değeri ifade eder.



static void Main(string[] args)
{

     int ilknumara = 10;
     Console.WriteLine(ilknumara);
     Console.ReadLine();

}

Burada kodu çalıştırdığımızda konsol ekranına "10" yazacaktır.

static void Main(string[] args)
{

     int ilknumara = 10;
     Console.WriteLine("İlk Sayı: {0}",ilknumara);
     Console.ReadLine();

}

Kodumuzu bu şekilde yazdığımız da ise konsol ekranında "İlk Sayı: 10" yazacaktır. Burada küme parantezi içine yazdığımız "0" virgülde sonra ki ilk değerdir. Bu olaya index denir ve çoğu programlama dilinde index sıfırdan başlar.

Bu örnekler projenin github reposunda yer almaktadır.


Integer ile ilgili sınırlara gelecek olursak mesela aşağıda ki kodu şu şekilde değiştirsek;

static void Main(string[] args)
{
            int ilknumara = 10;
            int ikincinumara = -10;
            Console.WriteLine("İlk Sayı: {0} - İkinci Sayı: {1}",ilknumara,ikincinumara);
            Console.ReadLine();

}

ve programı çalıştırırsak konsol ekranına 10 ve -10 değerlerini yazacaktır. Demek ki integer veri tipi eksi değerde alabilmektedir.

Bunun yanında bütün veri tiplerinin bir sınırı vardır. Integer veri tipinin sınırı -2147483648 ile 2147483647 arasındadır.


static void Main(string[] args)
{
            int ilknumara = 10;
            int ikincinumara = -10;
            Console.WriteLine("İlk Sayı: {0} - İkinci Sayı: {1}",ilknumara,ikincinumara);
 

            int maxnumara = 2147483647;
            int minnumara = -2147483648;
            Console.WriteLine("Max Sayı: {0} - Min Sayı: {1}", maxnumara, minnumara);
            Console.ReadLine();

}


Github Adresi : https://github.com/emrakin/CSharpDersleri

Tüm Derslerin Listesi için Tıkla