Son zamanlarda sürekli duyduğumuz teknik kelimelerden biri Docker. Peki Docker tam olarak nedir ? Ne işe yarar ? Neden çıktı ? En önemlisi bizim için gerçekten ne yapıyor? Docker konusuna girmeden önce bir kaç kavramı ve daha önceden biz ne yapıyorduk bunları netleştirmemiz gerekiyor. Bunlardan ilki Container. Container dediğimiz şey aslında yıllardır bildiğimiz bir kavramın yeni güzel adı. Bir uygulama yazdıktan sonra bunu çalıştırmak için bazı şeylere ihtiyaç duyuyoruz. Bunlar genel olarak:

  • Uygulamayı çalıştıracağımız yer. IIS, Apache, Nginx gibi web sunucular ya da tomcat gibi uygulama sunucuları da olabilir.
  • Uygulamayı yazdığımız programlama dilinin bileşenleri. DotNET Framework, Ruby, Python, PHP olabilir.
  • Uygulamayı koyabilmek için belli bir miktarda disk alanı
  • Harici bileşenler, örneğin kullandığınız ek bir servis kütüphanesi, hesaplama modülü, para ile alınmış raporlama bileşeni gibi.

İşte bunların tamamına şu an Container denilmekte. Docker olmadan önce de biz bunları yapıyorduk. Önce sunucu kuruyorduk, uygulama sunucusunu ayarlıyorduk. Üstüne uygulamamızı kurup çalıştırıyorduk. Fakat dikkat ederseniz bütün sistem kaynağını genelde 1 ya da 2 adet uygulamaya veriyor ve o kaynakları yeterince kullanmıyorduk. Benim şu ana kadar yazdığım hiç bir uygulama 5 saat kadar %90 cpu ve 10 GB ram ile çalışmadı ama sunucumuz 32 GB ram ile orada duruyordu. Daha sonra bu kaynakların boşa gitmemesi için sanallaştırma teknolojisini kullanmaya başladık. Bu sayede fiziksel makineye yüklü olan işletim sistemi üstünde HyperVisor kullanarak birden fazla işletim çalıştırıyorduk. 32 GB RAM’lik tek bir fiziksel makine yerine belki 16 GB - 8GB - 8GB şeklinde 3 adet işletim sistemi çalıştırıp hem elektrikten tasarruf edip hem de mevcut kaynakları daha verimli kullanmaya başladık.

Sorun ise hala kaynakları tam anlamı ile kullanmıyorduk ve bu işin yönetimi ne kadar ilerleme olursa olsun hep zor oldu. Daha çok güvenlik yaması, daha çok sistem takibi gibi ek maliyetlerin yanı sıra bu tip sanal makineleri açmak, kapatmak vakit olarak uzun sürmekteydi. Bir diğer durumda aynı uygulamadan bir tane daha kurmak istediğimiz zaman sırf yedeklilik için bile olsa baştan bir sanal işletim sistemi kurup bütün uygulamayı da kurmamız gerekiyordu. Ek olarak seçtiğimiz sanal işletim sistemi ve hypervisor da bizi kısıtlıyordu. Örneğin HyperV ile oluşturduğumuz bir sanal makineyi bir anda VMWare ortamına taşıyamıyorduk ya da uygulamayı yazarken windows üzerinde çalışacak şekilde derlediğimizde veya ürünler kullandığımızda bir anda linux ortamına geçme imkanımız kalmıyordu. Yukarıda belirttiğimiz tüm zorluklar yazılım geliştirme ve sistem yönetimi için ek vakit ve ek iş gücü kaynağı getirmekteydi. Docker ise tam olarak bu noktada devreye girdi. Docker aslında bir nevi sanallaştırma olarak düşünülebilir. Aradaki fark kendisi doğrudan işletim sisteminin çekirdeğindeki (Aslında Linux Kernel üstünde LXC yi kullanarak) uygulama ve kaynak ayırmayı (Isolation) kullanması. Docker kendi içinde Container kavramını Image kavramı ile birleştiriyor ve diyor ki: Siz uygulamanız için gerekli olanları toplayıp tek bir hale getirin. Uygulamayı paketleyin, işletim sistemi bağımsız gibi (gibi diyorum en nihayetinde uygulamayı koyduğumuz container önemli) ayarlayın. Platform bağımsız olacağız. Docker çalışıyorsa sizin uygulamanız her zaman her yerde aynı çalışacak. Performans kısmı için de dert etmeyin, donanım kaynakları ve geri kalanını işletim sisteminden ortak kullanacağız.

Bu kavram ile bize getirdiği avantajlar ise :

  • Donanım kaynaklarının paylaşılması. Docker üstündeki Image’lar aynı kaynaklara aynı şekilde ulaşıyor. 8 tane Image açtığınız da herbirine illa 2gb ram vermiş olmayabilirsiniz. Docker bir şekilde aralarında paylaştırıyor.
  • Her ne kadar donanım kaynakları paylaşılmış olsa da image’lar arasında hiç bir ilişki yok. Birinin kapanması, çökmesi gibi benzer bir durum hiç bir şekilde ne işletim sistemini ne de diğer image’ları etkiliyor.
  • Sadece 1 tane işletim sistemi ile uğraşıyoruz. Güvenlik, güncelleme ve takip çok daha kolay.
  • Başlı başına bir işletim sisteminden ziyade uygulama ayrıştırma yaptığımız için Docker image’lar çok hızlı bir şekilde açılıp kapanabiliyor.
  • Docker platform bağımsız sayılabilecek bir yapıda olduğundan bugün Microsoft Azure üzerinde çalıştırdığınız Docker Image’ları yarın kapatıp Amazon EC2 yada kendi sunucunuzda rahatlıkla çalıştırabiliyoruz.
  • Örneğin kendi linux sunucularınız da asp.net uygulaması çalıştırmayı düşündüğünüz de bütün uygulamayı bir Docker Image haline getirip bunu kolaylıkla kurabiliyorsunuz. Böylece uygulama geliştirme dilleri seçimi içinde de çeşitliliği de arttırmış olabiliyoruz.
  • Uygulama ile birlikte veritabanı da kullanmak istediğinizde ama kurulmuş ve aktif bir veritabanı olmadığı zaman. Halihazırdaki bir çok Docker Image ile hızlıca bir veritabanını ayarlayıp sadece bağlantı yapmanız yeterli.
  • Docker Image paylaşımı ile hem kendi ekibiniz içindeki geliştiriciler hem de internet üzerinde hazır, üstüne uygulama kurmak dışında ek bir şey yapmanızı gerektirmeyen alt yapıları kullanarak asıl işimiz olan yazılıma daha çok odaklanabilirsiniz. Birçok image ve bilginin paylaşıldığı https://hub.docker.com/ adresine bakmanızı öneririm.

Bu avantajlar ile yatay genişleme kavramı da rahat bir şekilde uygulanabilir oldu. Herhangi bir servisiniz gerçekten kendi içinde zorlanmaya başladığında 1 adet daha docker image’ı aktif ederek hızlıca büyüyebiliyordunuz. Yoğunluk bittiğinde ise onu kapatıp, başka bir tanesini aktif edebiliyoruz. Platform bağımsızlığı da hem bulut hizmetleri arasındaki geçişi hem de yazılımcılaın programlama dili tercihleri sayısını arttırması da çeşitliliği ve rekabeti arttırdı diyebiliriz.