Docker

Bu məqalə "Docker" silsiləsinə daxildir

Docker nədir ?

 

Docker yeni texnologiya olmasına baxmayaraq  mövcud çətinliklərə daha effektiv  həllər təklif etdiyi üçün qısa müddətdə kifayət qədər geniş istifadə olunmağa başlandı . Bizdə bu o qədər də hiss olunmasa da, IT dünyasında  top 5-likdə olan mövzu sayıla bilər. Fikrimcə docker ilə bağlı vəziyyəti fiziki serverlərdən virtuallaşdırmaya keçid dönəminə bənzətmək olar.  100-200 MB həcmi olan bir web server üçün sırf izolyasiya olsun deyə ayrıca bir fiziki server istifadə edilirdi və demək olar ki, həmin fiziki serverin cəmi 5-10 % resursu sərf olunurdu. Belə bir vəziyyətdə virtuallaşdırma çox ehtiyac duyulan həlləri təqdim etdi ve sürətli şəkildə keçid baş verdi. Hansı ki, indi nadir hallarda web, ftp və s. servisler üçün ayrıca fiziki serverlər ayrılır. Hazırkı vəziyyətdə virtuallaşdırma demək olar ki, ehtiyacları tam ödəyir. Lakin Docker yaradıcıları yeni yanaşma təqdim etdiler və 1 servis üçün (məs: web server) 1 virtual server, 1 əməliyyat sisteminin lazımsız resurs itkisi olduğunu və bunu daha effektiv həllini  təqdim etdilər. 1000 web server üzərində işləyən web proqram təminatını təsəvvür edəkBir virtual serveri  web server + web app + web app libraries (tələb olunan kənar modullar) + əməliyyat sistemi kimi qəbul etsək, 1000 əməliyyat sisteminin böyük bir resurs və dəstək işləri tələb etdiyini görərik. Müəyyən zaman sonra biz yeni versiya və ya fərqli əməliyyat sistemlərinə keçmək, virtuallaşdırma platformasını dəyişmək, şəxsi data mərkəzdən clouda və ya fərqli cloud xidmetinə keçmək istəsək, tələbə uyğun olaraq infrasruktura dərhal 200 server əlave etmək və ya azaltmaq istəsək  və s. bu kimi istəklərimiz olduqca ciddi çətinliklər yarada bilir. Docker bizə yeni bir həll təklif edir. Bəs docker nədir ?

1

 

