Merhabalar bu yazıda gün geçtikçe popülerliği artan docker ile ilgili bir şeyler yazmak istedim fakat araştırdıkça o kadar güzel yazılar gördüm ki yazmak yerine, benim docker’ı anlama yardım eden yazılardan kısa,net ve anlaşılır bir özet çıkarmak istedim. Kullandığım referansların bir kısımını yazının sonuna ekliyor olacağım.

Konteyner yapısının ve getirdiği farklılıkların daha iyi anlaşılabilmesi için öncelikle eskiden ne yapıyorduk, şimdi ne yapıyoruz bir hatırlayalım.

Sanallaştırma teknolojilerinden önce bir fiziksel sunucu üzerine birden fazla işletim sistemi kurmak mümkün olmuyordu. Farklı her bir işletim sistemi için mutlaka yeni fiziksel kaynak gerekiyordu. Bu durumda her yeni sunucu ihtiyacında temin süresi bekleniyor, alınacak sunucular için rack alanı ayarlanıyor, sistem odasinin soğutma tasarımı ve enerji tüketimi gözden geçiriliyor vs. vs. bir çok olumsuz ve iş yükü getiren detay ortaya çıkıyordu.

Sanallaştırma teknolojileri ile beraber bu durum değişti. Sanallaştırma ile yazılımsal olarak elde bulunan fiziksel donanımların mantıksal olarak ayrılarak birden fazla sanal makine şekline sokulup, kaynakları daha verimli kullanmak başta olmak üzere daha bir çok avantajı beraberinde getirdi diyebiliriz. Sanalaştırma ile onlarca fiziksel makine yerine yüksek kapasiteli tek bir makine içerisine sanal olarak aynı sistemleri kurabilirsiniz. Böylece enerji, kablolama, soğutma, ve sunucuların kapladığı alandan büyük ölçüde tasarruf ve mobilite sağlar. Bakım, onarım, upgrade süreleri kısalır, high availability çözümleri kolaylaşır, olası bir afet veya bir arıza durumlarında downtime sürenizi saniyelere kadar indirir. Bu yapı halen çok yaygın kullanılmakta olup, aşağıdaki resim sanallaştırılmış bir ortamı anlatmaktadır.


Bu yapıda sanal makineler arası izolasyon iyidir, ama her seferinde işletim sistemi kurmak dolayısı ile birbirinden bağımsız işletim sistemlerinin ayrı ayrı yönetilmesi güvenlik yamalarının geçilmesi vb iş yüklerini beraberinde getirir.

Konteyner mimarisi de aslında bir sanallaştırma teknolojisidir, yalnızca hypervisor katmanı yerinde host işletim sistemi ve bu işletim sisteminin üzerinde konteyner motoru bulunur. Özetle aynı işletim sistemi üzerinde farklı uygulama veya servisleri sanallaştırarak çalışır. Aşağıdaki şekil ile docker mimarisi ve bir üstte bahsettiğimiz geleneksel sunucu sanallaştırma arasındaki farkı görebilirsiniz.

