Container Teknolojisi ve Docker

Daha önce kullandığınız işletim sistemi üzerine bir sanal makine (virtual machine) kurup bir başka işletim sistemi çalıştırmayı denediniz mi? Örneğin Windows 10 işletim sistemini kullanıyorsunuz. Herhangi bir disk ayırma işlemi yapmadan ve bilgisayarınızı yeniden başlatmaya gerek duymadan herhangi bir GNU/Linux dağıtımını (Ubuntu, Pardus, Arch Linux vb.) Windows 10 üzerinde kullanmak istediniz. Ne yaparsınız?

Elbette Hypervisor adı verilen yazılımları sisteminize kurup elinizde olan işletim sisteminin ISO dosyasını bu programlar aracılığıyla yükleyip çalıştırmaya kalkarsınız. Fakat çoğu zaman bu kurduğunuz işletim sisteminden ve üzerinde çalıştırdığınız uygulamalardan tam performans alamazsınız. Bugün size bu yazımda Hypervisor yazılımlarından bahsetmeyeceğim. Bugün bu yazılımlarda ortaya çıkan sorunlar başta olmak üzere yazılım sektöründe birçok problemi çözüme kavuşturan Container teknolojisinden ve Docker’dan bahsedeceğim.

Öncelikle Container teknolojisinin ne olduğuna ve nasıl ortaya çıktığına bir bakalım. Container (Konteyner) teknolojisi, herhangi bir işletim sisteminde çalışan bir uygulamayı bir başka işletim sisteminde (veya aynı sistemde) herhangi bir Hypervisor yazılımına ihtiyaç duymadan çalıştırmaya yarayan bir teknolojidir. Bu teknolojinin temel mantığı, uygulamayı çalıştırmak için ayrı bir işletim sistemi kullanmak yerine sadece uygulama ile ilgili kütüphaneleri ve çalıştırılabilir dosyaları kullanmaya dayanır. Bu da fazlasıyla kaynak israfını önler. Aşağıdaki resimde sanal makinelerin (virtual machines) kullandığı uygulama çalıştırma yöntemi ile Container teknolojisinin kullandığı yöntem karşılaştırılmaktadır.

Figür 1: Sanal Makineler ile Container Teknolojisinin Farkı[1]

Sanırım kafamızda bazı şekillenmeler oluşmaya başladı değil mi? Şimdi de bu teknolojinin tarihinden bahsedelim. Bunun için 1979 yılındaki UNIX işletim sistemine gitmemiz gerekiyor. 1979 yılındaki UNIX işletim sisteminin adı UNIX V7 olmakla birlikte, bu işletim sisteminin getirdiği çok önemli bir yenilik olan Chroot, aslında hemen hemen Container teknolojisinin başladığı nokta diyebiliriz. Chroot ile kullandığımız işletim sistemi üzerinden bir başka işletim sisteminin dosya sistemine root (tam yetkili kullanıcı) olarak erişip o işletim sistemindeki çeşitli komutları çalıştırabiliyor ve işlem yapabiliyorduk.

Elbette daha sonra bu konu ile ilgili çeşitli gelişmeler olsa da en önemlisi 2000 yılında FreeBSD işletim sistemiyle gelen Jail olmuştur. Jail ile bir FreeBSD işletim sistemi üzerinde bir başka FreeBSD sistemini çalıştırmaya yarayan (ki bu çalıştırdığımız her bir sisteme Jail adı verilir) bir araçtır. Chroot ile benzer özellikleri olsa da Jail’in host makineden bağımsız olarak kendi IP adresine, servislere ve süreçlere (process) sahip olması onu çok farklı bir noktada tutar. Jail aslında bir servisi veya programı, diğer servis ve programlardan bağımsız ve izole bir şekilde çalıştırmaya yarayan bir teknolojiydi ki bu bugünün Container teknolojisini oldukça andırmaktadır.

Figür 2: Jail Sisteminin Programları Birbirinden İzole Olarak Çalıştırması[2]

Elbette FreeBSD tarafı böyle bir sistem geliştirirken Linux tarafı da bundan aşağı kalmadı ve 2001 yılında Linux-Vserver adı verilen ve çalışma prensibi Jail’e çok benzeyen bir sistem yayınladı. Fakat bu sistem çok fazla destek bulamadı. Şuan bile ben bu yazıyı yazarken en son yayınlanan stabil sürüm 14 Mart 2008 tarihinde yayınlanmıştır. Bununla birlikte Linux tarafında gelişmeler durmadı ve 2005 yılında Open VZ (Open Virtuzzo) adı verilen kernel bazlı sanallaştırma teknolojisi yayınlandı. 2006 yılında ise Google mühendisleri tarafından Process Containers (Şimdilerde cgroups olarak geçiyor…) adı verilen bir Linux kernel modülü tasarlandı. Bu modül ile işletim sisteminde çalışan süreçler (process) ile ilgili kaynak kullanımını kısıtlayan ayarlamalar yapılabilmekteydi.

