Sürekli büyüyen proje ve sistemlerde hataları bulup çözmenin yanı sıra; değişiklik yapma, fonksiyonları ölçeklendirme, yeni özellikler ekleme gibi zorluklar karşımıza çıkıyor. Neyse ki bunca yıldır Konteynerizasyon veya Konteyner Teknolojileri (Container Technologies) bu zorlukların çoğunu çözmeye yardımcı olmak ve yapısız (structureless) büyümeyi önlemek için gelişmeye devam ediyor.
Konteynerler, özellikle mikroservis geliştirme, sunma ve sürdürme alanlarında yazılım dünyasında oldukça popülerlik kazanıyor. Konteyner mimarisi, uygulamaları farklı fiziksel ve sanal makinelere yerleştirme esnekliğini sunan dağıtık nesneler (distributed objects) ve konteynerlere bölüyor. Bu mimari yöntem, ölçeklenebilirliği sayesinde bir dizi platform ve cihaz için destek sağlamanız gerektiğinde de ideal oluyor.
Tarihi gelişimine bakacak olursak, konteyner kavramının ilk kez 1979’da Unix V7 ile ortaya çıktığını ve FreeBSD Jails, Linux VServer, Oracle Solaris Containers, Open VZ, Process Containers (Google), LXC, Warden ve Lmctfy ile devam ettiğini görüyoruz. Tüm bu iterasyonların ayrı ayrı fanatikleri olsa da Docker 2013’te açık kaynak (open source) olarak ortaya çıktığında, bir PaaS (platform-as-a-service) şirketi olan DotCloud tarafından belli güçlü fonksiyonlar içeren üst düzey aracı ile daha büyük konteyner kullanımının kapılarını açmış oldu. Bu fonksiyonları* aşağıdaki şekilde özetleyebiliriz:
- Makineler arasında taşınabilir deployment
- Uygulama- merkezli olma (application-centric)
- Otomatik konteyner yapıları için destek
- Dahili sürüm oluşturma (built-in versioning)
- Bileşenin yeniden kullanımı (component re-use)
- Herkese açık paylaşım
- Büyüyen bir araç ekosistemi (tool ecosystem)
Büyük oyuncularla birlikte, gittikçe artan sayıda şirketler (Docker sayesinde) konteynerizasyon kullanmayı seçtiğinden, bu kararın arkasındaki en iyi 5 nedene birlikte bakalım:
Deployment Kolaylığı ve Konfigürasyon
Konteynerlerin en önemli yararı deployment, yapılandırma sürecini basitleştirmek ve hızlandırmak oluyor. Bir konteyner deploy ettiğinizde konteyneri bir güvenlik duvarı (firewall) veya bulut ortamının arkasından kolayca sunabiliyor ya da bunu bir dizüstü bilgisayara kurabiliyor veya birkaç saniye içinde büyük bir internet ortamında piyasaya sürebiliyorsunuz.
Konteynerlerin deploy edilmesinin kolay olması kadar, yok etmenin -örneğin, bir ürünü piyasaya sunduğunuzda oluşturacağı trafiğin boyutunu öngöremediğiniz zamanlarda- zahmetsiz oluşu da işletmelere büyük bir avantaj sağlıyor. Burada, konteynerler size büyüyen trafiğin üstesinden gelmek için klonlayabileceğiniz veya bulut ortamınızdaki maliyetinizi azaltmak için istediğiniz sayıda konteyneri imha edebileceğiniz bir esneklik sağlıyor.
Ayrıca konteynerizasyon, sanal bir makinenin (VM- virtual machine) masrafları olmaksızın sizin altyapınız üzerinde kendi konfigürasyonuyla herhangi bir platform çalıştırmanıza izin veriyor. Aynı Docker konfigürasyonunu çeşitli ortamlarda kullanabiliyor ve uygulamalarınızı birden fazla IaaS / PaaS üzerinde çalıştırabiliyorsunuz; böylece altyapı gereksinimlerini uygulama ortamınızdan ayırabilmiş oluyorsunuz.
Yüksek Ölçeklenebilirlik
Konteynerizasyon, bir uygulamanın tümünü etkilemeden yalnızca arzu edilen fonksiyonları ölçeklendirmenize olanak tanıyor. Örneğin, bir web uygulamasında konteynerler şirketlerin web sunucusunu veya mesaj kuyruğunu (message queue) ölçeklendirmek zorunda kalmadan veritabanı bileşenlerini ölçeklendirmelerini sağlıyor. Herhangi bir fonksiyonu anında, hatta değişikliklerin etkili olması için bazen sunucunuzu bile yeniden başlatmadan ölçeklendirebiliyorsunuz.
Bir başka deyişle, daha fazla konteynere izin vererek, daha fazla sunucuya ihtiyaç duymadan saniyeler içinde ölçeklenebilirliği artırabiliyorsunuz (geleneksel VM ortamlarından 10 ila 100 kat daha fazla).
Pipeline Yönetimi
Yazılım teslimi (software delivery) birkaç adımdan oluşan bir süreç olduğundan, bu süreçte uygulamanın tasarımından başlayıp bir test ortamında kodu oluşturmayla devam eden ve sonunda uygulamayı kullanıcılara sunan farklı ortamlar mevcut. Bu kendine özgü adımların her biri de, ayrıca yol boyunca ufak farklılıklar gösteriyor.
Konteynerler, tutarlı bir test ortamı sağlayarak ve geliştiricilerin uygulamalarını kolayca taşınabilen bir konteyner içine yerleştirmelerine olanak tanıyarak geliştirme aşamasından üretim aşamasına kadar sürece bir kolaylık getiriyorlar. Bu ortam aynı zamanda, geliştiricilerin uygulama çalışma zamanı (runtime) ortamlarında üretim yoluyla sıfır değişikliği (zero change) başarmalarını sağlayan host sistemlerinden çıkarılıyor.
Artan Genel Verimlilik
Konteynerizasyon, geliştiricilerin yazılım tesliminde yeni nesil verimlilik (next-generation efficiency) elde etmelerine ya da ürün yöneticilerinin geleneksel sanallaştırmayla yüz yüze kaldıkları zorlukların çoğuna çözüm bularak zaman ve kaynak tasarrufu yapmalarına izin veriyor.
Geliştiricilerin üretime olabildiğince yakın olabilmesi için kendi sanal makinelerinde (virtual machine) çalışan her hizmetin, üretim uygulamasının nasıl çalıştığını yansıtması gerekiyor. Ancak, bir internet bağlantısına olmadığında ya da sürekli derleme gereken zamanlarda uzaktan (remote) çalışmanın bunaltıcı hale geldiğinde; Docker, bellek ayakizi (memory footprint) eklemeyerek pek çok hizmetin çalışmasına olanak tanıyarak imdada yetişiyor.
Konteynerizasyon aynı zamanda geliştirme ortamının interaktif kullanım için olabildiğince hızlı olmasına izin veriyor. Konteynerler; geliştiricilerin kullanmak istedikleri platformlardan (Windows, Mac veya Linux) kaynak kodunu (source code) değiştirebildikleri ve aynı kaynak kodu kullanarak çalışan uygulamalardaki değişiklikleri anında izleyebildikleri hızlı bir geri bildirim döngüsü sağlıyorlar.
Bu, aynı zamanda diğer çalışanların tam uygulama kurulumunu kullanmalarını ve kurulum sorunlarının araya girmesine izin vermeden kendi iş alanlarında çalışmalarını sağlıyor.
Bununla beraber örneğin, bir proje yönetim aracı (Project management tool) kurmak isteyen bir proje yöneticisi hem yükleme işlemi sırasında (saatler sürmesi, ek bileşenleri ve bağımlı paketleri yüklemek gibi) hem de bu farklı sürümleri yönetirken zorluklarla karşılaşabilir. Bunu engellemek için proje yöneticileri, Docker image kullanarak seçilen proje yönetimi aracını deploy etmek ve bağımlılık hatalarını (dependency errors) önlemek için tek bir komut yürütebiliyor.
Süreç İzolasyonu (Process Isolation)
Uygulama izolasyonu (application isolation) geliştiricilere bağılılıklardan (dependencies) kaçınmanın yanı sıra deploy etmek için ihtiyaç duydukları şeyleri tam olarak sağlıyor. Aynı makinede birden çok uygulama çalıştırmanın verimliliği artırmak ve maliyetleri düşürmek için birden çok sunucu konsolidasyonu gibi birçok avantajı mevcut.
Uygulama izolasyonu ayrıca, uygulamanın ana süreçlerinin her birini ayrı bir konteynere ayırarak güvenliği artırıyor. Örneğin, uygulama geliştirmesini outsource ettiğinizi varsayalım. Konteynerler, yalnızca istediğiniz ortamda, dahili veya harici güvenliğinizi riske atmadan paylaşmanıza olanak tanıyor. Dolayısıyla, kuruluşunuzda çalışmayan dış kaynaklı (outsourced) uygulama geliştiricileri ağınızın güvenliğini ihlal etmeden gerekli olan kaynakların tamamını alabiliyor.
Konteynerizasyonun avantajlarının (esneklik, çeviklik, deployment kolaylığı ve geliştirici deneyimi) hem test hem de geliştirme ortamlarında çok netleştiği artık aşikar. Hatta dahili geliştirme yapmayan organizasyonlar bile konteynerizasyonun avantajlarından faydalanabiliyor. Durum böyle olduğunda, büyük oyuncuların bu (en hızlı büyüyen) teknolojiye sürekli yatırım yaptıklarını görmek çok da şaşırtıcı değil ve ilerleyen zamanlarda kesinlikle organizasyonlar tarafından yeni kullanım örnekleri de karşımıza çıkacak.