Разумеючы Docker

Ужо некалькі месяцаў выкарыстоўваю docker для структурызацыі працэсу распрацоўкі/дастаўкі вэб-праектаў. Прапаную чытачам «Хабрахабра» пераклад уступнага артыкула пра docker "Understanding docker".

Што такое докер?

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

У сваім ядры docker дазваляе запускаць практычна любое прыкладанне, бяспечна ізаляванае ў кантэйнеры. Бяспечная ізаляцыя дазваляе вам запускаць на адным хасце шмат кантэйнераў адначасова. Лёгкавагавая прырода кантэйнера, які запускаецца без дадатковай нагрузкі гіпервізара, дазваляе вам дамагацца больш ад вашага жалеза.

Платформа і сродкі кантэйнернай віртуалізацыі могуць быць карысныя ў наступных выпадках:

  • пакаванне вашага прыкладання (і гэтак жа выкарыстоўваюцца кампанент) у docker кантэйнеры;
  • раздача і дастаўка гэтых кантэйнераў вашым камандам для распрацоўкі і тэсціравання;
  • выкладвання гэтых кантэйнераў на вашыя прадакшэны, як у дата цэнтры так і ў аблокі.

Навошта я магу выкарыстоўваць docker?

Хуткае выкладванне вашых прыкладанняў

Docker выдатна падыходзіць для арганізацыі цыкла распрацоўкі. Docker дазваляе распрацоўнікам выкарыстоўваць лакальныя кантэйнеры з праграмамі і сэрвісамі. Што ў наступстве дазваляе інтэгравацца з працэсам сталай інтэграцыі і выкладванні (continuous integration and deployment workflow).

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

Прасцейшае выкладванне і разгортванне

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

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

Высокія нагрузкі і больш карысных нагрузак

Docker легкаважны і хуткі. Ён дае ўстойлівую, рэнтабельную альтэрнатыву віртуальным машынам на аснове гіпервізара. Ён асабліва карысны ва ўмовах высокіх нагрузак, напрыклад, пры стварэнні ўласнага аблокі ці платформа-як-сэрвіс (platform-as-service). Але ён гэтак жа карысны для маленькіх і сярэдніх прыкладанняў, калі вам жадаецца атрымліваць больш з наяўных рэсурсаў.

Галоўныя кампаненты Docker

Docker складаецца з двух галоўных кампанент:

  • Docker: платформа віртуалізацыі з адчыненым кодам;
  • Docker Hub: наша платформа-як-сэрвіс для распаўсюджвання і кіравання docker кантэйнерамі.

Заўвага! Docker распаўсюджваецца па Apache 2.0 ліцэнзіі.

Архітэктура Docker

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

Разумеючы Docker

Docker-дэман

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

Docker-кліент

Docker-кліент, праграма docker - галоўны інтэрфейс да Docker. Яна атрымлівае каманды ад карыстальніка і ўзаемадзейнічае з docker-дэманам.

Унутры docker-а

Каб разумець, з чаго складаецца docker, вам трэба ведаць пра тры кампаненты:

  • вобразы (images)
  • рэестр (registries)
  • кантэйнеры

вобразы

Docker-выява - гэта read-only шаблон. Напрыклад, выява можа ўтрымоўваць аперацыёнку Ubuntu c Apache і прыкладаннем на ёй. Выявы выкарыстоўваюцца для стварэння кантэйнераў. Docker дазваляе лёгка ствараць новыя вобразы, абнаўляць існуючыя, ці вы можаце спампаваць вобразы створаныя іншымі людзьмі. Выявы - гэта кампанента зборкі docker-а.

рэестр

Docker-рэестр захоўвае выявы. Ёсць грамадскія і прыватныя рэестры, з якіх можна спампаваць ці загрузіць выявы. Публічны Docker-рэестр - гэта Дак-канцэнтратар. Там захоўваецца вялізная калекцыя вобразаў. Як вы ведаеце, вобразы могуць быць створаны вамі ці вы можаце выкарыстоўваць вобразы створаныя іншымі. Рэестры - гэта кампанента распаўсюджвання.

