Докер чист: экскурсияи мухтасар ба таърих ва абстраксияҳои асосӣ

10 август дар Слорм оғоз ёфт Курси видеоии Docker, ки дар он мо онро пурра таҳлил мекунем - аз абстраксияҳои асосӣ то параметрҳои шабака.

Дар ин мақола мо дар бораи таърихи Docker ва абстраксияҳои асосии он сӯҳбат хоҳем кард: Image, Cli, Dockerfile. Лексия барои шурӯъкунандагон пешбинӣ шудааст, бинобар ин, аз эҳтимол дур нест, ки барои корбарони ботаҷриба таваҷҷӯҳ зоҳир кунад. Ҳеҷ гуна хун, замима ё таъми чуқур вуҷуд нахоҳад дошт. Асосҳои хеле.

Докер чист: экскурсияи мухтасар ба таърих ва абстраксияҳои асосӣ

Docker чист

Биёед ба таърифи Docker аз Википедиа назар кунем.

Docker нармафзорест барои автоматикунонии ҷобаҷогузорӣ ва идоракунии барномаҳо дар муҳити контейнерӣ.

Аз ин таъриф чизе равшан нест. Махсусан маълум нест, ки "дар муҳитҳое, ки контейнеризатсияро дастгирӣ мекунанд" чӣ маъно дорад. Барои фаҳмидани он, биёед ба замон баргардем. Биёед аз даврае оғоз кунем, ки ман онро шартан "давраи монолитӣ" меномам.

Давраи монолитӣ

Давраи монолитӣ ибтидои солҳои 2000-ум аст, ки ҳама замимаҳо монолитӣ буда, як қатор вобастагӣ доштанд. Тараккиёт муддати дуру дароз кашол ёфт. Дар айни замон, серверҳо зиёд набуданд, мо ҳама онҳоро бо ном медонистем ва онҳоро назорат мекардем. Чунин муқоисаи хандаовар вуҷуд дорад:

Ҳайвоноти хонагӣ ҳайвоноти хонагӣ мебошанд. Дар давраи монолитӣ, мо ба серверҳои худ мисли ҳайвоноти хонагӣ муносибат мекардем, ғамхорӣ мекардем ва доғҳои чангро мепошидем. Ва барои беҳтар идоракунии захираҳо, мо виртуализатсияро истифода бурдем: мо серверро гирифтем ва онро ба якчанд мошини виртуалӣ бурида, ба ин васила ҷудокунии муҳити атрофро таъмин кардем.

Системаҳои виртуализатсия дар асоси гипервизор

Эҳтимол ҳама дар бораи системаҳои виртуализатсия шунидаанд: VMware, VirtualBox, Hyper-V, Qemu KVM ва ғайра. Онҳо ҷудокунии барномаҳо ва идоракунии захираҳоро таъмин мекунанд, аммо камбудиҳо низ доранд. Барои виртуализатсия ба шумо гипервизор лозим аст. Ва гипервизор як сарбории захиравӣ аст. Ва худи мошини маҷозӣ одатан як бузург аст - тасвири вазнин дорои системаи амалиётӣ, Nginx, Apache ва эҳтимолан MySQL. Тасвир калон аст ва мошини маҷозӣ барои фаъолият нороҳат аст. Дар натиҷа, кор бо мошинҳои виртуалӣ метавонад суст бошад. Барои ҳалли ин масъала системаҳои виртуализатсия дар сатҳи ядро ​​сохта шудаанд.

Системаҳои виртуализатсияи сатҳи ядро ​​​​

Виртуализатсияи сатҳи ядроро системаҳои OpenVZ, Systemd-nspawn, LXC дастгирӣ мекунанд. Мисоли равшани чунин виртуализатсия LXC (Контейнерҳои Linux) мебошад.

LXC як системаи виртуализатсияи сатҳи системаи амалиётӣ барои иҷро кардани якчанд мисолҳои ҷудошудаи системаи амалиётии Linux дар як гиреҳ мебошад. LXC мошинҳои виртуалиро истифода намебарад, аммо муҳити виртуалиро бо фазои раванди худ ва стеки шабакавӣ эҷод мекунад.

Аслан LXC контейнерҳоро эҷод мекунад. Фарқи байни мошинҳои виртуалӣ ва контейнерҳо чӣ гуна аст?

Докер чист: экскурсияи мухтасар ба таърих ва абстраксияҳои асосӣ

