Herşey ilk adımlarla başlar...

Sunday, October 23, 2016

Docker nedir ve neden heyecanlanmamız lazım?




Merhabalar, bu yazıyla birlikte
  • Docker'ın ne olduğunu öğrenecek..
  • Docker'ın nasıl çalıştığını anlayacak.. 
  • Hangi problemlere çözüm getirdiğini kavrayacak..
Ve kendi projelerinizde Docker kullanarak nasıl bir fayda sağlayabileceğinizi düşünmeye başlayacaksınız.

O zaman başlayalım;

Docker Nedir?

Docker, uygulamalarınızı geliştirmek, taşımak ve çalıştırmak için tasarlanmış harika bir sanallaştırma çözümüdür. 

Peki onu harika kılan ve diğer sanallaştırma çözümlerinden ayıran nedir? 

Docker, diğer sanallaştırma çözümleri gibi tüm bir işletim sistemi ve üzerindeki her şeyi hedef almak yerine sadece uygulamaları baş köşeye oturtur ve onları tek başlarına çalışabilecekleri ve tamamen kendilerine ait olan Konteyner'lerde çalıştırır. İşte Docker'ı harika kılan yegane nokta budur. İşi sanallaştırmadan çıkarıp yeni bir kategoriye taşımış ve konteynerleştirme platformu olarak tahtına oturmuştur. Docker.com'daki tanımlama da bize direkt olarak bunu söylemektedir.
Docker is the world's leading software containerization platform.
Peki konteynerleştirme neden önemlidir?

Bu soruya cevap verebilmek için biraz eskilere gitmemiz gerekiyor... 1950'lere..

1951 yılının nisan ayında dönemin önde gelen ülkeleri bir araya gelerek standart bir konteyner kavramı üzerinde fikir birliğine varmıştır. 



Aslında çok basit görünen bu standartları tanımlanmış metal kutucuk sayesinde lojistik endüstrisi ivmeli bir büyüme kazanmıştır. O ana kadar şu sorular ve problemler ile kıvranırken;

  • Taşımak istediğim kahve çekirdekleri, aynı gemideki piyanolar altında ezilip bozulacak mı? 
    • (Ürünüm taşıma esnasında başka bir üründen etkilenecek mi? )
  • Özenle hazırladığım ve kontrol ettiğim kahve çuvallarını gemiye yüklemeye çalışırken yeni bir araca ihtiyacım olacak mı? 
    • (Her farklı ürün için yeni bir yükleme aracına mı ihtiyac duyacağım)
  • Ya çuvallardan birisi farklı bir ürün grubu ile karışır da teslim edilmesi gereken sayıda ürün yerine ulaşmazsa?
    • (Üretim ortamım ile teslim ortamım arasında fark çıkarsa)
Konteynerler sayesinde bunların hepsi çözüme kavuşmuş oldu. Artık kişilerin yapması gereken tek şey, boyutları ve standartları herkes tarafından bilinen bu metal yığınlarının içine kendi ürünlerini istedikleri gibi yerleştirmek. Bundan sonrası zaten herkes tarafından kabul görmüş olan şekilde yüklenecek, taşınacak ve teslim edilecektir.

Separation of Concerns (SoC) 'e uygun olarak, taşınması istenen konteynerin kapağı kapatıldıktan sonra bütün endişeler uzaklaşmış olur. Bundan sonrası zaten standartlaştırılmış olan ve içerikten bağımsız olarak otomatize edilmiş bir süreç olan konteyner taşınmasıdır.

İşte Docker da aynı yolu izlemektedir. 

Sizler için uygulamalarınıza özel bir ortam sağlıyor ve bunu sanal makinalar gibi hantal ve çok kaynak tüketen bir yapıyla değil, hızlı ve az kaynak ile çalışan "Container" özelliği ile sunuyor.

Sanal makinalar her seferinde adeta yeni bir gemiye ihtiyaç duyarcasına yeni bir işletim sistemi kurulumuna ihtiyaç duyarlar. Docker ise uygulamaları container'lar içerisinde çalıştırarak uygulamanın işletim sistemini tamamen kendine ayrılmış olarak görmesini sağlar.

Peki Docker bunu nasıl yapar?

Docker, Linux 'un 2008 yılında tanıttığı ve Linux Kernel'e eklediği Linux Containers (LXC)  yapısı üzerine kurulmuştur. LXC, her bir container'a kendisine ait ortam değişkenleri, kök dizini ve benzeri fonksiyonlar sunarak container'daki processlerin tüm işletim sisteminde tek başlarına çalıştıkları izlenimi veren bir sanallaştırma sağlar. LXC için daha detaylı bilgiye şuradan ulaşabilirsiniz.

