VM ці Docker?

Як зразумець, што вам патрэбен Docker, а не VM? Трэба вызначыць, што менавіта вы хочаце ізаляваць. Калі патрабуецца ізаляваць сістэму з гарантавана вылучанымі рэсурсамі і віртуальным апаратным забеспячэннем, тады выбар павінен упасці на VM. Пры неабходнасці ізаляваць працуючыя прыкладанні як асобныя працэсы сістэмы, вам спатрэбіцца Docker.

Дык у чым жа адрозненне Docker-кантэйнераў ад VM?

Віртуальная машына (VM) — гэта віртуальны кампутар з усімі віртуальнымі прыладамі і віртуальнай цвёрдай кружэлкай, на які і ўсталёўваецца новая незалежная АС разам з віртуальнымі драйверамі прылад, кіраваннем памяццю і іншымі кампанентамі. Т. е. мы атрымліваем абстракцыю фізічнага абсталявання, якая дазваляе запускаць на адным кампутары мноства віртуальных кампутараў.
Усталяваная VM можа па-рознаму займаць месца на дыску кампутара:

  • фіксаванае месца на цвёрдай кружэлцы, што дазваляе ажыццяўляць хутчэйшы доступ да віртуальнай цвёрдай кружэлкі і дазваляе пазбегнуць фрагментацыі файла;
  • дынамічнае вылучэнне памяці. Пры ўсталёўцы дадатковых прыкладанняў памяць будзе дынамічна вылучацца пад іх, пакуль не дасягне максімальнага аб'ёму, адведзенага ёй.

Чым больш віртуальных машын на сервер, тым больш месца яны займаюць, а таксама патрабуюць сталай падтрымкі асяроддзя, які патрабуецца для працы вашага прыкладання.

Докер - гэта ПЗ для стварэння прыкладанняў на аснове кантэйнераў. Кантэйнеры і віртуальныя машыны маюць падобныя перавагі, але працуюць па-рознаму. Кантэйнеры займаюць менш месцы, т.я. перавыкарыстоўваюць большую колькасць агульных рэсурсаў хост-сістэмы чым VM, т.я. у адрозненне ад VM, забяспечвае віртуалізацыю на ўзроўні АС, а не апаратнага забеспячэнне. Такі падыход забяспечвае меншы аб'ём займаемай памяці, хуткае разгортванне і прасцейшае маштабаванне.

Кантэйнер дае больш эфектыўны механізм інкапсуляцыі дадаткаў, забяспечваючы неабходныя інтэрфейсы хост-сістэмы. Дадзеная магчымасць дазваляе кантэйнерам падзяліць ядро ​​сістэмы, дзе кожны з кантэйнераў працуе як асобны працэс асноўнай АС, у якога ёсць свой уласны набор абласцей памяці (уласная віртуальная адрасная прастора). Бо віртуальная адрасная прастора кожнага кантэйнера з'яўляецца ўласнай, то дадзеныя, якія належаць розным абласцям памяці, не могуць быць змененыя.
Натыўнай АС для Docker з'яўляецца Linux (Docker можна выкарыстоўваць таксама і на Windows, і на MacOS), ён выкарыстоўвае яе асноўныя перавагі, якія і дазваляюць яму арганізаваць падзел ядра. Запуск Docker-кантэйнераў на Windows будзе адбывацца ўсярэдзіне віртуальнай машыны з АС Linux, т.к. кантэйнеры падзяляюць АС хост-сістэмы і асноўнай АС для іх з'яўляецца Linux.

Кантэйнер - як гэта працуе?

кантэйнер - Гэта абстракцыя на ўзроўні прыкладання, якая аб'ядноўвае код і залежнасці. Кантэйнеры заўсёды ствараюцца з выяў, дадаючы даступны для запісу верхні пласт і ініцыялізуе розныя параметры. Т. к. кантэйнер мае свой уласны пласт для запісу і ўсе змены захоўваюцца ў гэтым пласце, некалькі кантэйнераў могуць сумесна выкарыстоўваць доступ да адной і той жа асноўнай выяве.

Кожны кантэйнер можна наладзіць праз файл у праекце docker-compose, уключанага ў асноўнае рашэнне - docker-compose.yml. Там можна задаць розныя параметры такія як імя кантэйнера, парты, ідэнтыфікатары, ліміты рэсурсаў, залежнасці паміж іншымі кантэйнерамі. Калі ў наладах не задаваць імя кантэйнера, то Docker кожны раз будзе ствараць новы кантэйнер, прысвойваючы яму імя выпадковым чынам.

Калі кантэйнер запускаецца з выявы, Docker мантуе файлавую сістэму для чытання і запісы па-над любымі пластамі ніжэй. Менавіта тут будуць выконвацца ўсе працэсы, якія мы жадаем, каб наш кантэйнер Docker выконваў.