Bütün bu gelişmelerin ardından ortaya çıkan ve en çok ses getiren yenilik 2008 yılında yayınlanan LXC (Linux Containers) oldu. LXC ile artık Linux sistemlerinde Container’ların kullanımı tamamiyle desteklendi diyebiliriz. Az önce bahsettiğimiz "cgroups" üzerine kurulu olan LXC, herhangi bir ek yamaya ihtiyaç duymadan tek bir Linux kernel’i üzerinde çalışabiliyor ve uygulamalara tam bir izolasyon sağlayabiliyordu. Harika ve neredeyse sanal makinelere yakın özelliklerinin yanında LXC’yi çok geniş bir kullanıcı kitlesine yaymak için bir problem vardı. LXC’nin konfigürasyonu oldukça zordu. Bu nedenle bu sistemin gerekli kısımlarını kullanıcılara açacak ve kullanıcıların onu kolayca kullanmasını sağlayacak bir sisteme ihtiyaç vardı.

Figür 3: Genel LXC Mimarisi[3]

Birçok dev şirketin desteklediği açık kaynaklı bulut uygulamaları platformu olan Cloud Foundry, 2011 yılında önce LXC’nin ilk sürümlerini kullanarak daha sonra da kendi implementasyonlarıyla Warden adı verilen bir projeyi duyurdular. Warden, bir arkaplan servisi şeklinde herhangi bir işletim sistemi üzerinde çalışan ve ortamların izole edilmesini sağlayan bir sistemdi. Onun kullandığı istemci-sunucu (client-server) modeli, Container’ların birçok Host üzerinden yönetilmesine olanak sağlamıştır. 2013 yılında ise LMCTFY (Let Me Contain That For You) adı verilen bir Container yöneticisi yayınlansa da proje 2015 yılında durduruldu.

Bütün bu gelişmelerden sonra 13 Mart 2013 yılında Docker adı verilen platform yayınlandı. Docker ile artık Container’lar üzerinde çalıştırdığınız uygulamalar Image adı verilen dosyalarda paketlenip dağıtılabilir hale geldi. Bu Image dosyalarını oluşturmak için oldukça sade bir sözdizimine sahip olan ve Dockerfile adı verilen metin bazlı konfigürasyon dosyaları kullanılmaktadır. Oluşturulan Image dosyaları genellikle DockerHub adı verilen platform ile herkese dağıtılır. Böylelikle bir iş için tekrar tekrar Image oluşturmaya gerek kalmadan, burada hazır olarak oluşturulmuş olan Image’ler alınıp çalıştırılır.

Figür 4: Docker ile Sanal Makinelerin Kaynak Kullanımının Karşılaştırılması[4]

Şimdi biraz Docker mimarisinden bahsedelim. Docker temel olarak iki kısımdan meydana gelmektedir. Bunlardan ilki Linux Kernel’ı ile doğrudan iletişim kuran Docker Daemon iken, ikincisi Docker Daemon ile bağlantı kurup onun bizim tarafımızdan yönetilmesini sağlayan Docker CLI‘dır. Docker Daemon çalışmak için Linux çekirdeğine ihtiyaç duyarken, Docker CLI farklı platformlarda çalışabilmektedir. Örneğin Windows veya Mac OS üzerinde de Docker CLI çalıştırabilirsiniz. Fakat Windows ve Mac OS üzerinde Docker sistemini kullanabilmeniz için bir Hypervisor yazılım (VMware veya Oracle VM VirtualBox gibi) ile bu platformlar üzerinde bir Linux dağıtımı çalıştırmanız ve bu dağıtım üzerine de Docker Daemon’u kurmanız gerekmektedir. Daha sonra Docker CLI ile kurduğunuz Docker Daemon’u iletişime geçirmelisiniz.

Figür 5: Docker Daemon ve Docker CLI[5]

İletişim kısmı ne yapacağınıza göre değişir. Örneğin Docker CLI ve Docker Daemon’ı farklı bilgisayarlarda kullanıyorsanız, iletişimi bir REST API ile sağlayabilirsiniz. Bir başka örnek verecek olursak Docker CLI ve Docker Daemon’ı aynı Linux dağıtımı üzerinde kullanmanız durumunda UNIX Socket’leri ile hızlıca birbirlerini etkileştirebilirsiniz. Benim tavsiyem elbette farklı sistemleri karıştırmayıp hem Client hem de Server olarak bir Linux dağıtımı kullanmanızdır. Böylece Linux doğasına uygun olarak yazılmış bir uygulamayı farklı platformlar için çalıştırırken istenmeyen hatalar karşılaşmanın önüne geçmiş olursunuz.

Genellikle Image paketlerinin tutulduğu yerler Docker Registry olarak adlandırılır. Örneğin yukarıda bahsettiğim DockerHub bir Docker Registry örneğidir. DockerHub ile oluşturduğunuz Image’ları herkesle paylaşabilirsiniz. Bu sitede sertifikalı ve ister açık kaynaklı isterse de kapalı kaynaklı olsun her türlü ihtiyaç duyabileceğiniz Image dosyalarına erişebilirsiniz. Ayrıca Docker sistemi Private Registry adı verilen kendi Registry hizmetine de sahiptir. Bulut ile herkese dağıtım yapmak istemeyen kişiler için tercih edilebilir. Belki de Docker sistemini herkes için kullanılabilir hale getiren şey Docker Registry’lerin varlığı ve zenginliğidir diyebiliriz.