Docker da bu teknolojiden faydalanarak guest işletim sistemi ihtiyacını ortadan kaldırır. Diğer sanallaştırma çözümleri asıl makinada bulunan "Host Operating System" üzerinde çalışan "Guest" işletim sistemlerine ihtiyaç duyarken 


Docker ise aynı yalıtılmış ortamı direk olarak "Host" işletim sistemi üzerinden sunar.


Bu sayede "Guest" işletim sisteminin ihtiyaç duyduğu tüm sistem kaynakları, el değmemiş olarak, yeni container'ların kullanımına açıktır. Çok basit bir hesap ile 10 tane sanal makina için 2'şer GB 'dan 20 GB RAM ve 6'şar GB'dan 60GB kadar disk kaynağından tasarruf edilmiştir.

Docker, sizlere bir sanal makinanın sağladığı tüm faydaları sağlar ve bunları hem en az maliyetle (sistem kaynağı) yapar hem de hayranlık uyandırıcı bir basitlikle sunar.

Linux Container teknolojisinden bahsetmem yanlış bir algı uyandırmasın. Docker hem Linux hem Windows hem de MacOs işletim sistemlerinde çalışabilir. Windows'ta bu özelliği sunabilmek için boot2docker isminde özelleşmiş ve çok minimalist (aşağı yukarı 25 MB olan) bir linux dağıtımından faydalanırken kısa bir süre önce Microsoft'un da desteğini alarak (şu an için sadece Windows 10 'da olsa da) bu ihtiyacı ortadan kaldırdı. Microsoft Hyper-V ile entegre çalışarak Windows dünyasındaki yerini de sağlamlaştırmış oldu.  Aldığı bu destek, önümüzdeki dönemde Docker'ı ve container'larını daha çok duyacağımızın bir kanıtı diyebiliriz.

Docker 'ın çalışma mantığını biraz daha detaylandıracak olursak

Bahsettiğimiz Container'ların yönetim merkezi Docker Daemon'dır. Daemon, docker objelerini yaratır ve onları yönetir. Bunlar image, container, network ve veri kaynaklarıdır. Daemon'a komutlar vermek için kullandığımız arayüz docker CLI (command line interface)'dir. Docker yapısına bakarsak aşağıdaki gibi tasarım ile karşılaşırız


CLI ve  daemon ile REST API üzerinden haberleşirler. CLI direk olarak komutlarla veya önceden tanımlanmış scriptler ile daemonun ne yapması gerektiğini söyleyebilir. Hangi container'ın ne zaman çalışıp ne zaman duracağı, çalışma esnasında nasıl davranacağı, hangi image'in bir container haline geleceği ve benzeri komutlar daemon'a bu şekilde iletilir. İsmi geçen kavramları kısaca özetlersek;

Docker Daemon

İşletim sistemi üzerinde çalışan, docker yönetim merkezidir.  Docker objelerini yaratır ve yönetir.

Docker CLI

Kullanıcının Docker Daemon ile iletişim kurmasını sağlayan arayüzdür. Kullanıcıdan aldığı komutları rest api aracılığıyla daemon'a iletir.

Docker Image

Container'ların file system üzerindeki halidir. Image'leri container yaratmak için gereken talimatların bulunduğu bir şablon olarak düşünebiliriz. Örneğin bir docker image nginx sunucusu veyahut mysql veritabanı içerebilir. Image'lerin en güçlü özelliklerinden birisi de başka bir image baz alınarak yaratılıp kişinin isteklerine göre değiştirilebilmesi ve son şekliyle yeniden paketlenebilmesidir.

Docker Image'leri text formatında olan bir Dockerfile ile tanımlanır.

Docker Container

Docker container ise bir image'in çalışan halidir. Dockerfile ile tanımlanmış olan Docker image alır ve basit komutlarla daemon tarafından çalıştırılmasını sağlarız ve böylece container'ımız hazırlanmış olur. Aynı sanal makinalarda olduğu gibi bir container'ı duraklatabilir (pause) veya tamamen durdurabiliriz (stop), bu da bize esneklik sağlar.

Docker'ın temel bileşenlerini tanımış olduk. Docker 1.12 ile gelen başka bir bileşen ise Docker Service'dir. Docker Service ise bir docker image'inin istenilen sayıda kopyasının aynı anda çalıştırılması ile elde edilir. Kullanıcı tarafından bakıldığında sadece bir uygulama çalışıyor gibi görünse de arka tarafta bir çok container paralel olarak çalışır ve bunların arasındaki yük Swarm Manager tarafından eşit olarak dağıtılır. Bu sayede ihtiyaç anında çok kolay bir şekilde mevcut uygulamamızı ölçeklendirebilir ve bunu çalışırlığından emin olduğumuz image'imizi kullanarak yapabiliriz. 

Ve gelgelelim... 

Docker gerçekten çok güçlü bir platform olmasındaki en büyük etkenlerden birine.. Benim de Docker Platformunun belki de en beğendiğim özelliğine.. 

Docker Registry

Docker registry, imagelerin tutulduğu ve dağıtıldığı bir ortamdır. Aynı Github'da olduğu gibi elimideki image'leri docker registry'sine push edebilir veya daha önceden yüklenmiş olan bir image'i pull edebiliriz. Bu sayede ihtiyaçlarınızı karşılayacak bir image'e çok hızlı bir şekilde erişebilir, gerekirse üzerinde değişiklik yapabilir ve tag'leyerek farklı bir version olarak yeniden gönderebiliriz.

Bu yapı o kadar güzel işlemekte ve fayda sağlamaktadır ki onlarca sektör lideri şu anda DockerHub üzerinde kendi image'lerini sunmaktadırlar. İlk akla gelenler; nginx, redis, ubuntu, mongodb, mysql, wordpress, elastic search, tomcat, java, jenkins, python ve daha niceleri... Sadece bu saydıklarımın her biri şu an 10 milyonun üzerinde pull isteği almış durumdadır!

Platformun genelini daha iyi canlandırabilmek için aşağıdaki görseli de eklemekte yarar var



Docker Hangi problemlere çözüm getiriyor?

Docker 'ın çözüm getirdiği başlıca sorunları şu şekilde sıralayabiliriz

Benim makinemde çalışıyor...

Eğer yazılım sektöründeyseniz bu cümleyi mutlaka duymuşsunuzdur. Yazılımı geliştiren kişi, ilgili uygulamayı kendi laptopunda çalıştırmış, stabil bir şekilde çalıştığını görmüş ve diğer geliştirmelerine doğru çoktan yola koyulmuştur bile.. O sırada bir testçi aynı uygulamayı kendi laptopunda denediğinde ise uygulamanın çalışmadığını görmüştür.

Peki şimdi suç kimdedir ve bu problemi kimin çözmesi gerekmektedir? Yazılımcı uygulamanın kendi makinesinde çalıştığını kanıtlamakta, testçi ise aynı uygulamanın kendi makinasında çalışmadığını kanıtlamaktadır :)
Yaşanan problem elbette bahsedilen farklı makinelerin farklı konfigurasyonlarından kaynaklanmaktadır. Belki uygulamanın ihtiyaç duyduğu bir dosya A makinasında bulunmakta ama B makinasında bulunmamakta belki de B makinasında kullanılan x bir program çalıştırılmak istenen uygulamayı engellemektedir.

