Sanallaştırma ve Docker

Bilgi Teknolojileri konuları üzerinde çalışan ve genel olarak “Sistemci” klasifikasyonuna giren arkadaşlarımızın kullandığı veya bildiği bir kavram Sanallaştırma (Virtualization) ve Docker kavramları, uygulamaları. Kişisel bilgisayar kullanımı açısından bakınca popüler bir kavram olmasa da, bulut sistemlerinde çokça kullanılmakta.


Docker nedir dersek, hiç bilmeyenler için öncelikle sanal makine(virtual machine) kavramından bahsetmek istiyorum. Çünkü docker bunun bir sonraki aşaması. Konuyu bilenler buraları atlayabilir.

Önce biraz geçmişe bakalım ve olayları baştan alalım.

Bir zamanlar kişisel bilgisayarların ekranında aynı anda sadece 1(bir) programın çalışabildiği günler vardı. Bilgisayar açılır, çalıştırılmak istenen programın adı yazılıp enterlandıktan sonra o program yüklenir, program tüm ekranı kaplar ve o sırada başka bir yazılım kullanılamazdı. Bir metin editöründe yazı yazarken bir yandan müzik dinlemek mümkün olmazdı.

Çalıştırılan program bilgisayarın tüm kaynaklarına(bellek, hard disk, ekran kartı, işlemci vs) sınırsız bir şekilde ulaşır, bilgisayarı adeta ele geçirmiş olurdu. Program çalıştığı sırada bilgisayarı bu kadar ele geçirmişken herhangi bir sorun nedeniyle kilitlenince, büyük ihtimalle bilgisayar da kilitlenirdi.

Sonrasında geliştirilen, işletim sistemlerinin artık temel bir görevi olan Sanal Bellek Yönetimi (Virtual Memory Management) ile çalıştırılan programların bilgisayarın belleğine direk erişimleri engellendi.

Kısacası, çalıştırılan bir bilgisayar programının bilgisayarın kaynaklarına direk erişimi aşamasında araya bir katman eklenmiş oldu. Buradaki ara katman kelimesi önemli.

Önceki model:
Bilgisayar Donanımı <-> Çalışan Programlar

Sonraki model:
Bilgisayar Donanımı <-> Sanal Bellek Yönetimi <-> Çalışan Programlar

Böylece artık program çalıştırıldığında, çalışması için gereken belleği (farkında olmadan) sanal bellek yönetiminden rica ediyor, sanal bellek yönetimi ise bilgisayarın donanımına kendi erişerek, uygun gördüğü boş alanları kullanması için programa tahsis ediyor ve ayrıca erişimini de sağlıyor. Başka programların aynı alanlara erişimine de izin vermiyor.

Peki madem aynı bilgisayar üzerinde aynı anda birden fazla programı kullanabilir olduk, bu programların verilerini birbirine karıştırmamayı başardık, o zaman aynı anda aynı bilgisayar üzerinde birden fazla farklı işletim sistemi de kullanılabilir mi? Evet kullanılabiliyor.

Bu sefer bilgisayarın kaynaklarını sadece programlara değil, işletim sistemlerine tahsis edecek/erişimine imkan sağlayacak/kontrol edecek bir sanallaştırma yazılımına ihtiyaç oluyor.

Bunu yapabilecek yazılımlar da geliştirilmiş durumda. Bunlara hypervisor yazılımı deniliyor. Bilgisayara ilk önce sanallaştırma(hypervisor) yazılımı yükleniyor ve işletim sistemleri de bunun üzerine yükleniyor. Örnek vermek gerekirse, bir bilgisayar kuracağımız zaman Windows cd’sini takıp işletim sistemini kuracağımız yerde, önce sanallaştırma programını yükleyip, işletim sistemlerini de sonradan bu sanallaştırma programı himayesinde yüklüyoruz.

Böylece işletim sistemi bilgisayar donanımına ulaşması gerektiğinde bu ihtiyacını sanallaştırma yazılımı transperan bir şekilde sağlıyor.

Sonuç olarak;

gibi bir kurulum yapılabiliyor. Böylece bilgisayar donanımında yeterince hard disk, bellek ve işlemci gücü olduğu müddetçe istediğimiz kadar işletim sistemini aynı bilgisayar üzerine yükleyebiliriz.

