Docker Nedir?
Başlamadan önce biraz geçmişe gidelim.
Virtualization ve containerization kavramlarından önce, geleneksel yaklaşımda, bir donanıma bir işletim sistemi -uygulamalar- yüklenir ve donanımın tüm kaynakları tek bir işletim sisteminde, tek bir sunucuda kullanılmak durumunda kalınır. Aynı zamanda farklı bir işletim sistemi veya o sunucudan bağımsız uygulamalar kullanılmak istendiğinde ikinci bir fiziksel sunucu kullanılması ve aynı kaynakların, dolayısıyla aynı maliyetin oluşması anlamına gelirdi. Bu kaynak kullanımını optimize etmek adına aynı fiziksel sunucunun kaynaklarını paylaştırarak onun üzerinde birden fazla sanal sunucu oluşturmaya imkan tanıyan “virtualization” konsepti hayatımıza girdi.
Sanal makineler bir hypervisor (örn. VMware) yardımıyla üzerine kurulu olduğu donanımın kaynaklarını bölüp yöneterek aynı donanım üzerinde birden fazla sunucu kurulmasını sağlar. Yani VM ile CPU, bellek, disk gibi donanımlarınızı bir bütün olarak kullanmak yerine onları sanallaştırıp parçalayarak her bir grubu ayrı birer sunucu olarak kullanabilirsiniz.
Nedir Bu Docker?
Resmi tanımıyla “Docker, uygulamaları geliştirmek, göndermek ve çalıştırmak için açık bir platformdur. Docker, yazılımları hızlı bir şekilde teslim edebilmeniz için uygulamalarınızı altyapınızdan ayırmanıza olanak tanır. Docker ile uygulamalarınızı yönettiğiniz şekilde altyapınızı da yönetebilirsiniz. Docker’ın kodu hızlı bir şekilde gönderme, test etme ve dağıtma metodolojilerinden yararlanarak kod yazma ve canlı ortamda çalıştırma arasındaki gecikmeyi önemli ölçüde azaltabilirsiniz.”
Sözlük tanımını bir kenara bırakacak olursak Docker, sanal makinelerden farklı olarak bulunduğu donanımı değil, container’lar ile donanımın üzerindeki işletim sistemini ve uygulamaları sanallaştırır ve VM’in aksine tüm işletim sisteminin yükünü taşımadığından saniyeler içinde çok yüksek hızlarda, VM’lerdeki karmaşık konfigürasyonlara gerek duymadan neredeyse istediğiniz tüm sistemlerde uygulamalarınızın çalışmasını sağlar.
Dockerfile
Containerization sürecinin başlangıç noktası ve docker image’ın kaynak kodudur. Buradaki komutlar yardımıyla bir image oluşturulur. Oluşan image’ın nereden baz alındığı ve hangi bağımlılıklara sahip olacağı bilgisini içerir.
Docker Image
Container oluşturmak için kullanılan bir komut seti gibi davranırlar. Imagelar çalıştırılabilir dosyalar değildir. İçerisinde, çalıştırmak istediğiniz uygulamanın kaynak kodunu, libraryleri, dependencyleri ve uygulamanın çalışması için gerekli olan diğer tüm dosyaları ve dependency’leri barındırır. Imagelar değiştirelemez ve birden fazla read-only katmandan oluşur. Çalıştırılabilmesi için ilgili image baz alınarak bir container oluşturulur ve bununla birlikte üzerlerinde değişiklik yapabilmesi için bu read-only katmanların üzerine yeni bir writable katman eklenir.
Container
Containerları hızlı, bağımsız ve taşınabilir birer mikrobilgisayar olarak düşünebilirsiniz. Mikro kelimesi sizi yanıltmasın, ne kadar güçlü olmalarını isterseniz o kadar güçlü ve hızlı olabilirler. Tıpkı bir VM gibi kendi işletim sistemleri, CPU ve bellek yönetim süreçleri ve networkleri olabilir. Belki de en önemli özellikleri olarak izole sistemlerdir. Yani birbirlerinden ve bulundukları ortamdan tamamen bağımsız çalışabilirler. VM’lerden farklı olarak bir işletim sisteminin instance’ının tamamının yükünü taşımaz, yalnızca kodu çalıştırmak için gerekli dependency’leri ve OS süreçlerini barındırırlar. Bu sayede deploy ve restart edilmeleri kolaydır ve CI/CD pipeline’larında kullanılmaları oldukça verimlidir. Ayrıca uygulamayı çalıştırmakta gerekli olan her şeyi barındırdıkları için “benim bilgisayarımda çalıştı ama sunucuda çalışmıyor” gibi sorunları da gidermeyi sağlar.
e-bebek olarak monolith mimarinin kısıtlamalarını aşmak adına microservice mimariye dönüşüm yapıp servislerimizi, Consul, Zipkin, Portainer gibi üçüncü parti uygulamalar ve NoSQL veritabanımızı containerize ettik. Bu sayede örneğin order, customer, sms servisleri gibi yüksek transaction alan microservice’ler aşırı trafik altında kaldığında yeni bir instance oluşturarak load-balancing sağlayabiliyoruz ve VM’lerin aksine bu süreç yalnızca saniyeler sürüyor.