Docker Nedir?

Docker, uygulamaların ve bu uygulamaların çalışması için gerekli tüm bağımlılıkların bir arada paketlendiği izole ve taşınabilir bir ortam olan containerlar içinde çalıştırılmasını sağlayan bir platformdur. 

Bu teknolojinin temel amacı, uygulamaların her ortamda (örneğin, geliştiricinin bilgisayarı, test sunucusu veya üretim ortamı) aynı şekilde çalışmasını sağlamaktır. Docker’ın ne olduğunu anlamak için ilk önce Container sisteminin ne olduğunu anlamak gerekmektedir.

Container Nedir?

Container, bir uygulamanın çalıştırılması için gerekli olan tüm bağımlılıkları (kütüphaneler, dosyalar, ortam değişkenleri vb.) bir araya getirerek, uygulamayı yalıtılmış bir ortamda çalıştıran birimdir. Her bir container, kendi dosya sistemine ve ağ bağlantılarına sahip olabilir. Bu sayede, bir container diğerleriyle izole edilmiştir ve birbirlerini etkilemezler.

Container Nasıl Çalışır?

Docker gibi container teknolojileri, bir uygulamayı çalıştırmak için gereken tüm bileşenleri içeren bir imajdan yola çıkarlar. Bu imaj, bir temel dosya sistemini (örneğin, Ubuntu, Linux gibi) ve uygulamanın çalışması için gereken diğer tüm dosyaları içerir. Docker, bu imajı kullanarak bir container oluşturur ve bu container içinde uygulamayı başlatır.

Container'lar,sanal makinelere çok benzerler  fakat bir sanal makine gibi değildir. Çünkü her sanal makinenin kendi içinde barındırdığı bir işletim sistemi vardır fakat bir container, bir ana işletim sistemi çekirdeğini paylaşır ve işletim sistemi seviyesinde izolasyon sağlar. Bu, container'ların daha hafif ve daha hızlı başlatılabileceği anlamına gelir.

Yukarıdaki görselde de görüldüğü gibi Container sistemi olmadan bir web projemizin nasıl işleyeceği gösterilmiştir. Projedeki bu componentlerin her biri işletim sistemi üzerindeki kütüphaneleri ve bağımlılıkları kullanmaktadırlar. İşte bu yapı beraberinde birçok sorunu meydana getirir.

-          Kütüphane ve bağımlılıkların birbirini etkilemesi,

-          Componentlerin kullandığı işletim sitemi sürümlerinin çakışması, Yani bir component için işletim sistemi üzerinde değişiklik yapılmak istenildiğinde diğer componentlerin de bu değişikliğe uyum sağlaması gerekmektedir.

-          Geliştirme ortamı oldukça zor ve zaman adına maliyet gerektiyor

Bu gibi sorunların çözülmesi için container sistem kullanılır ve izolasyonu sağlayarak daha stabil çalışılması sağlanır. Her container, içerisinde projenin componentlerine ait kütüphaneleri ve bağımlılıkları barındırır. Bu şekilde hiçbir uyumsuzluk sorunu yaşanmaz.

Bu container içerisindeki kütüphanelerin ve bağımlılıkların işletim sistemi ile haberleşmesini ise araya kurmuş olduğumuz Docker üstlenir.

Container kullanımı Docker ile birlikte ortaya çıkan bir süreç değildir. Yaklaşık 10 yıldır container sistemi zaten kullanılmaktadır fakat Container sistemini yönetmek oldukça zor ve low level bir işlem olduğu için Docker bize bu container’ları yönetmek için high level bir çok araçlar sunuyor.

Container’ın  LXC, LXD, LXCFS gibi türleri bulunmaktadır. Docker bunlar içerisinden LXC türünü kullanmaktadır.

 

Docker Bileşenleri Nelerdir?