Peki neden sanallaştırma yapmak isteriz?
– Bir firmanın 5 farklı sunucuya ihtiyacı varsa, 5 adet (fiziksel) sunucu satın almak yerine, bir adet sunucu alması maliyet açısından tasarruf sağlayacaktır.
– 5 ayrı sunucunun elektrik masrafı yerine 1 sunucunun elektrik masrafı daha az olacaktır.
– 5 ayrı sunucunun ayrı ayrı donanım arızaları/bakımları ile ilgilenmek yerine, bir sunucunun çıkaracağı sorunla ilgilenmek daha kolay olacaktır.
– Sanallaştırma sunucusu üzerine kurulan işletim sistemlerinin hard diskleri sanallaştırma sunucusunda birer dosya olarak tutulduğu için her işletim sisteminin “hard disk dosyası” kopyalayarak basit bir şekilde full hard disk yedeği almış olabiliyoruz. Sanal makinedeki işletim sisteminde bir sorun olduğunda, herşeyi en baştan kurmak sadece bir adet dosya kopyalamak ile çözülebiliyor. Hatta snapshot denilen başka bir özellik ile snaphsot aldığınız herhangi bir zamana geri dönebiliyorsunuz. Örneğin sistemi bozmaktan çekindiğiniz bir programı yükleyecekseniz, öncesinde snapshot alarak, yüklemeyi yaparsınız, bir sorun olursa bir kaç dakika içerisinde snapshot aldığınız ana geri dönerek işletimi sisteminin önceki sağlam halinden devam edersiniz.
– Sanallaştırma sunucusu yazılımlarının sunduğu daha bir çok avantaj var.

Sanırım artık docker konusuna gelebiliriz.
Docker da bir sanallaştırma yöntemi. Docker adı firmanın adından geliyor. Biraz Gilette – jilet gibi 🙂

Docker ile yukarıda bahsettiğim sanallaştırma farklı bir boyutta yapılıyor. Yine biraz başa dönüp, işletim sistemlerine neden ihtiyacımız var diye bir soralım. İşletim sistemleri üzerine akademik çalışma yapmıyorsak hiç birimizin amacı bilgisayarı açıp bir işletim sistemi çalıştırmak ve mutlu olmak değil. İşletim sistemlerini programlarımızı çalıştırmak için kullanıyoruz.

Kullandığımız yazılımlar ise, işletim sistemi olmadan çalışamıyor. Çünkü bilgisayar donanımları (işlemci, bellek, hard disk, ekran kartı, bilgisayar ağı kartı) ile haberleşebilmek için işletim sisteminin sağladığı imkanları, yazılımları kullanması gerekiyor. Bunun için sadece ve sadece ekrana “merhaba dünya” yazan bir programın bile çalışabilmesi için bir işletim sistemine ihtiyacı var.

Günümüzde çoğu bilindik işletim sistemleri hard diskte 10GB kadar yer tutuyor. Peki, amacımız sanallaştırma yapmak ise ve sadece “merhaba dünya” yazacak gibi basit bir program kullanmak istiyorsak, neden hard diskte 10GB büyüklüğünde yer tutan ve en azından 2GB bellek kullanan bir işletim sistemi yükleyelim?

Burada docker devreye giriyor. Docker ile, kullanacağınız “merhaba dünya” programının kendisini, sadece ve sadece kendisinin çalışması için ihtiyacı olan yazılımları bir konteyner haline getirebiliyor, işletim sisteminin kendisine ait diğer herşeyi kapsam dışı bırakabiliyorsunuz. Böylece çok küçük boyutta bir konteyner elde etmiş oluyorsunuz. Konteyner kavramı, sanallaştırma sunucusu altında çalışan işletim sistemi değil, sanallaştırma sunucusu altında çalışan “program ve sadece kendisi için ihtiyaç duyduğu ek yazılımlar” olarak düşünülebilir.

Sanırım şöyle bir analoji yapabiliriz:
Her bir insan için aynı apartmanda yaşayacağı ayrı ayrı daireler yapabiliriz. Bu durumda her birine ayrı ayrı mutfak, banyo, salon yapmamız gerekir. Her bir insan için, ayrı ayrı müstakil villa inşa etmektense(ayrı ayrı fiziksel sunucu almak) bu yine iyi daha iyi bir seçim. Fakat yine de her birinin kombisi, kapısı, abonelikleri ayrı ayrı olmalı. Her birinin musluğunun akıtması, kombi arızası, temizliği ayrı ayrı zaman ve iş gücü gerektirmekte. Aynı apartman içinde yaşayan insanlar, her bir yazılım için ayrı işletim sistemi kurarak sanallaştırma yapmaya benziyor. Her yazılım için ayrı ayrı işletim sistemi kurmak, her yazılımın çalıştığı ortamın düzeninin ayrı ayrı sağlanmasını gerektirmekte.

Ya da her bir insan(program) için ayrı ayrı odalar/kendilerine ait yaşam alanları yaparak, banyo, mutfak ve salonu paylaştırabiliriz. Böylece evi paylaşan kişiler kendi eşyalarını(konfigurasyon ve ihtiyaç olan ek yazılımlar) kendi odalarında saklayacaklar, kimseninki kimseye karışmayacak ama diğer ihtiyaçlarını da ortak altyapı sayesinde(işletim sistemi yazılımları, bilgisayar kaynakları) giderebilecekler. 10 kişi bile bu şekilde yaşasa, bakım yapılması gereken 1 banyo musluğu, 1 kombi olacak. Çekip çevirmek çok daha kolay.

İşte bu docker, konteynerlaştırma mantığı. Herkese ayrı ayrı altyapı kurmaya gerek duyulmayan altyapı. “Zaten kişisel bilgisayarımızda birden fazla program çalıştırabiliyoruz, docker kullanmaya ne gerek var” diye soracak olursak; docker kullanarak bilgisayarımızın konfigurasyonundan/güncellemelerinden/üzerinde yüklü olan programlardan ve bunların versiyonlarından bağımsız olan, hatta normalde farklı bir işletim sistemi altında çalışan bir programı docker konteyneri ile çalıştırabilir, kullanabiliriz. Bir linux programını, windows programını birlikte çalıştırabiliriz. Normalde birden fazla versiyonu yüklenemeyen programların farklı versiyonlarını da yükleyebiliriz.

Ayrıca konteyner içerisinde, kullanacağınız yazılımın ihtiyacı olan ek yazılımların versiyonlarını da sabitlemiş oluyoruz. İşletim sistemlerine ait yazılımların versiyonları istemsiz bir şekilde güncellenebiliyor(windows updateler) ve beklenmedik sorunlar ortaya çıkabiliyor. Biz programımızı bir docker konteyner içinde çalıştırıyorsak, işletim sistemindeki güncellemeler , o kütüphanelerin işletim sisteminde olması/olmaması bizi etkilemiyor.

Aynı platformda olduktan sonra işletimi sisteminin versiyonu bizi çok etkilemiyor.

Program1, Program2,Program3 ve Program4 ‘ü aynı anda aynı bilgisayara yükleyemiyor olsaydık ve ayrı ayrı sanal makinelerde çalıştırmamız gerekiyor olsaydı nasıl olurdu?

Bu şekilde bir kurulum, ayrı ayrı fiziksel sunucu kurmaktan daha uygun bir çözüm olsa da yine de donanım kaynakları ihtiyacı ve maliyeti, konfigurasyon yönetimi, işletim sistemi lisanslama maliyeti, güncellemeler, yedekleme işlemleri gereğinden fazla yapılması gerekiyor. Her ufak ihtiyaç için bir sanal sunucu kurmak daha masraflı ve yönetilmesi zor çözüm oluyor.

Docker kullanımına normalde çok ihtiyacım olmasa da bana şöyle faydası oldu. Çalıştığım şirketin 10 kadar şubesi var ve bunlar merkezdeki VPN sunucusu üzerinden birbirine bağlı. Bu VPN sunucusu üzerinde olan bilgisayar üzerinde bir çok firewall ayarı da yapılmış durumda. Ayrıca bu sunucuya VPN kanalından tekil kullanıcılar da ulaşmakta. Sonuç olarak bu VPN sunucusu yoğun kullanım altında. Merkezdeki bu VPN sunucusunu başka bir yere daha bağlamak istediğim sırada gördüm ki diğer sunucu ile arasında bir versiyon farkı var ve bazı konfigurasyon parametreleri nedeniyle VPN sunucumuzu güncellememiz gerekiyor.

Açıkçası o sırada bekleyen diğer işlerden dolayı merkezdeki VPN sunucusunu güncelleme opsiyonunu düşünmedim, gereğinden fazla zaman alacaktı. Mevcut VPN programını kaldırmadan yenisini kurmak mümkün olmadığından dolayı yeni bir sunucu mu kursam acaba diye düşündüm. Fakat her eklenen donanım/bilgisayar, gün geliyor ayrı bir sorun çıkartıyor, ayrı ilgi bekliyor. Bundan dolayı sadece bu iş için ayrı bir bilgisayar kurmayı da çok istemedim.

Bu durumda ne yapmalı acaba diye düşünürken, aklıma docker opsiyonu geldi ve hub.docker.com ‘a bir bakayım dedim. hub.docker.com bir çok popüler yazılımın konteyner haline getirilmiş imajlarlarını içeren bir kütüphane. Burada yeni versiyon VPN konteynerının bulunduğunu gördüm. Buradan aldığım konteyneri mevcut VPN sunucusunun olduğu sunucuya çektim. Her konteyner içindeki yazılımın konfigurasyonu da ayrıca yapılabildiği için bunu da kolayca yapabildim ve bir farklı network portu üzerinden aynı sunucu üzerinde ikinci VPN sunucusunu çalıştırabildim. Çalıştırınca, firewall üzerinde bir kaç yönlendirme yaptıktan sonra ihtiyacım olan bağlantıyı da kurabildim. Kurulduğu günden itibaren de kesintisiz ve sorunsuz olarak çalışmakta.

Sanallaştırma sunucusu üzerine işletim sistemleri kurmanın da, docker kullanımının da yerine göre avantajları/dezavantajları var. Bunun gibi versiyon çakışmaları yaşanacak kurulumlarda veya yazılımların ana bilgisayarın kurulumundan, versiyonundan yalıtılmak istenildiği durumlarda sistem kaynaklarını da tüketmeden güvenle kullanılabilecek bir teknoloji.