Günümüzde en çok kullanılan konteyner teknolojisi  docker olsada bu işin atası Linux Kernel’e 2008 yılında eklenen Linux Containers (LXC) teknolojisidir. XC, Linux’da aynı işletim sistemi içerisinde birbirinden izole olmuş bir biçimde çalışan Container’lar (Linux tabanlı sistemler) sağlamaktadır. Anlaşıldığı üzere LXC, işletim sistemi seviyesinde bir sanallaştırma (virtualization) altyapısı sunmaktadır. Container’lar içerisinde aynı işletim sistemi tarafından çalıştırılan process’lere, LXC tarafından işletim sisteminde sadece kendileri koşuyormuş gibi düşünmeleri için bir sanallaştırma ortamı sağlanmıştır. LXC, Container’lara işletim sistemi tarafından sunulan dosya sistemi, ortam değişkenleri (Environment Variable), vb fonksiyonları her bir Container’a özgü olarak sağlar. Aynı işletim sistemi içerisinde çalışmalarına rağmen Container’lar birbirlerinden izole edilmişlerdir ve birbirleri ile istenmediği müddetçe iletişime geçemezler. İletişim kısıtlamasının bir amacı da Container’larının güvenliğini aynı Host üzerindeki diğer Container’lara karşı da korumaktır. Birkaç avantajını sıralayacak olursak.

  • Container teknolojisi ile Hypervisor teknolojisine göre sanallaştırma için gerekli disk alanından önemli bir tasarruf sağlanmaktadır.
  • Hyporvisor’lerle yapılan sanallaştırma her bir işletim sisteminin ayrı ayrı bakımının (güncellemelerin ve güvenlik yamalarının) yapılması gerekmektedir. Tek işletim sistemi içerisinde LXC kullanılarak yapılan sanallaştırmada ise bir işletim sisteminin bakımı yapılarak daha ekonomik bir yapı sunulur.
  • Docker, işletim sistemi çekirdeği seviyesinde bir sanallaştırma sağladığı için Hypervisor’lerle sağlanan sanallaştırmaya göre çok daha maliyetsiz (lightweight) ve hızlı bir sistem sunmaktadır. Hypervisor’lerle kurulan bir sanallaştırma altyapısında yeni bir node’un (sanal makina) sisteme eklenmesi için öncelikle işletim sisteminin hypervisor üzerinde boot edilerek başlatılmasının beklenmesi gerekmektedir. İşletim sisteminin başlatılması için ise ön yükleyicinin (boot loader) işletim sistemini belleğe yüklemesi, sanallaştırılan donanım bileşenlerinin (sanal disk, sanal ekran kartı, vb) kullanıma hazır hale getirilmesi ile işletim sistemi modüllerinin kullanıma hazır hale getirilmesinin beklenmesi gereklidir. Bütün bu işlemler en iyi ihtimalle 20-25 saniye sürmektedir. Docker ile yeni bir node (Container) eklenmesi ise milisaniyeler mertebesinde (50 – 100 ms) gerçekleştirilebilmektedir.
  • Mikroservis mimarilerde kullanım oranları artan servislerin kolaylıkla genişletilebilmesi yani yeni node’ların hızlı bir şekilde sisteme eklenebilmesi ve artık çok fazla kullanılmayan node’ların da hızlı bir şekilde kapatılarak kaynaklarının sisteme iade edilmesi gerekmektedir. Bu özellikler Docker’ın mikroservis mimariler için biçilmiş kaftan olmasını sağlamaktadır.
  • Popülerleşen DevOps kavramı ile birlikte, CI (Continuous Integration – Sürekli Entegrasyon) ortamları her geçen gün daha fazla şirket ve geliştirme ekibi tarafından kullanılmaktadır. Docker’ın sağladığı bağımlılığı azaltan fonksiyonlar sayesinde yeni bir Continuous Integration Pipeline oluşturulması ve var olan CI’ların bakımının yapılması kolaylaşmakta ve CI için kullanılan araçlara (Jenkins, Travis CI, vb) bağımlılığı azaltmakta ve farklı CI araçları arasında geçiş yapmayı kolaylaştırmaktadı
  • Yazılım geliştirme işi ile belirli bir süre uğraşan her yazılımcı, en az bir kere sahadan bildirilen problemi kendi geliştirme ortamında tekrarlayamama talihsizliğini yaşamıştır. Geliştirici ortamı ile uygulamanın deploy edildiği saha şartları arasında çoğu durumda gerek ölçek, gerek üzerinde koşulan platformun konfigürasyonu, gerekse de kullanıcı sayısı bakımından büyük farklılıklar bulunmaktadır. Docker’la birlikte uygulamalarımızı Docker altyapısı ile paketlediğimiz için aynı Image’ı hem geliştirici ortamında hem UAT (User Acceptance Test – Kullanıcı Kabul Test) ortamında ve PROD (Production – Canlı) ortamda kullanabiliriz. DEV (Development – Geliştirici) ve UAT ortamlarında sadece tek bir Container’ın çalıştırılması yeterli olacakken PROD ortamda gerektiği kadar Container ayağa kaldırılarak yük bir dengeleyici yardımıyla dağıtılabilir. Docker ile birlikte uygulamamızın koştuğu platformun DEV, UAT ve PROD ortamlarında aynı olmasını sağlamış ve platform farkından kaynaklı değişiklikleri de sıfırlamış oluruz. PROD ortamında Docker Container’da operasyon sırasında yapılmış bir değişiklik kolaylıkla geliştiricinin bilgisayarına yeni bir Image olarak getirebilir ve eğer oluşan problem ilgili değişiklerden kaynaklı ise geliştirici ortamında kolaylıkla tekrarlanabilir hale getirilir.
  • Geliştirmesi aktif olarak devam eden projelerde her yapısal değişiklikte, web sunucu değişimi, database şema veya referans data değişikliği vb binary formatta olan master sanal makinanın bütün geliştiricilere dağıtılması ve varsa geliştiricilerin kendi özelleştirmelerini bu makinalara tekrar uygulamalarını gerektirmektedir.
  • sanal sunucu kullanılmayan geliştirme ortamlarında ekibe yeni katılan kişilerin bilgisayarlarının gerekli araç gereçlerle kurulması işlemi için harcanan zamandır. Bu işlem genellikle ekibin deneyimli bir elemanı tarafından yapılır, bu durumda hem ekibin deneyimli bir elemanının hem de işe yeni başlayan elemanın efektif olarak kullanabilecekleri bir zaman dilimi kaybedilmiş olur.

