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:
Sali
1
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:
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
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
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:
A
X
7
X
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;İ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.
bool yanlis = false;
Ö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:
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
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
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();
}
{
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
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();
}
{
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
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();
}
{
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();
}
{
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();
}
{
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();
}
{
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