Салом ба ҳама! Дар худ , Ман ваъда додам, ки дар бораи кор кардани Docker дар Docker ва ҷанбаҳои амалии истифодаи ин дарс сӯҳбат кунам. Вакти он расидааст, ки ба ваъда вафо кунед. Таҳиягари ботаҷриба шояд эътироз кунад, ки онҳое, ки ба Docker дар дохили Docker ниёз доранд, танҳо васлаки демони Docker-ро аз ҳост ба контейнер интиқол медиҳанд ва ин дар 99% ҳолатҳо кофӣ хоҳад буд. Аммо барои партофтани кукиҳо ба ман шитоб накунед, зеро мо дар бораи иҷро кардани Docker дар дохили Docker сӯҳбат хоҳем кард. Ин ҳалли бисёр барномаҳои эҳтимолӣ дорад ва ин мақола дар бораи яке аз онҳост, пас нишинед ва дастҳоятонро дар пеши худ рост кунед.

Оғоз
Ин ҳама дар шоми боронгарии сентябр вақте оғоз шуд, ки ман мошинеро, ки дар Digital Ocean ба маблағи 5 доллар иҷора гирифта будам, аз сабаби он, ки Docker тамоми 24 гигабайт фазои диски мавҷударо бо тасвирҳо ва контейнерҳои худ пур карда буд, ях карда буд. Тааҷҷубовар он буд, ки ҳамаи ин тасвирҳо ва контейнерҳо муваққатӣ буданд ва танҳо барои санҷиши иҷрои барномаи ман ҳар дафъае, ки версияи нави китобхона ё чаҳорчӯба бароварда мешуд, лозим буд. Ман кӯшиш кардам, ки скриптҳои ҷилдиро нависам ва ҷадвали cronро барои тоза кардани партовҳо созам, аммо ин кӯмак накард: ҳар дафъае, ки он ногузир бо хӯрдани фазои диски сервери ман ва овезон шудани сервер (беҳтарин) анҷом мешуд. Дар баъзе лаҳзаҳо, ман мақолаеро пайдо кардам, ки чӣ гуна Ҷенкинсро дар контейнер идора кардан мумкин аст ва чӣ гуна он метавонад тавассути васлаки демони докер, ки ба он интиқол дода шудааст, қубурҳои бунёдиро эҷод ва нест кунад. Ин идея ба ман маъқул шуд, аммо ман қарор додам, ки минбаъд равам ва кӯшиш кунам, ки мустақиман Docker дар дохили Docker кор кунад. Он вақт ба назари ман як роҳи комилан мантиқӣ барои зеркашии тасвирҳои Docker ва сохтани контейнерҳо барои ҳама замимаҳо, ки барои санҷиш дар дохили контейнери дигар лозим буд (биёед онро контейнери саҳнавӣ меномем) менамуд. Идея ин буд, ки контейнери статсионарӣ бо парчами -rm оғоз шавад, ки ҳангоми боздоштани он тамоми контейнер ва тамоми мундариҷаи онро ба таври худкор нест мекунад. Ман бо тасвири Docker аз худи Docker кор кардам (), аммо ин хеле душвор буд ва ман ҳеҷ гоҳ натавонистам онро ба таври лозима кор кунам ва ман мехостам, ки худам ҳама роҳро тай кунам.
Амал кунед. Конусҳо
Ман ният кардам, ки контейнерро тавре кор кунам, ки ба ман лозим аст ва таҷрибаҳои худро идома додам, ки дар натиҷа шумораи зиёди навдаҳо пайдо шуданд. Натиҷаи шиканҷаи ман чунин алгоритм буд:
Мо контейнери Docker-ро дар реҷаи интерактивӣ оғоз мекунем.
docker run --privileged -it docker:18.09.6Ба версияи контейнер диққат диҳед, ба рост ё чап қадам занед ва DinD-и шумо ба каду табдил меёбад. Дар асл, вақте ки версияи нав бароварда мешавад, чизҳо зуд-зуд вайрон мешаванд.
Мо бояд фавран ба ҷабҳа ворид шавем.Мо кӯшиш мекунем фаҳмем, ки кадом контейнерҳо кор мекунанд (Ҷавоб: нест), аммо биёед фармонро ба ҳар ҳол иҷро кунем:
docker psШумо каме ҳайрон мешавед, аммо маълум мешавад, ки демони Docker ҳатто кор намекунад:
error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 192.168.65.1:53: no such hostБиёед онро худамон иҷро кунем:
dockerd &Боз як сюрпризи ногувор:
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: Iptables not foundiptables ва бастаҳои bash -ро насб кунед (ҳама кор дар bash назар ба sh гуворотар аст):
apk add --no-cache iptables bashБиёед bash-ро оғоз кунем. Ниҳоят, мо ба қабати муқаррарӣ бармегардем
Биёед кӯшиш кунем, ки Docker-ро дубора оғоз кунем:
dockerd &Мо бояд як варақи тӯлонии гузоришҳоро бубинем, ки бо:
INFO[2019-11-25T19:51:19.448080400Z] Daemon has completed initialization INFO[2019-11-25T19:51:19.474439300Z] API listen on /var/run/docker.sockEnterро пахш кунед. Мо дар баш баргаштем.
Минбаъд, мо метавонем кӯшиш кунем, ки контейнерҳои дигарро дар дохили контейнери Docker-и худ оғоз кунем, аммо агар мо хоҳем, ки дар дохили контейнери Docker дигар контейнери Docker-ро ба кор андозем ё чизе хато кунад ва контейнер садама кунад? Ҳама чизро аз нав оғоз кунед.
Контейнери DinD ва таҷрибаҳои нав
Барои он ки қадамҳои дар боло зикршударо такрор накунам, ман контейнери DinD-и худро сохтам:
Ҳалли кории DinD ба ман имкон дод, ки Docker-ро дар дохили Docker ба таври рекурсивӣ иҷро кунам ва таҷрибаҳои ҷолибтар гузаронам.
Ҳоло ман як озмоиши чунин (бомуваффақият)-ро бо иҷро кардани MySQL ва Nodejs тавсиф мекунам.
Аз ҳама бесаброна дида метавонад, ки дар ин ҷо чӣ гуна буд