LXC 2008 yılında ortaya çıkmasına ve kendisine farklı alanlarda ciddi kullanım alanı bulmasına rağmen onu hakettiği geniş kitlelerle buluşturan 2013 yılında ortaya çıkan Docker’dır. Docker  LXC’de manuel olarak yapılan işlemleri ustaca paketleyerek standardize etmiştir.  Docker’ın getirdiği en önemli özellik Container’ın yapısını metin bazlı Image formatı ile tanımlamasıdır. Bu sayede aynı Image formatı kullanılarak aynı özellikteki Container’lar kolaylıkla yaratılabilir, başka kişilerle Docker Registry üzerinden paylaşılabilir ve kolaylıkla genişletilebilir. Docker’ın LXC’ye göre getirdiği temel farklılıklardan bir başkası Docker’ın kullanıcılarını aynı Container’da sadece ve sadece tek process çalıştırmaya adeta zorlamasıdır, şimdilik küçük bir örnek olarak, oluşturacağımız sistemde bir web server, bir app server ve bir database server olduğunu düşünelim. Docker’ın önerdiği yapı bu üç bileşenin tek bir Container içine konması yerine ayrı ayrı Container’larda çalıştırılmasıdır. Ayrı ayrı Container’lar içinde çalıştırılan bileşenler (app server, web server, vb) gerektiği durumlarda teker teker genişletilebilir.

Peki özete gelecek olursak Docker neden bu kadar popüler oldu?

Mikroservis ve süreçte Çeviklik iştiyakına kitlendiği bir dönemde geldi. Çevikliği besleyen CI/CD ve Dev-Ops meselesine ilaç oldu. Mikroservis yaklaşımına birebir uydu.

Docker ile örnek bir mimari?

Aşağıdaki fotoğraftaki örnekten gidecek olursak, sunucumuzda 4 adet docker container çalışıyor. 2 adet Apache web sunucusu, 1 adet mysql veritabanı, 1 adet ssh-bis. Apache sunucular 80 portundan yayın yapacaklar. Bu 80 portundaki yayın container’dan dışarıya (ana (host) sisteme) çıkarken 25890 ve 27568 olarak çıkacaklar. Containerın çalıştığı sistemde web tarayıcı ile http://localhost:25890 adresine girdiğimiz zaman birinci Apache’nin cevabını alırız.

Nginx gibi bir reverse proxy ise gelen istek sub1.domain.com:80’e ise ilk containera (25890), sub2.domain.com:80 ise ikinci containera (27568) yönlendirecek. Bu sayede çok sayıda yazılım bir sistemde birbirinden izole bir halde kolay kurulumla çalışabilecek.

Yazılımımızı test etmek istediğimizde bir yazılım ve bir veritabanı containerı oluşturup testi onun üzerinde gerçekleştirebiliriz. Bu işlemi Jenkins gibi continuous integration aracıyla otomatikleştirme imkanımız da var.

Referanslar;
https://www.fatihsolen.com/docker-nedir-konteyner-nedir/
https://gokhansengun.com/docker-nedir-nasil-calisir-nerede-kullanilir/
https://www.binpress.com/podcast-28-solomon-hykes-docker/
https://tahiroglu.com/post/145827965207/docker-medeniyeti
https://www.emrealadag.com/docker-nedir.html
https://medium.com/codable/kubernetes-d090867428ca

Loading