Контейнер барои ҷудокунии равандҳо мувофиқ нест: осебпазириҳо дар системаҳои виртуализатсия дар сатҳи ядро ​​​​ пайдо мешаванд, ки ба онҳо имкон медиҳанд, ки аз контейнер ба ҳост гурехта шаванд. Аз ин рӯ, агар ба шумо лозим ояд, ки чизеро ҷудо кунед, беҳтар аст, ки мошини виртуалиро истифода баред.

Фарқи байни виртуализатсия ва контейнеризатсияро дар диаграмма дидан мумкин аст.
Дар болои ОС гипервизорҳои сахтафзор, гипервизорҳо ва контейнерҳо мавҷуданд.

Докер чист: экскурсияи мухтасар ба таърих ва абстраксияҳои асосӣ

Гипервизорҳои сахтафзор хубанд, агар шумо дар ҳақиқат мехоҳед чизеро ҷудо кунед. Зеро дар сатҳи саҳифаҳои хотира ва протсессорҳо ҷудо кардан мумкин аст.

Ҳамчун барнома гипервизорҳо мавҷуданд ва контейнерҳо мавҷуданд ва мо минбаъд дар бораи онҳо сӯҳбат хоҳем кард. Системаҳои контейнерсозӣ гипервизор надоранд, аммо муҳаррики контейнерӣ мавҷуд аст, ки контейнерҳоро эҷод ва идора мекунад. Ин чиз сабуктар аст, бинобар ин, аз сабаби кор бо ядро, хароҷоти болоӣ камтар аст ё тамоман нест.

Он чизе ки барои контейнеризатсия дар сатҳи ядро ​​истифода мешавад

Технологияҳои асосӣ, ки ба шумо имкон медиҳанд, ки контейнери аз равандҳои дигар ҷудошуда эҷод кунед Фазои номҳо ва Гурӯҳҳои назоратӣ мебошанд.

Фазоҳои номҳо: PID, шабакавӣ, кӯҳ ва корбар. Бештар ҳастанд, аммо барои осонии фаҳмиш мо ба инҳо тамаркуз хоҳем кард.

Фазои номҳои PID равандҳоро маҳдуд мекунад. Вақте ки, масалан, мо фазои Номи PID эҷод мекунем ва дар он ҷо раванд ҷойгир мекунем, он бо PID 1 мешавад. Одатан дар системаҳои PID 1 systemd ё init аст. Мувофиқи он, вақте ки мо равандро дар фазои нав ҷойгир мекунем, он инчунин PID 1 мегирад.

Шабакаи Namespace ба шумо имкон медиҳад, ки шабакаро маҳдуд/ҷудо кунед ва интерфейсҳои худро дар дохили он ҷойгир кунед. Mount маҳдудияти системаи файлӣ мебошад. Истифодабаранда - маҳдудият барои корбарон.

Гурӯҳҳои назорат: Хотира, CPU, IOPS, Шабака - дар маҷмӯъ тақрибан 12 танзимот. Дар акси ҳол, онҳоро Cgroups ("гурӯҳҳои C") низ меноманд.

Гурӯҳҳои назоратӣ захираҳоро барои контейнер идора мекунанд. Тавассути Гурӯҳҳои назоратӣ мо гуфта метавонем, ки контейнер набояд аз миқдори муайяни захираҳо зиёд бошад.

Барои пурра кор кардани контейнерсозӣ технологияҳои иловагӣ истифода мешаванд: Имкониятҳо, Copy-on-write ва ғайра.

Қобилиятҳо вақте ки мо ба раванд мегӯем, ки он чӣ кор карда метавонад ва наметавонад. Дар сатҳи ядро, инҳо танҳо харитаҳои bitmap бо параметрҳои зиёд мебошанд. Масалан, корбари реша дорои имтиёзҳои пурра аст ва ҳама чизро карда метавонад. Сервери вақт метавонад вақти системаро тағир диҳад: он дар капсулаи Time дорои қобилиятҳост ва ҳамин тавр. Бо истифода аз имтиёзҳо, шумо метавонед маҳдудиятҳоро барои равандҳо чандир танзим кунед ва ба ин васила худро муҳофизат кунед.

Системаи Copy-on-write ба мо имкон медиҳад, ки бо тасвирҳои Docker кор кунем ва онҳоро самараноктар истифода барем.

Айни замон Docker мушкилоти мутобиқат бо Cgroups v2 дорад, аз ин рӯ ин мақола махсусан ба Cgroups v1 тамаркуз мекунад.

Аммо биёед ба таърих баргардем.

Вақте ки системаҳои виртуализатсия дар сатҳи ядро ​​пайдо шуданд, онҳо фаъолона истифода мешуданд. Сарбории гипервизор аз байн рафт, аммо баъзе мушкилот боқӣ монданд:

  • тасвирҳои калон: онҳо системаи амалиётӣ, китобхонаҳо, як қатор нармафзорҳои гуногунро ба ҳамон OpenVZ тела медиҳанд ва дар ниҳоят тасвир ҳоло ҳам хеле калон мешавад;
  • Барои бастабандӣ ва интиқол стандарти муқаррарӣ вуҷуд надорад, бинобар ин мушкилоти вобастагӣ боқӣ мемонад. Ҳолатҳое вуҷуд доранд, ки ду дона код як китобхонаро истифода мебаранд, аммо бо версияҳои гуногун. Мумкин аст дар байни онҳо низоъ ба миён ояд.

Барои халли хамаи ин проблемахо давраи оянда фаро расид.

Давраи контейнерӣ

Вақте ки давраи контейнерҳо фаро расид, фалсафаи кор бо онҳо тағйир ёфт:

  • Як раванд - як контейнер.
  • Мо ҳама вобастагиҳоеро, ки раванд лозим аст, ба контейнери он мерасонем. Ин буридани монолитҳоро ба микросервисҳо талаб мекунад.
  • Чӣ қадаре ки тасвир хурдтар бошад, ҳамон қадар беҳтар аст - осебпазирии имконпазир камтар аст, он тезтар паҳн мешавад ва ғайра.
  • Ҳолатҳо муваққатӣ мешаванд.

Дар хотир доред, ки ман дар бораи ҳайвонот ва ҳайвонот чӣ гуфта будам? Пештар мисолҳо мисли ҳайвонҳои хонагӣ буданд, аммо ҳоло онҳо ба чорвои калон табдил ёфтаанд. Пештар, монолит - як ариза вуҷуд дошт. Ҳоло он 100 микросервис, 100 контейнер аст. Баъзе контейнерҳо метавонанд 2-3 нусха дошта бошанд. Назорати ҳар як контейнер барои мо камтар муҳим мешавад. Он чизе, ки барои мо муҳимтар аст, мавҷудияти худи хидмат аст: ин маҷмӯи контейнерҳо чӣ кор мекунад. Ин муносибатҳоро ба мониторинг тағйир медиҳад.

Дар солҳои 2014-2015, Docker ривоҷ ёфт - технологияе, ки мо ҳоло дар бораи он сӯҳбат хоҳем кард.

Докер фалсафа ва бастаи стандартии барномаро тағир дод. Бо истифода аз Docker, мо метавонем як барномаро бастабандӣ кунем, онро ба анбор фиристем, аз он ҷо зеркашӣ ва ҷойгир кунем.

Мо ҳама чизеро, ки ба мо лозим аст, ба контейнери Docker мегузорем, аз ин рӯ мушкилоти вобастагӣ ҳал карда мешавад. Docker такрористеҳсолкуниро кафолат медиҳад. Ман фикр мекунам, ки бисёр одамон бо такрорнопазирӣ дучор омадаанд: ҳама чиз барои шумо кор мекунад, шумо онро ба истеҳсолот тела медиҳед ва он ҷо кор намекунад. Бо Docker ин мушкилот бартараф карда мешавад. Агар контейнери Docker-и шумо оғоз кунад ва он чизеро, ки лозим аст, иҷро кунад, пас бо эҳтимолияти баланд он дар истеҳсолот оғоз меёбад ва дар он ҷо ҳам ҳамин корро мекунад.

Мушкилот дар бораи сарбории болоӣ

Ҳамеша дар бораи хароҷоти изофӣ баҳсҳо вуҷуд доранд. Баъзе одамон боварӣ доранд, ки Docker бори иловагӣ намебардорад, зеро он ядрои Linux ва тамоми равандҳои онро барои контейнеризатсия истифода мебарад. Мисли, "агар шумо гӯед, ки Docker боло аст, пас ядрои Linux болои сар аст."

Аз тарафи дигар, агар шумо амиқтар равед, дар Докер воқеан якчанд чизҳо мавҷуданд, ки онҳоро бо дарозӣ гуфтан мумкин аст.

Якум фазои номи PID аст. Вақте ки мо равандро дар фазои ном ҷойгир мекунем, ба он PID 1 таъин карда мешавад. Дар айни замон, ин раванд PID-и дигаре дорад, ки дар фазои номи ҳост, берун аз контейнер ҷойгир аст. Масалан, мо Nginx-ро дар як контейнер оғоз кардем, он PID 1 (раванди асосӣ) шуд. Ва дар мизбон он PID 12623 дорад. Ва гуфтан душвор аст, ки он чӣ қадар сарборӣ аст.

Чизи дуюм Cgroups аст. Биёед Cgroups-ро аз рӯи хотира гирем, яъне қобилияти маҳдуд кардани хотираи контейнер. Вақте ки он фаъол карда мешавад, ҳисобкунакҳо ва баҳисобгирии хотира фаъол мешаванд: ядро ​​бояд фаҳмад, ки чанд саҳифа ҷудо карда шудааст ва чанд саҳифа барои ин контейнер ҳоло ҳам ройгон аст. Эҳтимол ин як хароҷоти изофӣ аст, аммо ман ягон таҳқиқоти дақиқро дар бораи он ки чӣ гуна ба кор таъсир мерасонад, надидам. Ва ман худам пай набурдам, ки замимае, ки дар Docker кор мекунад, ногаҳон талафоти шадиди иҷроишро аз сар гузаронидааст.

Ва боз як ёддошт дар бораи иҷрои. Баъзе параметрҳои ядро ​​​​аз ҳост ба контейнер интиқол дода мешаванд. Аз ҷумла, баъзе параметрҳои шабака. Аз ин рӯ, агар шумо хоҳед, ки дар Docker ягон чизи баландсифатро иҷро кунед, масалан, чизе, ки шабакаро фаъолона истифода мебарад, пас шумо ҳадди аққал ин параметрҳоро танзим кардан лозим аст. Масалан, баъзе nf_conntrack.

Дар бораи консепсияи Docker

Docker аз якчанд ҷузъҳо иборат аст:

  1. Docker Daemon ҳамон муҳаррики контейнер аст; контейнерхоро ба кор меандозад.
  2. Docker CII як воситаи идоракунии Docker мебошад.
  3. Dockerfile - дастурҳо оид ба сохтани тасвир.
  4. Тасвир — тасвире, ки аз он контейнер васл карда мешавад.
  5. Зарф.
  6. Реестри Docker як анбори тасвирҳо мебошад.

Схематикӣ он чизе монанди ин аст:

Докер чист: экскурсияи мухтасар ба таърих ва абстраксияҳои асосӣ

Демони Docker дар Docker_host кор мекунад ва контейнерҳоро оғоз мекунад. Мизоҷе ҳаст, ки фармонҳоро мефиристад: тасвир созед, тасвирро зеркашӣ кунед, контейнерро оғоз кунед. Демони Docker ба реестр меравад ва онҳоро иҷро мекунад. Мизоҷи Docker метавонад ҳам ба таври маҳаллӣ (ба васлаки Unix) ва ҳам тавассути TCP аз ҳости дурдаст дастрасӣ пайдо кунад.

Биёед ҳар як ҷузъро аз назар гузаронем.

Демони Докер - ин қисми сервер аст, он дар мошини ҳост кор мекунад: тасвирҳоро зеркашӣ мекунад ва контейнерҳоро аз онҳо оғоз мекунад, байни контейнерҳо шабака эҷод мекунад, гузоришҳоро ҷамъ мекунад. Вақте ки мо мегӯем, ки "тасвир эҷод кунед", дев низ ин корро мекунад.

Docker CLI — Қисми муштарии Docker, утилитаи консол барои кор бо демон. Такрор мекунам, он на танхо дар махал, балки тавассути шабака хам кор карда метавонад.

Фармонҳои асосӣ:

docker ps - нишон додани контейнерҳое, ки айни замон дар мизбони Docker кор мекунанд.
тасвирҳои докер - тасвирҳои ба таври маҳаллӣ зеркашӣшударо нишон диҳед.
ҷустуҷӯи docker <> - ҷустуҷӯи тасвир дар реестр.
docker pull <> - зеркашӣ кардани тасвир аз феҳрист ба мошин.
сохтани докер < > - тасвирро ҷамъ кунед.
docker run <> - контейнерро оғоз кунед.
docker rm <> - контейнерро хориҷ кунед.
logs docker <> - гузоришҳои контейнер
docker start/stop/restart <> - кор бо контейнер