Yük daşıyan bir gəmi təsəvvür edək. Qatarlarla daşınan çoxlu sayda fərqli ölçülü yükləri biz bu gəmilərə yükləyib daşımalı və yenidən başqa qatarlara təhvil verməliyik. Konteynerlər kəşf olunana  kimi daşınma işi çox problemlər yaradırdı. Qatardan gəmiyə və yenidən əksinə olan prossesdə daşınan malların yerləşdirilməsi və qablaşdırılması vaxt, zədələnmə , yer itkisi  və s. çətinliklərə səbəb olurdu.Konteynerlərdən sonra isə bu sahədə standartlar yarandı və artıq sadəcə konteynerləri qatarlardan gəmiyə və yenidən gəmilərdən qatarlara yığmaq kifayət edir. Docker məhz bu prinsip üzərində qurulub. Təsəvvür edin , Microsoft Azure-da 10 Virtual Serveri olan bir müəssisə bir müddət sonra AWS-ə, sonra isə daxili VMware mühitinə keçid etmək istəyir.Vəziyyəti təxminən konteynersiz yükdaşımaya bənzətmək olar.Bura kimi yazdıqlarım ümumi təsəvvür yaratmaq məqsədi ilə idi.

    Containers (Konteynerlər) –  Unix/linux aləmi üçün container-lər yeni mövzu deyil. Əvvəllər də BSD Jail, LXC(Linux Containers) və s. oxşar texnologiyalar istifadə olunub.  Linux containers (LXC) – əməliyyat sistemi səviyyəsində virtuallaşdırma metodu olub çoxlu sayda izolyasiya edilmiş linux sistemlərinin(containers)  control host (LXC host) üzərində işləməsini təmin edir.

   Docker – açıq mənbə kodlu konteynerləşdirmə(containerization) platforması olub proqram təminatının  rahat, portativ  container halında hazırlanmasını, daşınmasını, qurulmasını təmin etməyə imkan verir. Docker containeri – bizim proqram təminatının tam müstəqil işləyə bilməsini təmin edən bir qutu kimi təsəvvür edə bilərik.  Təsəvvür edək bizə  web proqram təminatı üçün  web server lazımdı.  Biz Centos7 ƏS + nginx web server + php + 5 php modulundan ibarət virtual server hazırlayırıq. Bu virtual serverdən Centos7 ƏS-ni çıxsaq və yerdə  qalan nginx +  web server + php + 5 php modul hissəsini docker container adlandıra bilərik. Proqram təminatının sərbəst işləyə bilməsi üçün lazım olan minimal tələblər container daxilində ödənilir.  Biz artıq bu containeri docker engine(Linux containerləri Windows-da və ya əksinə istifadə etmək mümkün deyil.) olan digər platformalarda istifadə edə bilərik. Bir neçə saniyə ərzində  bu container-lərdən  yüzlərlə yarada və ya silə bilərik. Containlər proyekti təhvil verdikdən sonra “– bizim serverdə işləyirdi problem sizin serverdədi“ kimi problemləri də aradan qaldırır. Proqram teminatının işləyəcəyi hər yeni serverdə  tələbləri yenidən hazır etmək lazım olmayacaq.Çünki qeyd etdiyimiz  kimi artıq proqram təminatına zəruri olan mühit container-in daxilində mövcuddur. Hazırladığımız containeri image-ə çevirə və ondan istədiyimiz qədər eyni yeni containerlər işə sala bilərik. Sadəcə bu containeri işə sala biləcəyimiz docker-engine qurulmuş server lazımdır.Proqram təminatının  docker container-də işləməsi ilə real host əməliyyat sistemi üzərində işləməsi arasında keyfiyyət,sürət fərqi hiss olunmaz dərəcədədir. Container-lər  birlikdə host əməliyyat sisteminin kernelini istifadə edirlər. Eyni zamanda paylaşılmış kernel (shared kernel) istifadə olunduğu üçün resursların daha effektiv istifadəsi mümkün olur.

 2

  

Docker Google tərəfindən yaradılan Go proqramlama dilində yazılıb. Docker resursları izolyasiya etmək ücün Linux kernelinin  cgroups, namespaces (adlar fəzası )xüsusiyyətlərindən və birləşik fayl sistemi olan UnionFS (union-capable file system)  -dən istifadə edir. Docker namespaces – i container adlanan izolyasiya olunmuş  iş mühitini yaratmaq üçün istifadə edir. Bu mühitdə bizim proqram təminatımız çalışacaq. Biz yeni container- i  işə salanda docker həmin container üçün bir neçə namespace -lər  yaradır.  Namespace-lər öz növbəsində izolyasiya qatı yaradır. 

3

Container-in  hər bir   funksionallığı ayrıca yaradılmış  namespace daxilində işləyir və işləmə səlahiyyətləri həmin namespace çərçivəsində məhdudlaşdırılır. Namespace  global system resurslarını abstraktlaşdıraraq  namespace daxilində olan proseslərə  global resursların izolyasiya olunmuş instansı kimi təqdim edir. Dəyişikliklər namespace-in üzvü olan proseslər tərəfindən görünür, lakin digər proseslər bunları görmür. Misal üçün process səviyyəsində izolyasiya olunaraq  container daxilində  işləyən web  proqram təminatınının, xidmətin, istifadəçinin hesabının kənardan əldə edilməsi ilə sistemə müdaxilə yalnız həmin container daxilində keçərlidir və digər containerlər və əməliyyat sistemi üçün təsirsizdir.  Docker container üçün   yeni namespace yaradaraq onun file sisteminin, adının, istifadəçilərinin, şəbəkə strukturunun və proseslərinin yerdə qalan sistemdən izolyasiyasını təmin edir. Pid, net, ipc, mnt, uts, usr  namespace-ləri istifadə olunaraq uyğun olaraq  proseslər, şəbəkə, proseslər arası qoşulma, istifadəçilər, ad, domain adı və s. izolyasiya olunur.