Калі Docker упершыню запускае кантэйнер, пачатковы пласт чытання-запісы пусты. Калі адбываюцца змены, яны прымяняюцца да гэтага пласта; напрыклад, калі вы жадаеце змяніць файл, гэты файл будзе скапіяваны з пласта толькі для чытання ніжэй у пласт для чытання і запісы.
Версія файла, даступная толькі для чытання, усё яшчэ будзе існаваць, але зараз яна ўтоена пад копіяй. Для захоўвання дадзеных, незалежна ад жыццёвага цыкла кантэйнера, выкарыстоўваюцца тамы. Тома ініцыялізуюцца пры стварэнні кантэйнера.

Як выява звязаны з кантэйнерам?

вобраз - асноўны элемент для кожнага кантэйнера. Выява ствараецца з Dockerfile, дададзенага ў праект і ўяўляе сабой набор файлавых сістэм (пластоў) напластаваных сябар на сябра і згрупаваных разам, даступных толькі для чытання; максімальны лік пластоў роўна 127.

У аснове кожнай выявы знаходзіцца базавая выява, які паказваецца камандай FROM — уваходны пункт пры фармаванні выявы Dockerfile. Кожны пласт з'яўляецца readonly-пластом і прадстаўлены адной камандай, якая мадыфікуе файлавую сістэму, запісанай у Dockerfile.
Для спалучэння гэтых пластоў у адну выяву Docker выкарыстоўвае Advanced multi layered Union file system (AuFS пабудавана на базе UnionFS), дазваляючы розным файлам і дырэкторыям з розных файлавых пластоў празрыста накладвацца, ствараючы звязаную файлавую сістэму.

Пласты змяшчаюць метададзеныя, якія дазваляюць захоўваць спадарожную інфармацыю аб кожным пласце падчас выканання і зборкі. Кожны пласт утрымоўвае спасылку на наступны пласт, калі пласт не мае спасылкі, значыць гэта самы верхні пласт у выяве.

Dockerfile можа ўтрымліваць такія каманды, як:

  • FROM - уваходная кропка пры фарміраванні выявы;
  • MAINTAINER - імя ўладальніка выявы;
  • RUN - выкананні каманды падчас зборкі выявы;
  • ADD - капіраванне файла хаста ў новы вобраз, калі паказаць URL-файла, Docker загрузіць яго ў зададзеную дырэкторыю;
  • ENV - зменныя асяроддзя;
  • CMD - запускае стварэнне новага кантэйнера на аснове выявы;
  • ENTRYPOINT - каманда выконваецца пры запуску кантэйнера.
  • WORKDIR - працоўны каталог для выканання каманды CMD.
  • USER - усталёўвае UID для стваранага на аснове выявы кантэйнера.
  • VOLUME - мантуе дырэкторыю хаста ў кантэйнер.
  • EXPOSE - набор праслухоўваных ў кантэйнеры партоў.

Як працуе UnionFS?

UnionFS – службовая стэкавая файлавая сістэма (ФС) для Linux і FreeBSD. Дадзеная ФС рэалізуе механізм капіявання пры запісе (Copy-On-Write, COW). Працоўнай адзінкай UnionFS з'яўляецца пласт, кожны пласт варта разглядаць як асобную паўнавартасную файлавую сістэму з іерархіяй дырэкторый ад самога кораня. UnionFS стварае аб'яднанае мантаванне для іншых файлавых сістэм і дазваляе празрыста для карыстача аб'ядноўваць файлы і каталогі розных файлавых сістэм (званых галінамі) у адзіную злучаную файлавую сістэму.

Змесціва каталогаў з аднолькавымі шляхамі будзе адлюстроўвацца разам у адным аб'яднаным каталогу (у адзінай прасторы імёнаў) атрыманай файлавай сістэмы.

UnionFS аб'ядноўвае пласты, кіруючыся наступнымі прынцыпамі:

  • адзін з пластоў становіцца пластом верхняга ўзроўню, другі і наступныя - пластамі ніжняга ўзроўню;
  • карыстачу аб'екты пластоў даступныя "зверху ўніз", г.зн. калі запытаны аб'ект ёсць у "верхнім" пласце, вяртаецца ён, незалежна ад наяўнасці аб'екта з такім імем у "ніжнім" пласце; інакш вяртаецца аб'ект "ніжняга" пласта; калі запытанага аб'екта няма ні там, ні там, вяртаецца памылка "Няма такога файла або каталога";
  • працоўным пластом з'яўляецца «верхні», гэта значыць усе дзеянні карыстача па змене дадзеных адлюстроўваюцца толькі на пласце верхняга ўзроўня, не ўплываючы на ​​змесціва пластоў ніжніх узроўняў.

Docker найбольш распаўсюджаная тэхналогія выкарыстання кантэйнераў у рабоце прыкладання. Ён стаў стандартам у гэтай вобласці, будуючыся на аснове cgroups і прасторы імёнаў, якія забяспечвае ядро ​​Linux.

Docker дазваляе нам хутка разгортваць прыкладанні і максімальна аптымальна выкарыстоўваць файлавую сістэму за рахунак падзелу ядра АС паміж усімі кантэйнерамі, працуючы як асобныя працэсы АС.

Крыніца: habr.com

Дадаць каментар