VM немесе Docker?

Сізге VM емес, Docker қажет екенін қалай түсінуге болады? Сіз нақты нені оқшаулағыңыз келетінін анықтауыңыз керек. Егер жүйені кепілдендірілген ресурстармен және виртуалды жабдықпен оқшаулағыңыз келсе, онда таңдау VM-ге түсуі керек. Жұмыс істеп тұрған қолданбаларды бөлек жүйелік процестер ретінде оқшаулау қажет болса, сізге Docker қажет болады.

Сонымен, Docker контейнерлері мен VM арасындағы айырмашылық неде?

Виртуалды машина (VM) барлық виртуалды құрылғылары мен виртуалды қатты дискісі бар виртуалды компьютер, онда виртуалды құрылғы драйверлері, жадты басқару және басқа компоненттермен бірге жаңа тәуелсіз ОЖ орнатылған. Яғни, біз бір компьютерде көптеген виртуалды компьютерлерді іске қосуға мүмкіндік беретін физикалық жабдықтың абстракциясын аламыз.
Орнатылған VM дискілік кеңістікті әртүрлі жолдармен алуы мүмкін:

  • виртуалды қатты дискіге жылдамырақ қол жеткізуге мүмкіндік беретін және файлдардың фрагментациялануын болдырмайтын тұрақты қатты диск кеңістігі;
  • динамикалық жадты бөлу. Қосымша қолданбаларды орнату кезінде жад оған бөлінген максималды мөлшерге жеткенше олар үшін динамикалық түрде бөлінеді.

Сервердегі виртуалды машиналар неғұрлым көп болса, соғұрлым олар көбірек орын алады, сонымен қатар қолданбаның жұмыс істеуі үшін қажетті ортаның тұрақты қолдауын қажет етеді.

Докер контейнерлер негізіндегі қосымшаларды құруға арналған бағдарламалық құрал болып табылады. Контейнерлер мен виртуалды машиналар ұқсас артықшылықтарға ие, бірақ басқаша жұмыс істейді. Контейнерлер аз орын алады, өйткені VM-ге қарағанда хост жүйесінің ортақ ресурстарын шамадан тыс пайдалану, себебі VM-ден айырмашылығы, аппараттық емес, ОЖ деңгейінде виртуалдандыруды қамтамасыз етеді. Бұл тәсіл жад көлемін азырақ, жылдамырақ орналастыруды және оңай масштабтауды қамтамасыз етеді.

Контейнер хост жүйесіне қажетті интерфейстерді қамтамасыз ету арқылы қолданбаларды инкапсуляциялаудың тиімді механизмін қамтамасыз етеді. Бұл мүмкіндік контейнерлерге жүйенің өзегін ортақ пайдалануға мүмкіндік береді, мұнда контейнерлердің әрқайсысы негізгі ОЖ-ның жеке процесі ретінде жұмыс істейді, оның жад аймақтарының өзіндік жиыны (өзінің виртуалды мекенжай кеңістігі). Әрбір контейнердің виртуалды мекенжай кеңістігі жеке болғандықтан, әртүрлі жад аймақтарына жататын деректерді өзгерту мүмкін емес.
Docker үшін жергілікті ОЖ Linux болып табылады (Docker-ті Windows және MacOS жүйелерінде де қолдануға болады), ол бөлінген ядроны ұйымдастыруға мүмкіндік беретін өзінің негізгі артықшылықтарын пайдаланады. Windows жүйесінде Docker контейнерлерін іске қосу Linux виртуалды машинасының ішінде орын алады, өйткені контейнерлер хост жүйесінің операциялық жүйесін ортақ пайдаланады және олар үшін негізгі ОЖ Linux болып табылады.

Контейнер - бұл қалай жұмыс істейді?

Контейнер код пен тәуелділіктерді біріктіретін қолданба деңгейіндегі абстракция болып табылады. Контейнерлер әрқашан суреттерден жасалады, жазылатын жоғарғы қабатты қосады және әртүрлі параметрлерді инициализациялайды. Контейнердің өзінің жазу қабаты болғандықтан және барлық өзгерістер сол қабатта сақталатындықтан, бірнеше контейнерлер бірдей негізгі кескінге қатынасты бөлісе алады.

Әрбір контейнер негізгі шешімге енгізілген docker-compose жобасындағы файл арқылы конфигурациялануы мүмкін, docker-compose.yml. Онда контейнер атауы, порттар, идентификаторлар, ресурс шектеулері, басқа контейнерлер арасындағы тәуелділіктер сияқты әртүрлі параметрлерді орнатуға болады. Параметрлерде контейнер атауын көрсетпесеңіз, Docker әр жолы жаңа контейнер жасайды, оған кездейсоқ атау береді.

Контейнер кескіннен іске қосылғанда, Docker оқу/жазу файлдық жүйесін төмендегі кез келген қабаттардың үстіне орнатады. Бұл жерде Docker контейнері іске қосылатын барлық процестер орындалады.

Docker контейнерді алғаш рет бастағанда, бастапқы оқу/жазу қабаты бос болады. Өзгерістер орын алған кезде олар сол қабатқа қолданылады; мысалы, файлды өзгерткіңіз келсе, бұл файл төмендегі тек оқуға арналған қабаттан оқу-жазу деңгейіне көшіріледі.
Файлдың тек оқуға арналған нұсқасы әлі де бар, бірақ қазір көшірме астында жасырылған. Көлемдер контейнердің өмірлік цикліне қарамастан деректерді сақтау үшін пайдаланылады. Көлемдер контейнер жасалған кезде инициализацияланады.

Сурет контейнермен қалай байланысты?

Сурет - әрбір контейнерге арналған негізгі элемент. Кескін жобаға қосылған Dockerfile файлынан жасалған және бір-бірінің үстіне қабатталған және топтастырылған файлдық жүйелердің (қабаттардың) жиынтығы, тек оқу үшін қолжетімді; қабаттардың максималды саны - 127.

Әрбір кескіннің негізінде FROM пәрменімен белгіленетін негізгі кескін – Dockerfile кескінін жасау кезіндегі кіру нүктесі орналасқан. Әрбір қабат тек оқуға арналған қабат болып табылады және Dockerfile файлында жазылған файлдық жүйені өзгертетін жалғыз пәрменмен ұсынылады.
Бұл қабаттарды бір кескінге біріктіру үшін Docker Жетілдірілген көп деңгейлі одақ файлдық жүйесін (AuFS UnionFS үстіне құрастырылған) пайдаланады, бұл әртүрлі файл қабаттарындағы әртүрлі файлдар мен каталогтардың мөлдір қабаттасуына мүмкіндік береді, байланысты файлдық жүйені жасайды.

Қабаттар әр қабатқа қатысты ақпаратты орындау уақытында және құрастыру уақытында сақтауға мүмкіндік беретін метадеректерді қамтиды. Әрбір қабат келесі қабатқа сілтемені қамтиды, егер қабатта сілтеме болмаса, бұл кескіндегі ең жоғарғы қабат.

Dockerfile келесідей пәрмендерді қамтуы мүмкін:

  • FROM – бейнені қалыптастырудағы кіру нүктесі;
  • MAINTAINER – сурет иесінің аты;
  • RUN – кескінді құрастыру кезінде команданың орындалуы;
  • ADD – хост файлын жаңа суретке көшіру, егер URL файлын көрсетсеңіз, Docker оны көрсетілген каталогқа жүктейді;
  • ENV – ортаның айнымалылары;
  • CMD - сурет негізінде жаңа контейнер құруды бастайды;
  • ENTRYPOINT - Пәрмен контейнер іске қосылғанда орындалады.
  • WORKDIR – CMD командасын орындауға арналған жұмыс каталогы.
  • ПАЙДАЛАНУШЫ - кескіннен жасалған контейнер үшін UID кодын орнатады.
  • VOLUME - хост каталогын контейнерге орнатады.
  • EXPOSE — контейнерде тыңдалған порттар жиынтығы.

UnionFS қалай жұмыс істейді?

UnionFS — Linux және FreeBSD үшін сервистік стек файлдық жүйесі (FS). Бұл ТЖ көшіру-жазба (Copy-On-Write, COW) механизмін жүзеге асырады. UnionFS жұмыс бірлігі қабат болып табылады, әрбір қабат түбірдің өзінен каталог иерархиясы бар жеке толыққанды файлдық жүйе ретінде қарастырылуы керек. UnionFS басқа файлдық жүйелер үшін біріктіру қондырғысын жасайды және әртүрлі файлдық жүйелердегі (тармақтар деп аталатын) файлдар мен каталогтарды пайдаланушыға ашық түрде бір байланыстырылған файлдық жүйеге мөлдір біріктіруге мүмкіндік береді.

Жолдары бірдей каталогтардың мазмұны алынған файлдық жүйенің бір біріктірілген каталогында (бірдей аттар кеңістігінде) бірге көрсетіледі.

UnionFS келесі принциптерге негізделген қабаттарды біріктіреді:

  • қабаттардың бірі жоғарғы деңгейлі қабатқа, екінші және одан кейінгі қабаттар төменгі деңгейлі қабаттарға айналады;
  • қабат нысандары пайдаланушыға «жоғарыдан төменге» қол жетімді, яғни. егер сұралған нысан «жоғарғы» қабатта болса, «төменгі» қабатта аттас нысанның болуына қарамастан, ол қайтарылады; әйтпесе, «төменгі» қабат нысаны қайтарылады; егер сұралған нысан ол жерде де, ол жерде де болмаса, «Мұндай файл немесе каталог жоқ» қатесі қайтарылады;
  • жұмыс қабаты «жоғарғы» болып табылады, яғни деректерді өзгерту бойынша пайдаланушының барлық әрекеттері төменгі деңгейлердің мазмұнына әсер етпестен тек жоғарғы деңгейлі қабатта көрсетіледі.

Docker қолданбалы жұмыста контейнерлерді пайдаланудың ең кең таралған технологиясы болып табылады. Ол Linux ядросы қамтамасыз ететін топтар мен аттар кеңістігіне негізделген осы саладағы стандартқа айналды.

Docker бізге ОЖ ядросын бөлек ОЖ процестері ретінде жұмыс істейтін барлық контейнерлер арасында ортақ пайдалану арқылы қолданбаларды жылдам орналастыруға және файлдық жүйені барынша тиімді пайдалануға мүмкіндік береді.

Ақпарат көзі: www.habr.com

пікір қалдыру