Docker, uygulamaları tamamen izole olmuş bir ortamda (kendi container'ında) çalıştırdığı ve ayrıca bu izole ortam Docker image olarak bütünüyle taşındığı için A makinasında çalışan bir uygulamanın B makinasında da aynı şekilde çalışacağını garantilemiş olur.

Uzun deployment süreleri ve buna bağlı yaşanan sistem kesintileri...

Fiziksel bir makinanın kapatılması ve ardından yeniden başlatılması dakikalar sürmekteyken aynı işlevi gören bir Docker container'ın kapatılması ve yeniden başlatılması milisaniyeler seviyesindedir. Bu da sistem yöneticilerinin en büyük sorunlarından biri olan "deploy nedeniyle hizmet kesintileri" sorunsalını tamamen gündem dışı bir konu haline getirir.

Artık istenildiği anda mevcutta çalışan bir Docker container durdurulabilir, kapatılabilir ve milisaniyelerle ölçülen sürelerde yeni bir container başlatılabilir. Uygulamalar üzerinde yapılan değişiklikler bu sayede çok hızlı bir şekilde kullanıma alınabilir.

Değerli sistem kaynaklarının işletim sistemleri tarafından tüketilmesi..

Artık bir çok organizasyon sanal makinaların sunduğu faydalardan yararlanabilmek için sistemlerini sanallaştırma yoluna gitmektedir. Hepimizin bir şekilde dokunmuş olduğu bulut teknolojileri de sanallaştırmanın en çok kullanıldığı alanların başında gelir.

Sanal makinalar esnek ve birçok fayda sağlasa da her yeni makina üzerinde kendine ait bir işletim sistemi olma zorunluluğu nedeniyle çok fazla sistem kaynağına ihtiyaç duyulmaktadır.

Docker ise çalıştıracağı uygulamalar için ayrı birer işletim sistemi kullanmadığı için aynı senaryoda kurgulandığında çok az kaynakla çok iş yapabilmektedir. Ve bu sayede boşa çıkan değerli sistem kaynakları başka bir hizmet için kullanılabilir hale gelmektedir.

Evet, artık Docker Nedir? biliyorsunuz, temel kavramı öğrendiniz ve çözüm getirilen başlıca problemleri gördünüz. Tebrikler, böylelikle son zamanların en gözde altyapı platformu Docker'ı tanımış oldunuz!

Umarım hepinize faydalı olmuştur.


0 comments: