Bu məqalədə Docker-ın nə olduğu, nə olmadığı, niyə mövcud olduğu, nə üçün istifadə olunduğu və hansı zərurətlərdən yaranması ilə bağlı mövzulara toxunacağıq.
İstifadə etdiyimiz cihazların əməliyyat sistemi(Operating System) Hardware Infrastructure üzərində qurulur. Əməliyyat sistemi və Infrastructure qatı öz aralarında xəbərləşərək bütün prosesləri(actions) icra edirlər. Biz Ram, CPU və s kimi Hardware resurslarının paylanıb, istifadə olunmasına manual olaraq müdaxilə edə bilmirik. Ancaq, hansısa proqramı əməliyyat sistemimizə yükləyə bilirik. Məsələn, bu, Google Chrome, Vs Code, Java və s. kimi proqramlar ola bilər. Bu proqramlar da öz növbəsində cihazımızın əməliyyat sistemi üzərində onlara ayrılmış Library - Dependecies başlıqları altında toplanaraq əməliyyat sisteminin öz Library - Dependecies-i ilə birgə fəaliyyət göstərirlər. Sözü gedən fəaliyyət də mürəkkəb asılılıqlara səbəb olur. Ən vacib məsələ isə hər iki sistemin bir-birinə uyğun olması və dəstəkləməsI şərtidir. Düşünün ki, serverdə proqram təminatı qurursunuz. Bunun üçün serverə müxtəlif vasitələr, proqramlar yükləməli oluruq. Ancaq, versiya müxtəlifliyi, alternativlər və s səbəblərdən onları silib yenidən yükləmək lazım gəlir. Biz sildiyimizi düşünsək də, əslində, bu tətbiqlər cihazdan tamamilə silinmir. Çərəzləri, qeydləri, papkaları və saymadığım digər qalıntıları cihazımızda qalır və getdikcə sistemdə resurs istifadə etdiyindən, cihazımızın donmasına, performansının aşağı düşməsinə səbəb olur(bu istifadə etdiyimiz lokal komputerimiz üçün də keçərlidir). Bu zaman biz quraşdırmaq istədiyimiz hər hansı vasitəni birbaşa komputerimizə(Server) yox sistemdən tamamilə təcrid olunmuş ama nəticə olaraq bir bütün halında fəaliyyət göstərə bilən hansısa texnologiyaya ehtiyac duyuruq. Hansı ki, silmə və təmizləmə prosesləri də yuxarıdakı potenisal problemlərdən yan keçsin.
Bütün servisləri NET Core 1.0 versiyasında yazılan proqram təminatı düşünün. Bir gün bu servislərimizin birində databazaya migration ilə müdaxilə etmək qərarına gəldik, amma, baxırıq ki, .NET Core 1.0 versiyası Migration-u dəstəkləmir. İndi buna görə servsislərarası uyğunsuzluq olmasın deyə bütün servislərimizi ya .NET Core 2.0 və ya ondan sonrakı Migration-u dəstəkləyən veriyasına keçirməliyik ya da istifadə etdiyimiz Framework-ü dəyişməliyik. Bu həllər isə arzuolunmaz hətta absurddur. Gəlin etiraf edək ki, belə hallarda ilk ağlımıza gələn şey: "kaş bu Library - Dependecies bir-birinə təsir etməsə, hər şeyi rahat icra edə biləcəyimiz bir sistem olsa" olur. Hər gün yaranan bu və ya bu kimi problemlər üçün yeni həllər yaradılır. Biz isə yuxarıdakı məsələni necə həll edəcəyimizə baxaq. Bunun üçün bizə bir əməliyyat sistemi lazımdır. Hər servisin işləməsi üçün zəruri kanfiqurasiylar, paketlər və s. lori dildə desək bir qutuya yığılmalıdır və bu qutudakı hər servis digər servislərdən tamamilə təcrid olunaraq, aradakı asılılıq sıfıra endirilməlidir. Qutu rolunu oynayan texnologiya isə Container olacaq.
Container, özünə aid: Prosesləri, Servisləri, Network-ü olan, eyni əməliyyat sistemi və ya VM(Virual Maşın) üzərində işləyən yuxarıda haqqında qutu dediyimiz izolyasiya olunmuş ortam, sistemdir.
Dedik ki, Container-lar özünə aid, izolasiya(təcrid) olunmuş ortamda işləyir. Bu Container adlandırdığımız izolasiya olunmuş, Library - Dependecy -lər ilə cihazın Əməliyyat Sistemi arasında əlaqəni Docker qurur. Docker, Container-larda yerləşdirdiyimiz proqramların sürətli şəkildə quraşdırılması, daşınması və işə salınması üçün yaradılan texnologiyadır. Go dilində yazılan bu proqram təminatı proqramları birləşdirməyə, paylamağa və istənilən mühitdə işlətməyə imkan verir. İlk versiyası 2013-cü ildə çıxarılıb. Open Source olduğu üçün github üzərindən kodlarını əldə edə bilərsiniz. Bu platforma bizim üçün müxtəliflikləri birləşdirib, sistemlər arası lazımi xəbərləşməni və bütünlüyü təmin edir. İsətənilən sistemi, hətta əməliyyat sistemlərini(Ubuntu, Windows və s) belə Docker container-larda yerləşdirə bilərik. Bunlar heç nədən təsirlənmirlər, öz dünyalarında işləyirlər :)
Container və Docker arasındakı əlaqəyə baxaq. Container olduqca çətin və Low Level sistemə sahibdir. Docker isə bu işi asanlaşdırmaq üçün bizə bir çox High Level vasitə təqdim edir. Docker ilə istifadə etdiyimizə baxmayaraq Container, onunla ilə gələn bir şey deyil. Docker-dan əvvəl də mövcud idi. Hətta, LXD, LXC və s. kimi fərqli tipləri belə mövcuddur. Docker, LXC tipini istifadə edir. Əslində, Docker ilk başda bizə bir az da Virtual Machine-ı xatırlada bilər.
Virtual Maşın fiziki kompüterin əməliyyat sistemində virtual mühit yaradan və başqa bir əməliyyat sisteminin bu ortamda işləməsini təmin edən proqram mühitidir. Virtual maşın kompüterdə eyni anda birdən çox əməliyyat sisteminin işlədilməsi, proqram təminatının test edilməsi, tətbiqin təkmilləşdirilməsi və ya köhnə əməliyyat sistemlərinin dəstəklənməsi kimi məqsədlər üçün istifadə edilə bilər. Virtual maşınlar fiziki kompüterin resurslarını virtuallaşdırır, hər bir virtual maşını öz əməliyyat sistemi ayri-ayrılıqda, yaddaş və digər sistem resursları ilə təmin edir. Bu yolla siz eyni kompüterdə müxtəlif əməliyyat sistemlərini işlədə və proqram və xidmətlərin təcrid olunmuş mühitdə işləməsini təmin edə bilirsiniz.
Nə qədər oxşar məntiqlə işlədiyini düşünsək də Docker, virtual maşınlardan fərqli bir texnologiyadır və tətbiqin yüngül, sürətli paylanmasını təmin etmək üçün hazırlanmışdır. Docker və virtual maşınlar arasındakı əsas fərqlər bunlardır: -Resurs İstifadəsi: Docker virtual maşınlardan daha yüngül və səmərəlidir. Docker konteynerləri əməliyyat sisteminin nüvəsini paylaşır, virtual maşınların hər birinin öz əməliyyat sistemi nüvəsi və yaddaşı var. Buna görə də, Docker konteynerləri daha az resurs istehlak edir və daha sürətli işə başlayır. -İzolyasiya səviyyəsi: Docker konteynerləri virtual maşınlardan daha az təcrid olunur. Hər bir Docker konteynerində proqram və onun Library - Dependecies-i üçün tələb olunan bütün kitabxanalar və fayllar var. Bununla belə, Docker konteynerləri fiziki maşını daha az təcrid edir, nəticədə daha sürətli işə salınır. Ümumiyyətlə, Docker yüngül, sürətli və portativ tətbiq paylanmasını təmin edir, resurslardan virtual maşınlara nisbətən daha səmərəli istifadə edir və müasir proqram təminatının hazırlanması və paylanması proseslərində tez-tez üstünlük verilir.