Пеш аз истифодаи Docker-in-Docker барои CI ё муҳити санҷиш бодиққат фикр кунед

Пеш аз истифодаи Docker-in-Docker барои CI ё муҳити санҷиш бодиққат фикр кунед

Docker-in-Docker як муҳити виртуалии демони Docker аст, ки дар дохили худи контейнер барои сохтани тасвирҳои контейнер кор мекунад. Мақсади асосии эҷоди Docker-in-Docker кӯмак расонидан ба рушди худи Docker буд. Бисёр одамон онро барои идора кардани Jenkins CI истифода мебаранд. Ин дар аввал муқаррарӣ менамояд, аммо баъд мушкилоте ба миён меояд, ки онҳоро тавассути насби Docker дар контейнери Jenkins CI пешгирӣ кардан мумкин аст. Ин мақола ба шумо мегӯяд, ки чӣ тавр ин корро кунед. Агар шумо ба ҳалли ниҳоии бидуни тафсилот таваҷҷӯҳ дошта бошед, танҳо бахши охирини мақоларо хонед, "Ҳалли мушкилот".

Пеш аз истифодаи Docker-in-Docker барои CI ё муҳити санҷиш бодиққат фикр кунед

Docker-in-Docker: "Хуб"

Зиёда аз ду сол пеш ман ба Docker гузоштам флаг – имтиёздор ва навишт версияи якуми dind. Ҳадаф аз он иборат буд, ки ба дастаи асосӣ зудтар инкишоф додани Docker кӯмак кунад. Пеш аз Docker-in-Docker, сикли маъмулии рушд чунин менамуд:

  • хаки хакикй;
  • сохтан;
  • боздоштани як демони иҷрошавандаи Docker;
  • оғози демони нави Docker;
  • озмоиш;
  • давраро такрор кунед.

Агар шумо хоҳед, ки як маҷмааи зебо ва такроршаванда (яъне дар як контейнер) созед, пас он мураккабтар шуд:

  • хаки хакикй;
  • боварӣ ҳосил кунед, ки версияи кории Docker кор мекунад;
  • сохтани Docker нав бо Docker кӯҳна;
  • боздоштани демони Docker;
  • демони нави Docker оғоз кунед;
  • озмоиш;
  • боздоштани демони нави Docker;
  • такрор.

Бо пайдоиши Docker-in-Docker, раванд соддатар шуд:

  • хаки хакикй;
  • монтаж + оғоз дар як марҳила;
  • давраро такрор кунед.

Оё ин тавр беҳтар нест?

Пеш аз истифодаи Docker-in-Docker барои CI ё муҳити санҷиш бодиққат фикр кунед

Docker-in-Docker: "Бад"

Аммо, бар хилофи эътиқоди маъмул, Docker-in-Docker 100% ситораҳо, пониҳо ва яккорнҳо нест. Манзури ман ин аст, ки як қатор масъалаҳое ҳастанд, ки таҳиягар бояд аз онҳо огоҳ бошад.

Яке аз онҳо ба LSMs (модулҳои амниятии Linux) ба монанди AppArmor ва SELinux дахл дорад: ҳангоми кор кардани контейнер, "Докери дохилӣ" метавонад профилҳои бехатариро истифода барад, ки бо "Докери беруна" ихтилоф ё иштибоҳ мекунанд. Ин мушкилтарин мушкилотест, ки ҳангоми кӯшиши якҷоя кардани татбиқи аслии парчами имтиёзнок ҳал карда мешавад. Тағиротҳои ман кор карданд ва ҳама санҷишҳо дар мошини Debian ва VM-ҳои озмоишии Ubuntu мегузаранд, аммо онҳо дар мошини Майкл Кросби суқут ва сӯзонданд (чунон ки ман дар ёд дорам, ӯ Федора дошт). Ман сабаби дақиқи мушкилотро дар ёд надорам, аммо ин шояд аз он сабаб бошад, ки Майк як бачаи доно аст, ки бо SELINUX=enforce кор мекунад (ман AppArmor-ро истифода бурдам) ва тағиротҳои ман профилҳои SELinux-ро ба назар нагирифтанд.

Docker-in-Docker: "Бадӣ"

Масъалаи дуюм бо драйверҳои нигаҳдории Docker аст. Вақте ки шумо Docker-in-Docker-ро иҷро мекунед, Docker беруна дар болои системаи файлии муқаррарӣ (EXT4, BTRFS ё ҳар чизе ки шумо доред) кор мекунад ва Docker дохилӣ дар болои системаи нусхабардорӣ дар навиштан (AUFS, BTRFS, Device Mapper) кор мекунад , ва ғайра). Ин бисёр комбинатсияҳоро ба вуҷуд меорад, ки кор намекунанд. Масалан, шумо наметавонед AUFS-ро дар болои AUFS иҷро кунед.