Агар шумо ин фармонҳоро азхуд кунед ва ба истифодаи онҳо боварӣ дошта бошед, худро 70% дар Docker дар сатҳи корбар донед.

файли докер - дастур оид ба сохтани тасвир. Қариб ҳар як фармони дастур қабати нав аст. Биёед як мисолро дида бароем.

Докер чист: экскурсияи мухтасар ба таърих ва абстраксияҳои асосӣ

Ин аст он чизе ки Dockerfile ба назар мерасад: фармонҳо дар тарафи чап, далелҳо дар тарафи рост. Ҳар як фармоне, ки дар ин ҷо ҷойгир аст (ва умуман дар Dockerfile навишта шудааст) дар тасвир қабати нав эҷод мекунад.

Ҳатто ба тарафи чап нигоҳ карда, шумо метавонед тақрибан дарк кунед, ки чӣ рӯй дода истодааст. Мо мегӯем: "барои мо ҷузвдон эҷод кунед" - ин як қабат аст. "Папкаро кор кунед" қабати дигар аст ва ғайра. Торти қабатӣ ҳаётро осон мекунад. Агар ман Dockerfile-и дигар эҷод кунам ва чизеро дар сатри охирин тағир диҳам - ман чизи дигареро иҷро мекунам, ба ҷуз "python" "main.py" ё вобастагӣ аз файли дигар насб кунам - пас қабатҳои қаблӣ ҳамчун кэш дубора истифода мешаванд.

Садо - ин бастабандии контейнер аст; контейнерҳо аз тасвир оғоз карда мешаванд. Агар мо ба Docker аз нуқтаи назари менеҷери бастаҳо нигоҳ кунем (гӯё мо бо бастаҳои deb ё rpm кор мекардем), пас тасвир аслан бастаи rpm аст. Тавассути yum install мо метавонем барномаро насб кунем, онро нест кунем, дар репозиторий пайдо кунем ва зеркашӣ кунем. Ин ҷо тақрибан якхела аст: контейнерҳо аз тасвир оғоз карда мешаванд, онҳо дар реестри Docker нигоҳ дошта мешаванд (ба монанди yum, дар анбор) ва ҳар як тасвир дорои хэши SHA-256, ном ва тег дорад.

Тасвир мувофиқи дастурҳои Dockerfile сохта шудааст. Ҳар як дастур аз Dockerfile қабати нав эҷод мекунад. Қабатҳоро дубора истифода бурдан мумкин аст.

Феҳристи Docker як анбори тасвири Docker аст. Ба монанди OS, Docker дорои феҳристи стандартии оммавӣ - dockerhub. Аммо шумо метавонед анбори шахсии худ, феҳристи Docker-и худро созед.

Контейнер - чӣ аз тасвир оғоз мешавад. Мо мувофиқи дастурҳои Dockerfile тасвир сохтем ва сипас онро аз ин тасвир оғоз мекунем. Ин контейнер аз дигар контейнерҳо ҷудо карда шудааст ва бояд ҳама чизеро, ки барои кори барнома зарур аст, дар бар гирад. Дар ин ҳолат, як контейнер - як раванд. Чунин мешавад, ки шумо бояд ду равандро иҷро кунед, аммо ин ба идеологияи Докер то ҳадде мухолиф аст.

Талаботи "як контейнер, як раванд" ба фазои номи PID алоқаманд аст. Вақте ки раванд бо PID 1 дар Namespace оғоз мешавад, агар он ногаҳон бимирад, тамоми контейнер низ мемирад. Агар дар он ҷо ду раванд ҷараён дошта бошад: яке зинда ва дигаре мурда, пас контейнер то ҳол зиндагӣ мекунад. Аммо ин масъалаи таҷрибаҳои беҳтарин аст, мо дар бораи онҳо дар дигар маводҳо сӯҳбат хоҳем кард.

Барои муфассалтар омӯхтани хусусиятҳо ва барномаи пурраи курс, лутфан истиноди зеринро пайгирӣ кунед: "Курси видеоии Docker".

Муаллиф: Марсел Ибраев, маъмури сертификатсияшудаи Kubernetes, муҳандиси амалӣ дар Southbridge, сухангӯ ва таҳиягари курсҳои Slurm.

Манбаъ: will.com

Илова Эзоҳ