4

   

 

   

  Control Groups (qısa olaraq cgroups)– kontrol grup resurs istifadəsini (prosessor, əməli yaddaş, disk I/O, şəbəkə və s.) müəyyən prosesslər üçün məhdudlaşdırmaq və izolyasiya etməyə imkan verir. Cgroup vasitəsi ilə system resurslarının bölünməsi, prioritetləşdirilməsi, qadağa olunması, monitorinqi və idarə edilməsi mümkündür. Docker cgroup-u istifadə edərək əldə olan resursları containerlər arasında bölüşdürə , məhdudlaşdıra bilir. Misal üçün container-in istifadə edə biləcəyi əməli yaddaş həcminə məhdudiyyət tətbiq edə bilərik.

 5

 

6

UnionFS(Union File System)

UnionFS container-i fayl sistemi ilə  təmin edir.  Docker fərqli UnionFS çeşidlərini  aufs, btrfs, vfs, DeviceMapper istifadə edə bilər.

7

Container daxilində fayl sistemə edilən istənilən dəyişiklik  yeni laylar kimi yazılır. UnionFS bir neçə fayl sisteminin ierarxik olaraq mount  olunmasını və onların bir faylsistem kimi görünməsini təmin edir. Əsas nümunənin (image) fayl sistemi yalnız oxuma izni ilə (read-only 🙂 mount edilir və container-ə edilən dəyişikliklər isə oxuma-yazma iznli laylar kimi onun üzərinə mount olunur. Docker ən üstdə yerləşən laya baxmaqla edilmiş dəyişikləri təyin edə bilir. Lazımsız layların əlavə edilməsi image-i çox şişirtdiyi üçün aufs tərəfindən layların maksimum sayına məhdudiyyət təyin olunub.(maksimum 127 lay). Image və container arasındakı fərq məhz bu oxuma-yazma izni olan laydı. Biz dəyişiklik etdiyimiz containeri yenidən əsas nümunəyə(image) çevirə və ondan yeni containerlər yaratmaq üçün istifadə edə bilərik. UnionsFS  image-ləri ənənəvi monilit image-lərdən fərqli olaraq rahatlıqla dəyişməyə imkan verir.  Copy-on-Write(Yazarkən nüsxələmə) – containerler disk həcmi istifadəsinə və başladılma sürətinə görə çox effektivdir. Məlumat nüsxə kimi görünür, əslində isə bu original ümumi məlumata olan linkdi.  Faylsisteminə hər hansı dəyişiklik olunarsa, yalnız bu halda dəyişiklik olunmuş layın nüsxəsi yaradılır və ən üst mövqeyə əlavə olunur.

 Container  format  – Docker  namespace, cgroups və UnionFS –in birləşməsindən container adlanan format yaradır.  Susumaya görə container formatı  libcontainerdir. Gələcəkdə BSD Jails və Solaris Zone –ları dəstəkləyən yeni container formatlarının yaranması mümkündür.

 Docker –ı yuxarda təsvir etdiklərimizi bir yerə cəmləyib, bizə onları rahatlıqla istifadə etmək  imkanı yaradan alətlər toplusu kimi təsəvvür edə bilərik. Bu alətləri  namespace,cgoup mövzuları bilmədən də rahatlıqla istifadə edə bilərik.

8

Fikrimcə bu şəkil dockerin təmin etdiyi effektivliyi daha yaxsı təsvir edir. Növbəti məqalələrimizdə daha irəli səviyyəli və praktik mövzulara toxunacağıq. İrad və təkliflərə açığam.

 

Səs: +40. Bəyənilsin Zəifdir

Müəllif: Kamil Babayev

Şərh yazın