Агар шумо BTRFS-ро дар болои BTRFS иҷро кунед, он бояд дар аввал кор кунад, аммо вақте ки зерҷилдҳои лона вуҷуд доранд, нест кардани зерҷилдҳои волидайн ноком мешавад. Модули Device Mapper фазои ном надорад, бинобар ин, агар якчанд мисолҳои Docker онро дар як мошин иҷро кунанд, онҳо ҳама метавонанд тасвирҳоро дар ҳамдигар ва дастгоҳҳои эҳтиётии контейнер бубинанд (ва таъсир расонанд). Ин бад аст.

Барои ҳалли бисёре аз ин мушкилот роҳҳо мавҷуданд. Масалан, агар шумо хоҳед, ки AUFS-ро дар Docker дохилӣ истифода баред, танҳо папкаи /var/lib/docker-ро ба ҳаҷм табдил диҳед ва шумо хуб хоҳед буд. Docker ба номҳои мавриди ҳадафи Device Mapper якчанд фазоҳои номҳои асосиро илова кардааст, то агар зангҳои сершумори Docker дар як мошин кор кунанд, онҳо ба ҳамдигар қадам назананд.

Бо вуҷуди ин, чунин танзимот на ҳама оддӣ аст, чунон ки аз инҳо дида мешавад мақолаҳо дар анбори dind дар GitHub.

Docker-in-Docker: Он бадтар мешавад

Дар бораи кэши сохтмон чӣ гуфтан мумкин аст? Ин низ метавонад хеле душвор бошад. Одамон аксар вақт аз ман мепурсанд, ки "агар ман Docker-in-Docker-ро иҷро карда бошам, чӣ гуна метавонам тасвирҳои дар мизбон ҷойгиршударо истифода барам, ба ҷои он ки ҳама чизро ба Докери дохилии худ баргардонам"?

Баъзе одамони ташаббускор кӯшиш карданд, ки /var/lib/docker-ро аз ҳост ба контейнери Docker-in-Docker бибанданд. Баъзан онҳо /var/lib/docker-ро бо контейнерҳои сершумор мубодила мекунанд.

Пеш аз истифодаи Docker-in-Docker барои CI ё муҳити санҷиш бодиққат фикр кунед
Оё шумо мехоҳед маълумоти худро вайрон кунед? Зеро ин маҳз ҳамон чизест, ки ба маълумоти шумо зарар мерасонад!

Демони Docker ба таври возеҳ тарҳрезӣ шудааст, ки дастрасии истисноӣ ба /var/lib/docker дошта бошад. Ҳеҷ чизи дигар набояд ба ягон файли Docker, ки дар ин ҷузвдон ҷойгир аст, "дастрас кунад, забт кунад ё тавлид кунад".

Чаро ин тавр аст? Зеро ин натиҷаи яке аз душвортарин дарсҳои ҳангоми таҳияи dotCloud гирифташуда мебошад. Муҳаррики контейнерии dotCloud тавассути доштани равандҳои сершумор ба /var/lib/dotcloud ҳамзамон кор мекард. Ҳилаҳои маккорона, аз қабили иваз кардани файлҳои атомӣ (ба ҷои таҳриркунӣ дар ҷои худ), рамзи печонидани рамз бо қуфлҳои машваратӣ ва ҳатмӣ ва дигар таҷрибаҳо бо системаҳои бехатар ба монанди SQLite ва BDB на ҳамеша кор мекарданд. Вақте ки мо муҳаррики контейнерии худро аз нав тарҳрезӣ мекардем, ки дар ниҳоят Docker шуд, яке аз қарорҳои бузурги тарроҳӣ муттаҳид кардани тамоми амалиёти контейнерӣ дар як демон буд, то ҳама сафсатаҳои ҳамзамонро бартараф созем.

Маро хато накунед: чизи хуб, боэътимод ва зуд сохтан комилан имконпазир аст, ки равандҳои сершумор ва назорати муосири муосирро дар бар мегирад. Аммо мо фикр мекунем, ки навиштан ва нигоҳдории код бо истифода аз Docker ҳамчун бозигари ягона соддатар ва осонтар аст.