Figür 6: Docker Mimarisinin Özeti[6]

Son olarak Docker sistemini çeşitli Linux dağıtımlarına nasıl yükleyeceğimizden bahsedelim. En basit yükleme yöntemi "https://get.docker.com/" aresinde bulunan Script’i indirip çalıştırmaktır. Bu yükleme yöntemiyle Debian, Ubunru, CentOS, Fedora, Raspbian gibi dağıtımların pek çok sürümüne kurulum yapabilirsiniz. Bulunduğunuz dizine bu web sayfasında yer alan Script’i indirip çalıştırmak için şu komutları sırasıyla uygulamalısınız (dağıtımınızda "curl" programının yüklü olduğu varsayılmıştır):

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

Yükleme sırasında izin doğrulamalarını yapıp yükleme işlemini tamamlayabilirsiniz. Arch tabanlı dağıtımlarda ise şu şekilde yükleme işlemini gerçekleştirebilirsiniz:

sudo pacman -S docker

Sisteminize Docker kurulumu gerçekleştirdikten sonra "docker" isimli arkaplan servisini etkinleştirmeniz gerekmektedir. Bunun için Systemd destekli sistemlerde şu komutu girmeniz yeterli olacaktır:

sudo systemctl start docker

Eğer sisteminiz Systemd desteğine sahip değilse şu komut ile Docker servisini etkinleştirebilirsiniz:

sudo service docker start

Bu şekilde artık Docker arkaplan servisi çalışmaya başlayacaktır. Eğer her sistem açılışında bunları yapmak istemiyor ve Docker servisinin otomatik olarak başlamasını istiyorsanız Systemd destekli dağıtımlar için şu komutu kullanabilirsiniz:

sudo systemctl enable docker

Yine Systemd desteğine sahip olmayan dağıtımlar için şu komutu kullanabilirsiniz:

sudo chkconfig docker on

En son yapacağınız işlem ise kullanıcınızı "docker" grubuna eklemek olacaktır. Böylelikle kendi kullanıcınız ile Docker kullanırken herhangi bir izin sorunu ile karşılaşmayacaksınız. Örneğin "mustafa" isimli kullanıcıyı "docker" grubuna eklemem için şöyle bir komut girmem gerek:

sudo usermod -aG docker mustafa

Bu yaptığınız işlem oturumunuzu kapatıp tekrar açtığınızda etkin hale gelecektir. Böylelikle Docker kurulumu tamamlanmış oluyor. Eğer kurulumun düzgün bir şekilde yapılıp servisin aktif olup olmadığını kontrol etmek isterseniz şu komutu girmeniz ve verilen çıktıda "active (running)" yazısını görmeniz gerekmektedir:

Figür 7: Docker Servisinin Kontrol Edilmesi

Bu yazımızda Container sisteminin ne olduğundan ve tarihi gelişiminden bahsettik. Ayrıca Docker sisteminin mimarisini ve farklı Linux dağıtımlarına nasıl kurulabileceğini gösterdik. Elbette Docker’dan sonra da çeşitli Container sistemleri geliştirilmiştir. Bunlardan belki de en önemlisi Go diliyle yazılmış olan Kubernetes‘dir. Kubernetes ile Container topluluklarını organize edebilirsiniz. Böylelikle birbiriyle bağlantılı veya bağlantısız pek çok Container’ın kullanıldığı bir sistemde büyük oranda kaynak tasarrufu sağlamış olursunuz. Ayrıca bir Container’ın sağlık durumunun kontrol edilmesi ve durduğunda otomatik yeniden başlatılması gibi çok güzel özellikleri vardır. Fakat ben Kubernetes’den burada bahsetmeyeceğim. O bambaşka bir konudur.

REFERANSLAR

  1. http://www.serverpronto.com/spu/wp-content/uploads/2016/05/MJHfm1c.jpg
  2. http://westerly-lzh.github.io/cn/2014/07/FreeBSD-Jail/
  3. https://www.researchgate.net/figure/General-LXC-architecture_fig2_271195792
  4. https://cdn.edureka.co/blog/wp-content/uploads/2016/10/virtual-machine-vs-docker-example-what-is-docker-container-edureka-1.png
  5. https://nickjanetakis.com/assets/blog/dockers-architecture-6c296cdac053f794eabed5ddda5c04ba7110c746687a0e8b88ba6df919415175.jpg
  6. https://www.aquasec.com/wiki/download/attachments/2854889/Docker_Architecture.png
4.2 5 votes
Article Rating
Subscribe
Bildir
guest

1 Yorum
Eskiler
En Yeniler Beğenilenler
Ahmet

Helal olsun çok güzel bir anladım.
Systemd kısmını biraz daha anlatabilirsiniz.