Docker Nedir?

Barış Özaydın
Bir Geliştiricinin Maceraları
4 min readMay 11, 2016

Bir süredir Docker ile ilgili araştırma yapıyorum ve bu yaptığım araştırmalar sonucunda edindiğim bilgileri paylaşmaya karar verdim. Docker nedir, ne değildir konularına girmeden önce biraz olayın geçmişine gidip container kavramının ortaya çıkma nedenlerine değinmek istiyorum.

Container kavramı ortaya çıkmadan önce sanallaştırma teknolojileri işletim sistemi seviyesinde yapılmaktaydı. Yani biz vm’ler (virtual machine) içerisinde işletim sistemleri barındır ve bu vm’leri de host eden ve yöneten ayrı bir işletim sistemi olurdu. Haliyle 100mb’lık bir web uygulamasını vm’de host edebilmek için tüm işletim sistemi ile birlikte host etmek anlamına geliyor bu. Bu da aslında gereksiz kaynak tüketimi demek oluyor. Yani vm için ayırdığımız hdd, ram ve cpu’nun bir kısmı (hatta büyük bir kısmı) işletim sistemi tarafından harcanıyor. Peki ortalama 100mb’lık bir uygulamayı host etmek içi tüm işletim sistemine gerek var mı? Bu soruyu kendilerine soran Google ve Linux’ta çalışan birkaç developer bunun üzerine kafa yormuşlar ve linux kernel’ine ek bir geliştirme yapmışlar cgroups diye (2006). Böylelikle Linux dünyasında container yapısının ilk adımları atılmış olmuş.

Container neydi? Container sevgiydi, emekti

Eski hantal vm’ler yerine getirilen container yapısı kendi içinde bir işletim sistemi barındırmıyor bunun yerine işletim sistemi seviyesinde ihtiyaç duyulan yapılar container’ı host eden işletim sisteminden kullanılmaya başlanıyor. Yani ben 100mb’lık bir web uygulaması host edeceksem, container’ın boyutu da 100mb oluyor. Böylelikle deployment hızımı 10–15 dakikalardan birkaç saniyelere kadar düşmüş oluyor ve haliyle dağıtılması da kolaylaşmış oluyor.

Ancak cgroups ile hayatımıza giren container kavramı öyle vm’ler kadar basit yönetilemiyordu, bir container’ı oluşturup ayağa kaldırmak için çok fazla teknik bilgi gerekiyordu. Bunun üzerine Linux’a lxc (linux containers) adında bir araç geliştiriliyor ve lxc ile cgroups’u yönetmesi de daha kolay hale geliyor ancak yine de lxc’nin bazı dezavantajları bulunuyor. lxc container’ları tam anlamı ile işletim sisteminden soyutlamıyor yani network, hdd erişimi vs gibi işletim sistemi seviyesinde erişilebilen kaynaklar host edilen işletim sistemi özelliklerine bağlıydı. Yani benim bilgisayarımda çalışan bir container’ın başka bir Linux makinasında çalışacağının garantisi yoktu. Ancak bir container içerisinde çalışan uygulamanın sınırları belliydi, ilgili container’ın dışına çıkamazdı veya başka bir container farklı container’lara erişemezdi (bu tür açıklar daha önce çıkmış ancak şu anda bu tür açıklar bulunmamaktadır) yani tamamen izole bir ortamda çalışıyor uygulamalarımız. Lxc’deki eksikleri gören bir grup developer 2012–2013 yılında bir open source proje oluşturuyorlar ve adına da Docker koyuyorlar.

Docker Nedir?

Docker aslında container’ları dağıtmamızı, yönetmemizi kolaylaştıran bir araçtır kısaca.
Docker ilk çıktığı zaman Linux’ta hazır olan lxc üzerine geliştiriliyor ve lxc’nin dezavantajlarını da kapatarak ilerliyorlar ancak yaklaşık 1.5 yıl önce Docker lxc’den komple ayrılarak direkt cgroups ile haberleşecek seviyeye çekiliyor ve bu şu anda da bu şekilde devam etmekte. Docker ile birlikte kendi bilgisayarımda ayağa kaldırdığım bir container’ın Docker kurulu olan tüm Linux makinalarında çalışacağından emin olabiliyorum. Docker ile container’lar gerçek anlamda dağıtılabilir, hızlı deploy edilebilir hale geldi.

Peki ya Windows?

Linux camiasında tüm bu gelişmeler yaşanırken Microsoft tarafından pek bir ses çıkmıyordu. Docker’ın windows üzerinde çalışan versiyonu var ancak bu aslında arka planda bir vm’de linux host ediyor ve Docker’ı bu Linux ile haberleştirerek çalışıyor. Yani Docker yine Linux üzerinde çalışıyor aslında. Windows server 2016 ile birlikte Microsoft container yapısını windows’a da getireceğini açıkladı, şu anda Windows Server 2016 Technical Preview 5 yayınlanmış durumda ve container yapısı test edilebilir durumda. Yani şu zamana kadar sadece linux üzerinde çalışan uygulamaları sanallaştırmamıza olanak sağlayan bu teknoloji artık Windows dünyasında da gerçerli. .net ile geliştirilmiş bir uygulamayı mono’ya bağlı kalmaksızın container ile host edebileceğiz. Tabii bunlarla birlikte büyük ihtimalle yeni .net versiyonunda container’ları yönetmemizi sağlayacak yapılar da eklenebilir. Yani Microsoft biraz geç de olsa bu yapıyı kendi dünyasına entegre ederek, ben de oyunun içerisindeyim demeyi başarmıştır.

Biz developer’ların hayatını nasıl etkileyecek peki bu gelişmeler? Şöyle düşünelim;
Bir uygulama geliştiriyoruz ve bunun testlerini yapıyoruz vs her şeyin çalıştığından eminiz ancak server’a atıyoruz ve hop hata. çünkü uygulamamızın gereksinim duyduğu bir library server’da yüklü değil, hede klasörüne gerekli izinler verilmemiş vs vs. bu işlemi bir de container yapısı ile yaptığımızı düşünelim; bir uygulama geliştiriyoruz ve bu uygulamamızı ve ihtiyaç duyacağı library’leri vs container haline getiriyoruz ve Docker ile kendi bilgisayarımızda host ediyoruz, testlerini yapıyoruz ve her şeyin çalıştığından emin olduğumuz zaman server’a yolluyoruz ve bunun server’da da çalışacağı garanti altına alınmış oluyor çünkü server da aynı Docker’ı kullanıyor.

Hızlı deployment ve dağıtılabilirlik demişken işin içine CI (continuous integration) araçları girmeden olmaz. Development ekibiniz uygulamayı geliştiriyor ve test’e hazır olunduğu zaman git (veya başka bir source control aracı) üzerinden bir release çıkılıyor, CI aracımız bu release’i alıyor, derliyor, testlerini çalıştırıyor ve uygulamamızı ve ihtiyaç duyacağı diğer library’ler vs container haline getirip server’a atıyor ve tüm bu işlemler yaklaşık olarak 1 dakika (ve tabii test’lerimize bağlı olarak bu süreç artabilir) içerisinde gerçekleşiyor.

Tabii tek kullanım amacı deployment ile entegre etmek olmayabilir, SaaS, PaaS uygulamalarında da kendisine yer edinecektir.

Docker ile ilgili olarak aktaracağım bilgiler bu kadar. Umarım faydalı olmuştur ve umarım devamını getiririm.

--

--