·       Docker Engine: Docker'ın temel çalışma zamanıdır. Docker Engine, bilgisayarınızda veya sunucunuzda çalışır ve Docker konteynerlerinin oluşturulması, çalıştırılması ve yönetilmesi için gerekli olan tüm işlevleri sağlar. Docker Engine, Docker Daemon ve Docker Client olarak iki ana bileşenden oluşur.

o   Docker Daemon: Docker'in arka planda çalışan bileşenidir. Konteynerlerin oluşturulması, çalıştırılması, durdurulması ve yönetilmesi gibi görevleri gerçekleştirir.

o   Docker Client: Kullanıcıların Docker ile etkileşimde bulunmasını sağlayan bir araçtır. Kullanıcılar, Docker Client aracılığıyla Docker komutlarını çalıştırarak konteynerler oluşturabilir, yönetebilir ve izleyebilirler.

·       Docker Container: Bir Docker konteyneri, bir uygulamanın çalıştırılması için gerekli olan tüm bağımlılıkları içeren ve izole edilmiş bir ortamdır. Her bir konteyner, kendi dosya sistemi, ağ bağlantıları ve süreçleriyle birlikte çalışır. Docker konteynerleri hızlı bir şekilde oluşturulabilir, başlatılabilir, durdurulabilir ve taşınabilir.

 

·       Dockerfile: Docker’a temel bir image belirtmek için kullanılan metin belgesidir. Dockerfile içerisinde hangi Image’ın kullanılacağı, hangi dosyaları içereceği ve hangi uygulamanın hangi parametrelerle çalışacağı yazılır.

Yeni bir Docker Image’ı çalışırken, sıfırdan oluşturulan Docker Engine ilk önce boş bir Image ile başlar. Docker, Dockerfile dosyasında bulunan komutları sırayla tek tek çalıştırır. Her komut yeni bir katman oluşturur ve Docker build sonunda katmanlardan oluşan yeni bir Docker Image oluşur.


Docker File Örneği;

·       Docker Image: Docker konteynerlerinin temelidir. Bir Docker imajı, bir uygulamanın çalıştırılması için gereken tüm dosyaları ve yapılandırmayı içeren bir şablondur. Bir imaj, Dockerfile adı verilen bir dosyada tanımlanır ve Docker Engine tarafından işlenir. Bir imaj, bir uygulamanın kodunu, çalışma zamanını, kütüphaneleri ve diğer bağımlılıkları içerir.Örnek olarak; Image’lar, yemek tarifini içeren bir kitaptır ve bu kitapta yemek tarifinin tüm ayrıntıları bulunur. Container ise, bu yemek tarifini uygulayan bir kişidir ve bu kişi tarif doğrultusunda yemek pişirir. Bu örnekte, image yemek tarifi olarak, container ise yemek pişirme sürecidir.

·       Docker Registry: Docker imajlarının depolandığı ve paylaşıldığı bir merkezdir. Genellikle, Docker Hub gibi genel bir Docker Registry kullanılır. Ancak, kendi özel Docker Registry'nizi de oluşturabilir ve kullanabilirsiniz. Docker Registry, Docker imajlarının paylaşılmasını ve dağıtılmasını sağlar.

Örnek Senaryo;

Diyelim ki bir yazılım geliştirme ekibi, bir web uygulamasını Docker kullanarak geliştirmeye başlıyor:

  1. Geliştirme Ortamı Kurulumu: Her bir geliştirici, kendi bilgisayarında Docker Engine'i kurarak geliştirme ortamını oluşturur. Docker Engine, her bir geliştiricinin kendi işletim sistemi üzerinde ortak bir geliştirme ortamına sahip olmasını sağlar.
  2. Uygulamanın Dockerfile ile Paketlenmesi: Proje klasörü içinde bir Dockerfile oluşturulur. Dockerfile, uygulamanın nasıl paketleneceğini ve çalıştırılacağını tanımlar. Dockerfile'da, uygulamanın çalışma zamanı, bağımlılıkları ve diğer yapılandırmalar belirtilir.
  3. Docker Image Oluşturulması: Dockerfile kullanılarak bir Docker imajı oluşturulur. Bu imaj, uygulamanın tüm bağımlılıklarını içerir ve Docker Registry'e yüklenmek üzere hazırdır.
  4. Uygulamanın Test Edilmesi: Docker imajı, test ortamına dağıtılarak uygulamanın test edilmesi sağlanır. Docker, test ortamında izole bir konteyner oluşturur ve uygulamanın doğru çalıştığından emin olmak için testlerin yapılmasını sağlar.
  5. Uygulamanın Üretime Alınması: Uygulama başarıyla test edildikten sonra, Docker imajı üretim ortamına dağıtılır. Üretim ortamında, Docker Engine tarafından yönetilen konteynerler aracılığıyla uygulama hızlı bir şekilde başlatılır ve kullanıma hazır hale gelir.

Bu senaryo, Docker'ın yazılım geliştirme sürecini standartlaştırdığını, izole ettiğini ve hızlandırdığını göstermektedir. Bu sayede, yazılım geliştirme ekibi daha hızlı ve güvenilir bir şekilde uygulama geliştirebilir ve dağıtabilir.

 

 

 Docker’ın Avantajları Nelerdir?

·       Kolay Taşınabilirlik:

Docker containerları, uygulama ve bu uygulamanın çalışması için gerekli olan tüm bileşenleri içerir. Bu sayede, bir containerı bir bilgisayardan diğerine veya farklı bir işletim sistemine taşıdığınızda, uygulama sorunsuz bir şekilde çalışır. Bu özellik, "bir yerde çalışıyorsa her yerde çalışır" prensibini hayata geçirir.

·       Daha Kolay ve hızlı başlatma:

Docker saniyeler içerisinde başlar, çünkü içerisinde barındırdığı her bir container sadece birer processtir. Böylece karşımıza lightweight bir yapı karşımıza çıkar. Bu da bizi sanal makinelerin hantallığından kurtarmış oluyor aslında.

 

 

·     Daha hızlı deployment süreci: 

En önemli avantajlarından biridir. Dockerı kullanmak için yeni bir environment kurmaya gerek yoktur. Farklı sunucularda çalışmak isteyen developerlar sadece docker imageleri indirip o sunucuda imageleri çalıştırmaları yeterlidir. Böylece ‘benim makinemde çalışıyordu, sunucuda neden çalışmıyor!’ gibi sorunlardan da kurtulmuş oluruz.

·     Daha Kolay Yönetim ve Ölçeklendirme: 

Bir sanal makineye göre docker üzerindeki containerleri çok daha kolay bir şekilde çalıştırabiliriz veya istediğimiz zaman yok edebiliriz. Containerleri manage etmek için farklı toollar mevcut. En çok ta Orchestrator diye nitelendirdiğimiz Kubernetes teknolojisi daha popüler olarak kullanılıyor. Kubernetes, kısaca container kullanan uygulamaların dağıtımını, ölçeklendirmesini ve yönetilmesini otomatik hale getiren açık kaynak kodlu bir sistem.

·     Daha İyi Kaynak Kullanımı:

Sanal makinelere göre tek bir sunucu üzerindeki kaynak tüketimi dockerda çok daha verimlidir. Daha az kaynak tüketimi ile daha fazla containeri çalıştırabiliriz.

·     Deployment Verimliliği:

Dockerın en güzel yanlarında birisi de şu: Siz localinizde test ettiniz, uygulamanızı Test veya Live ortamınıza attınız. (veya daha çeşitli ortamlar (dev, staging, pre-prod vs..) Localde çalıştırdığınız her şey burada da aynı şekilde çalışacak. Container ve Imagelerin tutulduğu dockerfile’ları da Git üzerinde tutmanız işinizi daha da kolaylaştıracağından eminim.

·       Farklı İşletim Sistemlerine Destek Vermesi Docker Windows, Linux, MacOs gibi farklı işletim sistemlerine destek verir.

·     Popüler Cloud Servislerle Entegre Edilebilir. Docker;  AWS, Microsoft Azure, Kubernetes, Istio ve daha fazla tool ve cloud hizmetlerle entegre şekilde çalışabilir.

 

 

Peki Gerçekten Kimlerin Container Kullanma Potansiyeli olabilir ?

En zor olan bu sorunun kesin bir tanıma olmamak ile birlikte, gelişen teknoloji ve bağımlığı olduğu iş modellerinde “agile” yaklaşımları barındıran, Elektronik Ticaret firmaları, internet üzerinden hizmet veren yeni nesil girişimler, sosyal platformlar, elektronik devlet kurumları, big data analizi yapan firmalar vb. yaklaşımları eş güden tüm sektörlerde bugün itibari ile Container mimarilerinin en azından geliştirme ekipleri tarafından denenmeye başladığı bilinmektedir. Bunu dışında birçok global E-Ticaret firmaları bir süredir sistemlerini bu platformlar üzerinde geliştirmektedirler. Kısaca,

·       Eğer yük anında kendini otomatik olarak çoğaltıp hizmet servislerini çoklayan bir sisteme ihtiyaç var ise,

·       Servis katmanı daha modüler hale getirilmek isteniyorsa,,

·       Verilen hizmetlerin farklı coğrafi lokasyonlar da yük dengelemesi ve yüksek erişilebilirlik ihtiyacı bulunuyorsa,

·       Bir yazılım firmasında uygulamaları oluştururken kullanılan süreçleri çok daha akıcı ve otomatize edilmiş şekilde yönetme ihtiyacı duyuluyorsa,

·       Yapılan yazılımın platform bağımsız çalışması amaçlanıyor ise,

Container mimarileri kullanmak verimli olacaktır.

 

Yazılımcılar Neden Docker Kullanır?

Windows, macOS ve Linux işletim sistemi kaynaklarını kullanabilmek için konteyner yapısına ihtiyaç duyulur. Bilgisayar işletim sisteminde yer alan RAM ve işlemci benzeri kaynaklar eş zamanlı olarak aynı sistem üzerinde kullanılabilmesi için birtakım sanallaştırma platformları tercih edilir. Bu durum ise, işletim sistemi kaynaklarının gereksiz ve yanlış kullanımına neden olur.

Konteyner yapılandırması ise sanallaştırma platformlarının gereksiz kaynak kullanımının önüne geçer. Konteyner teknolojisini kullanan Docker, işletim sistemindeki kaynakları dağıtarak uygulamaların problemsiz bir şekilde çalışmasına yardımcı olur. Dolayısıyla Docker nedir neden kullanılır sorusuna web uygulamalarının kolay kurulumu ve sunucu maliyetlerini minimize etmek için yanıtı verilebilir. Aynı işletim sistemi üzerinde birden çok sanallaştırma sağlamak isteyen yazılımcılar, konteyner teknolojisi ile tasarlanan Docker platformunu kullanabilir.

 

Kubernetes Nedir?

Kubernetes, konteyner tabanlı uygulamaların otomatik dağıtımı, ölçeklendirilmesi ve yönetimi için kullanılan açık kaynaklı bir platformdur. Kubernetes, karmaşık uygulama bileşenlerini kolayca yönetmeyi sağlar ve bu sayede hızlı bir şekilde uygulama dağıtımı yapılabilir.

Kubernetes'i kullanmanın bazı nedenleri ve avantajları şunlardır:

·     Otomasyon: Kubernetes, uygulama dağıtımı, ölçeklendirme, yük dengeleme ve otomatik iyileştirmeler gibi birçok işlemi otomatikleştirir. Bu, operasyonel yükü azaltır ve insan hatalarını en aza indirir.

·     Ölçeklenebilirlik: Kubernetes, uygulamalarınızın taleplerine göre otomatik olarak ölçeklenmesini sağlar. Bu sayede yoğun zamanlarda bile performans sorunları yaşanmaz.

·     Yüksek erişilebilirlik: Kubernetes, yüksek erişilebilirlik gereksinimlerini karşılamak için çeşitli düzenlemeler sunar. Uygulamaların kesintisiz çalışmasını sağlamak için otomatik olarak yeni kopyalar oluşturabilir ve hizmetleri yönlendirebilir.

·     Çeviklik: Kubernetes, hızlı bir şekilde uygulama dağıtımı yapılmasını ve değişikliklerin kolayca uygulanmasını sağlar. Bu, geliştirme süreçlerini hızlandırır ve rekabet avantajı sağlar.

·     Taşınabilirlik: Kubernetes, herhangi bir altyapıda çalışabilir ve farklı bulut sağlayıcılarında veya kendi veri merkezinizde kullanılabilir. Bu, uygulamalarınızın taşınabilirliğini artırır ve bağımlılıkları azaltır.

 

Kubernetes'i genellikle büyük ölçekli işletmeler, yazılım geliştirme ekipleri ve bulut sağlayıcıları gibi karmaşık uygulamalara sahip olan kuruluşlar kullanır. Ancak, herhangi bir ölçekteki bir işletme veya geliştirici topluluğu, uygulamalarını daha etkin bir şekilde yönetmek ve dağıtmak için Kubernetes'i kullanabilir.

Kubernetes'in kullanılabileceği bazı senaryo örnekleri;

Microservices Uygulaması: Bir e-ticaret platformu, müşteri hesapları, ürün katalogu, ödeme işlemleri ve sipariş yönetimi gibi farklı işlevleri mikro hizmetler olarak uygulamış olabilir. Kubernetes, bu mikro hizmetleri ayrı konteynerlerde çalıştırarak her birini izole edebilir ve yönetebilir. Bu sayede, her hizmetin bağımsız olarak ölçeklenmesi, güncellenmesi ve yönetilmesi mümkün olur.

Test Ortamları Yönetimi: Bir yazılım geliştirme ekibi, kod değişikliklerini test etmek için farklı ortamlara ihtiyaç duyabilir (örneğin, geliştirme, entegrasyon, QA). Kubernetes, farklı test ortamlarının otomatik olarak oluşturulmasını ve yönetilmesini sağlayabilir. Her bir ortam, gereksinimlere göre ölçeklenebilir ve geliştiricilerin kodlarını test etmeleri için hızlı bir şekilde hazır hale getirilebilir.

Yüksek Erişilebilirlik ve Yedekleme: Bir web hizmeti sağlayıcısı, kullanıcılarına kesintisiz bir deneyim sunmak için yüksek erişilebilirlik gereksinimlerine sahip olabilir. Kubernetes, birden fazla veri merkezinde veya bulut bölgesinde uygulamaların yedek kopyalarını otomatik olarak dağıtarak ve yöneterek yüksek erişilebilirlik sağlayabilir. Böylece, bir veri merkezi veya bölge arızalandığında, hizmetler otomatik olarak diğer konumlara yönlendirilir ve kesinti olmaz.

Dağıtım Süreçlerinin Otomatikleştirilmesi: Bir yazılım şirketi, müşterilere düzenli olarak güncelleme sunmak istiyor olabilir. Kubernetes, konteyner tabanlı dağıtım süreçlerini otomatikleştirerek, yeni bir sürümün herhangi bir kesintiye neden olmadan uygulanmasını sağlayabilir. Bu, geliştirme sürecini hızlandırır ve güvenilir bir dağıtım süreci sağlar.

Bu senaryolar, yazılım geliştirme süreçlerinin ve uygulamaların daha etkili bir şekilde yönetilmesini sağlayan Kubernetes'in nasıl kullanılabileceğini göstermektedir.

 

HATİCE KILIÇ