Ин маънои онро дорад, ки агар шумо феҳристи /var/lib/docker-ро дар байни якчанд мисолҳои Docker мубодила кунед, шумо мушкилот хоҳед дошт. Албатта, ин метавонад кор кунад, махсусан дар марҳилаҳои аввали санҷиш. "Гӯш кун, модар, ман метавонам ubuntu-ро ҳамчун докер идора кунам!" Аммо чизи мураккабтареро санҷед, ба монанди кашидани як тасвир аз ду мисоли гуногун, ва шумо хоҳед дид, ки ҷаҳон сӯхтааст.

Ин маънои онро дорад, ки агар системаи CI-и шумо сохтан ва барқароркуниро иҷро кунад, ҳар дафъае, ки шумо контейнери Docker-in-Docker-ро бозоғоз мекунед, шумо хатари нобуд кардани кэши онро доред. Ин тамоман аҷиб нест!

Муҳофизати саволҳо

Биёед як қадам ба ақиб гузорем. Оё ба шумо воқеан Docker-in-Docker лозим аст ё шумо танҳо мехоҳед тавонед Docker-ро идора кунед ва контейнерҳо ва тасвирҳоро аз системаи CI-и худ созед ва иҷро кунед, дар ҳоле ки худи он системаи CI дар як контейнер аст?

Ман боварӣ дорам, ки аксарияти одамон интихоби охиринро мехоҳанд, яъне онҳо мехоҳанд системаи CI ба монанди Ҷенкинс тавонанд контейнерҳоро идора кунанд. Ва роҳи осонтарини ин кор танҳо гузоштани васлаки Docker ба контейнери CI ва пайваст кардани он бо парчами -v мебошад.

Оддӣ карда гӯем, вақте ки шумо контейнери CI-и худро (Ҷенкинс ё дигар) иҷро мекунед, ба ҷои ҳакерӣ дар якҷоягӣ бо Docker-in-Docker, онро бо сатр оғоз кунед:

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

Ин контейнер акнун ба васлаки Docker дастрасӣ дорад ва аз ин рӯ қодир аст контейнерҳоро идора кунад. Ба гайр аз он ки ба чои кор кардани контейнерхои «кудак» контейнерхои «бародарон»-ро ба кор меандозад.

Инро бо истифода аз тасвири расмии докер санҷед (ки дорои дуии Docker аст):

docker run -v /var/run/docker.sock:/var/run/docker.sock 
           -ti docker

Он мисли Docker-in-Docker ба назар мерасад ва кор мекунад, аммо он Docker-in-Docker нест: вақте ки ин контейнер контейнерҳои иловагӣ эҷод мекунад, онҳо дар Docker-дар сатҳи боло сохта мешаванд. Шумо таъсири манфии лонаро эҳсос нахоҳед кард ва кэши васлкунӣ дар зангҳои сершумор мубодила мешавад.

Эзоҳ: Дар версияҳои қаблии ин мақола тавсия дода мешавад, ки бинарии Docker аз ҳост ба контейнер пайваст карда шавад. Ин ҳоло эътимоднок шудааст, зеро муҳаррики Docker дигар китобхонаҳои статикӣ ё наздики статикиро фаро намегирад.

Ҳамин тавр, агар шумо хоҳед, ки Docker-ро аз Jenkins CI истифода баред, шумо 2 интихоб доред:
насб кардани Docker CLI бо истифода аз системаи бастабандии тасвирҳо (яъне агар тасвири шумо ба Debian асос ёфтааст, бастаҳои .deb-ро истифода баред), бо истифода аз API Docker.

Баъзе рекламаҳо 🙂

Ташаккур ба шумо барои бо мо мондан. Мақолаҳои мо ба шумо маъқуланд? Мехоҳед мундариҷаи ҷолибтарро бубинед? Бо фармоиш додан ё тавсия додан ба дӯстон моро дастгирӣ кунед, абр VPS барои таҳиягарон аз $4.99, аналоги беназири серверҳои сатҳи ибтидоӣ, ки аз ҷониби мо барои шумо ихтироъ шудааст: Тамоми ҳақиқат дар бораи VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps аз $19 ё чӣ гуна мубодила кардани сервер? (бо RAID1 ва RAID10, то 24 ядро ​​ва то 40 ГБ DDR4 дастрас аст).

Dell R730xd дар маркази додаҳои Equinix Tier IV дар Амстердам 2 маротиба арзонтар аст? Танҳо дар ин ҷо 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ аз $199 дар Нидерландия! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - аз $99! Дар бораи хондан Корпоратсияи инфраструктураро чӣ гуна бояд сохт. синф бо истифодаи серверҳои Dell R730xd E5-2650 v4 ба маблағи 9000 XNUMX евро барои як динор?

Манбаъ: will.com

Илова Эзоҳ