кантэйнеры

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

Дык як жа працуе Docker?

Пакуль мы ведаем, што:

  • можам ствараць вобразы, у якіх знаходзяцца нашы дадаткі;
  • можам ствараць кантэйнеры з вобразаў, для запуску прыкладанняў;
  • можам распаўсюджваць вобразы праз Docker Hub ці іншы рэестр вобразаў.

Давайце паглядзім, як гэтыя кампаненты спалучаюцца.

Як працуе выява?

Мы ўжо ведаем, што выява - гэта read-only шаблон, з якога ствараецца кантэйнер. Кожная выява складаецца з набору ўзроўняў. Docker выкарыстоўвае union file system для спалучэння гэтых узроўняў у адну выяву. Union file system дазваляе файлам і дырэкторыямі з розных файлавых сістэм (розным галінам) празрыста накладвацца, ствараючы кагерэнтную файлавую сістэму.

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

У аснове кожнай выявы знаходзіцца базавая выява. Напрыклад, ubuntu, базавая выява Ubuntu, або fedora, базавая выява дыстрыбутыва Fedora. Гэтак жа вы можаце выкарыстоўваць выявы як базу для стварэння новых вобразаў. Напрыклад, калі ў вас ёсць выява apache, вы можаце выкарыстоўваць яго як базавы вобраз для вашых вэб-прыкладанняў.

Заўвага! Docker звычайна бярэ выявы з рэестра Docker Hub.

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

  • запуск каманды
  • даданне файла ці дырэкторыі
  • стварэнне зменнай асяроддзя
  • указанні што запускаць калі запускаецца кантэйнер гэтай выявы

Гэтыя інструкцыі захоўваюцца ў файле Dockerfile. Docker счытвае гэта Dockerfile, Калі вы збіраеце выяву, выконвае гэтыя інструкцыі, і вяртае канчатковы вобраз.

Як працуе docker рэестр?

Рэестр - гэта сховішча docker вобразаў. Пасля стварэння выявы вы можаце апублікаваць яго на публічным рэестры Docker Hub або на вашым асабістым рэестры.

З дапамогай docker кліента вы можаце шукаць ужо апублікаваныя выявы і спампоўваць іх на вашу машыну з docker для стварэння кантэйнераў.

Docker Hub дае публічныя і прыватныя сховішчы выяў. Пошук і спампоўка вобразаў з публічных сховішчаў даступна для ўсіх. Змесціва прыватных сховішчаў не трапляе ў вынік пошуку. І толькі вы і вашыя карыстачы могуць атрымліваць гэтыя выявы і ствараць з іх кантэйнеры.

Як працуе кантэйнер?

Кантэйнер складаецца з аперацыйнай сістэмы, карыстацкіх файлаў і метададзеных. Як мы ведаем, кожны кантэйнер ствараецца з выявы. Гэта выява кажа docker-у, што знаходзіцца ў кантэйнеры, які працэс запусціць, калі запускаецца кантэйнер і іншыя канфігурацыйныя дадзеныя. Docker вобраз даступны толькі для чытання. Калі docker запускае кантэйнер, ён стварае ўзровень для чытання/запісы зверху выявы (выкарыстоўваючы union file system, як было паказана раней), у якім можа быць запушчана праграма.

Што адбываецца, калі запускаецца кантэйнер?

Або з дапамогай праграмы docker, або з дапамогай RESTful API, docker кліент кажа docker дэману запусціць кантэйнер.

$ sudo docker run -i -t ubuntu /bin/bash

Давайце разбяромся з гэтай камандай. Кліент запускаецца з дапамогай каманды docker, з опцыяй run, Якая кажа, што будзе запушчаны новы кантэйнер. Мінімальнымі патрабаваннямі для запуску кантэйнера з'яўляюцца наступныя атрыбуты:

  • якая выява выкарыстоўваць для стварэння кантэйнера. У нашым выпадку ubuntu
  • каманду якую вы хочаце запусціць калі кантэйнер будзе запушчаны. У нашым выпадку /bin/bash

Што ж адбываецца пад капотам, калі мы запускаем гэтую каманду?

Docker, па парадку, робіць наступнае:

  • спампоўвае вобраз ubuntu: docker правярае наяўнасць выявы ubuntu на лакальнай машыне, і калі яго няма - то спампоўвае яго з Дак-канцэнтратар. Калі ж выява ёсць, тое выкарыстоўвае яго для стварэння кантэйнера;
  • стварае кантэйнер: калі выява атрыманы, docker выкарыстоўвае яго для стварэння кантэйнера;
  • ініцыялізуе файлавую сістэму і мантуе read-only узровень: кантэйнер створаны ў файлавай сістэме і read-only ўзровень дададзены вобраз;
  • ініцыялізуе сетку/мост: стварае сеткавы інтэрфейс, які дазваляе docker-у мець зносіны хост машынай;
  • Устаноўка IP адраса: знаходзіць і задае адрас;
  • Запускае ўказаны працэс: запускае ваша дадатак;
  • Апрацоўвае і выдае выснову вашага прыкладання: падключаецца і лагуе стандартны ўваход, вывад і паток памылак вашага прыкладання, што б вы маглі адсочваць як працуе ваша прыкладанне.

Цяпер у вас ёсць працоўны кантэйнер. Вы можаце кіраваць сваім кантэйнерам, узаемадзейнічаць з вашым дадаткам. Калі вырашыце спыніць дадатак, выдаліце ​​кантэйнер.

выкарыстаныя тэхналогіі

Докер напісаны на Go і выкарыстоўвае некаторыя магчымасці ядра Linux, каб рэалізаваць прыведзены вышэй функцыянал.

Прастора імёнаў(namespaces)

Docker выкарыстоўвае тэхналогію namespaces для арганізацыі ізаляваных працоўных прастор, якія мы называем кантэйнерамі. Калі мы запускаем кантэйнер, docker стварае набор прастор імёнаў для дадзенага кантэйнера.

Гэта стварае ізаляваны ўзровень, кожны аспект кантэйнера запушчаны ў сваёй прасторы імёнаў, і не мае доступ да знешняй сістэме.

Спіс некаторых прастор імёнаў, якія выкарыстоўвае docker:

  • pid: для ізаляцыі працэсу;
  • сетка: для кіравання сеткавымі інтэрфейсамі;
  • ipc: для кіравання IPC рэсурсамі. (ICP: InterProccess Communication);
  • mnt: для кіравання кропкамі мантавання;
  • utc: для ізалявання ядра і кантролю генерацыі версій (UTC: Unix timesharing system).

Control groups (кантрольныя групы)

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

Union File System

Union File Sysem або UnionFS - гэта файлавая сістэма, якая працуе ствараючы ўзроўні, робячы яе вельмі легкаважнай і хуткай. Docker выкарыстоўвае UnionFS для стварэння блокаў, з якіх будуецца кантэйнер. Docker можа выкарыстоўваць некалькі варыянтаў UnionFS у тым ліку: AUFS, btrfs, vfs і DeviceMapper.

Фарматы кантэйнераў

Docker спалучае гэтыя кампаненты ў абгортку, якую мы завем фарматам кантэйнера. Фармат, які выкарыстоўваецца па змаўчанні, называецца libcontainer. Гэтак жа docker падтрымлівае традыцыйны фармат кантэйнераў у Linux з дапамогай LXC. У будучыні Docker, магчыма, будзе падтрымліваць іншыя фарматы кантэйнераў. Напрыклад, інтэгруючыся з BSD Jails ці Solaris Zones.

Крыніца: habr.com

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