Биёед мо оғоз кунем:
Мо DinD-ро дар реҷаи интерактивӣ оғоз мекунем. Дар ин версияи DinD, мо бояд ҳамаи портҳоеро, ки контейнерҳои кӯдаконаи мо истифода бурда метавонанд, ба таври дастӣ харита кунем (ман аллакай дар ин кор кор карда истодаам)
docker run --privileged -it -p 80:8080 -p 3306:3306 alekslitvinenk/dindМо ба баш ворид мешавем, ки аз он ҷо мо метавонем фавран ба кушодани контейнерҳои кӯдакона шурӯъ кунем.
MySQL-ро оғоз кунед:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysqlМо ба махзани маълумот ҳамон тавре пайваст мешавем, ки ба он ба таври маҳаллӣ пайваст мешавем. Биёед боварӣ ҳосил кунем, ки ҳама чиз кор мекунад.
Контейнери дуюмро ба кор андозед:
docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-serverЛутфан қайд кунед, ки харитасозии порт маҳз хоҳад буд 8080:8080, зеро мо аллакай порти 80-ро аз ҳост ба контейнери волидайн ба порти 8080 харита кардаем.
Мо дар браузер ба localhost меравем, боварӣ ҳосил кунед, ки сервер "Салом Ҷаҳон!"
Дар ҳолати ман, таҷриба бо контейнерҳои дохилии Docker хеле мусбат буд ва ман таҳияи лоиҳаро идома медиҳам ва онро барои саҳнасозӣ истифода хоҳам кард. Ба назари ман, ин як ҳалли хеле сабуктар аз Кубернетес ва Ҷенкинс X аст. Аммо ин ақидаи субъективии ман аст.
Ман фикр мекунам, ки ин ҳама барои мақолаи имрӯза аст. Дар мақолаи навбатӣ ман таҷрибаҳоро бо ба таври рекурсивӣ иҷро кардани Docker дар Docker ва васл кардани директорияҳо ба контейнерҳои лонашуда муфассалтар тавсиф мекунам.
PS Агар шумо ин лоиҳаро муфид ёбед, лутфан ба он дар GitHub ситорае диҳед, онро буред ва ба дӯстонатон бигӯед.
1 Хатогиҳои ислоҳшуда, тамаркуз ба 2 видео
Манбаъ: will.com
