Чӣ тавр ман Docker-ро дар дохили Docker идора кардам ва он чизе ки аз он баромад

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

Чӣ тавр ман Docker-ро дар дохили Docker идора кардам ва он чизе ки аз он баромад

Оғоз

Ин ҳама дар шоми боронгарии сентябр вақте оғоз шуд, ки ман мошинеро, ки дар Digital Ocean ба маблағи 5 доллар иҷора гирифта будам, аз сабаби он, ки Docker тамоми 24 гигабайт фазои диски мавҷударо бо тасвирҳо ва контейнерҳои худ пур карда буд, ях карда буд. Тааҷҷубовар он буд, ки ҳамаи ин тасвирҳо ва контейнерҳо муваққатӣ буданд ва танҳо барои санҷиши иҷрои барномаи ман ҳар дафъае, ки версияи нави китобхона ё чаҳорчӯба бароварда мешуд, лозим буд. Ман кӯшиш кардам, ки скриптҳои ҷилдиро нависам ва ҷадвали cronро барои тоза кардани партовҳо созам, аммо ин кӯмак накард: ҳар дафъае, ки он ногузир бо хӯрдани фазои диски сервери ман ва овезон шудани сервер (беҳтарин) анҷом мешуд. Дар баъзе лаҳзаҳо, ман мақолаеро пайдо кардам, ки чӣ гуна Ҷенкинсро дар контейнер идора кардан мумкин аст ва чӣ гуна он метавонад тавассути васлаки демони докер, ки ба он интиқол дода шудааст, қубурҳои бунёдиро эҷод ва нест кунад. Ин идея ба ман маъқул шуд, аммо ман қарор додам, ки минбаъд равам ва кӯшиш кунам, ки мустақиман Docker дар дохили Docker кор кунад. Он вақт ба назари ман як роҳи комилан мантиқӣ барои зеркашии тасвирҳои Docker ва сохтани контейнерҳо барои ҳама замимаҳо, ки барои санҷиш дар дохили контейнери дигар лозим буд (биёед онро контейнери саҳнавӣ меномем) менамуд. Идея ин буд, ки контейнери статсионарӣ бо парчами -rm оғоз шавад, ки ҳангоми боздоштани он тамоми контейнер ва тамоми мундариҷаи онро ба таври худкор нест мекунад. Ман бо тасвири Docker аз худи Docker кор кардам (https://hub.docker.com/_/docker), аммо ин хеле душвор буд ва ман ҳеҷ гоҳ натавонистам онро ба таври лозима кор кунам ва ман мехостам, ки худам ҳама роҳро тай кунам.

Амал кунед. Конусҳо

Ман ният кардам, ки контейнерро тавре кор кунам, ки ба ман лозим аст ва таҷрибаҳои худро идома додам, ки дар натиҷа шумораи зиёди навдаҳо пайдо шуданд. Натиҷаи шиканҷаи ман чунин алгоритм буд:

  1. Мо контейнери Docker-ро дар реҷаи интерактивӣ оғоз мекунем.

    docker run --privileged -it docker:18.09.6

    Ба версияи контейнер диққат диҳед, ба рост ё чап қадам занед ва DinD-и шумо ба каду табдил меёбад. Дар асл, вақте ки версияи нав бароварда мешавад, чизҳо зуд-зуд вайрон мешаванд.
    Мо бояд фавран ба ҷабҳа ворид шавем.

  2. Мо кӯшиш мекунем фаҳмем, ки кадом контейнерҳо кор мекунанд (Ҷавоб: нест), аммо биёед фармонро ба ҳар ҳол иҷро кунем:

    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

  3. Биёед онро худамон иҷро кунем:

    dockerd &

    Боз як сюрпризи ногувор:

    failed to start daemon: Error initializing network controller: error obtaining controller instance: failed 
    to create NAT chain DOCKER: Iptables not found

  4. iptables ва бастаҳои bash -ро насб кунед (ҳама кор дар bash назар ба sh гуворотар аст):

    apk add --no-cache iptables bash

  5. Биёед bash-ро оғоз кунем. Ниҳоят, мо ба қабати муқаррарӣ бармегардем

  6. Биёед кӯшиш кунем, ки 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.sock

  7. Enterро пахш кунед. Мо дар баш баргаштем.

Минбаъд, мо метавонем кӯшиш кунем, ки контейнерҳои дигарро дар дохили контейнери Docker-и худ оғоз кунем, аммо агар мо хоҳем, ки дар дохили контейнери Docker дигар контейнери Docker-ро ба кор андозем ё чизе хато кунад ва контейнер садама кунад? Ҳама чизро аз нав оғоз кунед.

Контейнери DinD ва таҷрибаҳои нав

Чӣ тавр ман Docker-ро дар дохили Docker идора кардам ва он чизе ки аз он баромад
Барои он ки қадамҳои дар боло зикршударо такрор накунам, ман контейнери DinD-и худро сохтам:

https://github.com/alekslitvinenk/dind

Ҳалли кории DinD ба ман имкон дод, ки Docker-ро дар дохили Docker ба таври рекурсивӣ иҷро кунам ва таҷрибаҳои ҷолибтар гузаронам.
Ҳоло ман як озмоиши чунин (бомуваффақият)-ро бо иҷро кардани MySQL ва Nodejs тавсиф мекунам.
Аз ҳама бесаброна дида метавонад, ки дар ин ҷо чӣ гуна буд

Биёед мо оғоз кунем:

  1. Мо DinD-ро дар реҷаи интерактивӣ оғоз мекунем. Дар ин версияи DinD, мо бояд ҳамаи портҳоеро, ки контейнерҳои кӯдаконаи мо истифода бурда метавонанд, ба таври дастӣ харита кунем (ман аллакай дар ин кор кор карда истодаам)

    docker run --privileged -it 
    -p 80:8080 
    -p 3306:3306 
    alekslitvinenk/dind

    Мо ба баш ворид мешавем, ки аз он ҷо мо метавонем фавран ба кушодани контейнерҳои кӯдакона шурӯъ кунем.

  2. MySQL-ро оғоз кунед:

    docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql

  3. Мо ба махзани маълумот ҳамон тавре пайваст мешавем, ки ба он ба таври маҳаллӣ пайваст мешавем. Биёед боварӣ ҳосил кунем, ки ҳама чиз кор мекунад.

  4. Контейнери дуюмро ба кор андозед:

    docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server

    Лутфан қайд кунед, ки харитасозии порт маҳз хоҳад буд 8080:8080, зеро мо аллакай порти 80-ро аз ҳост ба контейнери волидайн ба порти 8080 харита кардаем.

  5. Мо дар браузер ба localhost меравем, боварӣ ҳосил кунед, ки сервер "Салом Ҷаҳон!"

Дар ҳолати ман, таҷриба бо контейнерҳои дохилии Docker хеле мусбат буд ва ман таҳияи лоиҳаро идома медиҳам ва онро барои саҳнасозӣ истифода хоҳам кард. Ба назари ман, ин як ҳалли хеле сабуктар аз Кубернетес ва Ҷенкинс X аст. Аммо ин ақидаи субъективии ман аст.

Ман фикр мекунам, ки ин ҳама барои мақолаи имрӯза аст. Дар мақолаи навбатӣ ман таҷрибаҳоро бо ба таври рекурсивӣ иҷро кардани Docker дар Docker ва васл кардани директорияҳо ба контейнерҳои лонашуда муфассалтар тавсиф мекунам.

PS Агар шумо ин лоиҳаро муфид ёбед, лутфан ба он дар GitHub ситорае диҳед, онро буред ва ба дӯстонатон бигӯед.

1 Хатогиҳои ислоҳшуда, тамаркуз ба 2 видео

Манбаъ: will.com

Илова Эзоҳ