Բարև բոլորին! Ժամանակն է խոսել Դոկեր ներսում Դոկեր սկսելու մասին ու դրա գործնական կիրառություններում։ Ժամանակն է կատարել իմ խոստումը։ Իրավունք չունեմ կասկածելու, որ փորձառու դեվոպսները պնդելու են, որ Դոկեր պահանջողներին պարզապես փոխանցում են ԴոկերDaemon-ի սոկետը հյուրընկալողից դեպի կոնտեյներ, և սա բավարար է 99% դեպքերի համար։ Բայց մի շտապեք իմ ուղղությամբ խորխորակի վերարկուներ նետել, քանի որ խոսքը կմասնակցի իրական Դոկերի գործարկմանը Դոկերի ներսում։ Ասված լուծումն ունի բազմաթիվ հնարավոր կիրառման ոլորտներ, և այս հոդվածում մենք կգտնենք դրանցից մեկը, ուստի նստեք հանգիստ և ուղիղ պահեք ձեր ձեռքերը։ Որպեսզի պատճենեինք $5 արժողությամբ Digital Ocean վարձակալված մեքենայից, ինքս ինձ ստիպեցի մաքրելու, որն ամբողջովին կախված էր, কারণ Դոկերը լիովին զբաղեցրել էր բոլոր 24 ԳԲ ազատ սկավառակի տարածքը իր պատկերներով և կոնտեյներով։ Իրականում, այդ բոլոր պատկերներն ու կոնտեյները ժամանակավոր էին և անհրաժեշտ էին միայն իմ հավելվածի աշխատունակությունը փորձարկելու համար ամեն անգամ, երբ նոր տարբերակ էր ձեռք բերում որևէ գրադարան կամ շրջանակ։ Ես փորձել էի գրել շելլ-скрипտեր և կարգավորել կտրոների ժամանակացույցներ, որպեսզի մաքրեմ թափը, բայց դա չփրկեց․ ամեն անգամ մեր սերվերի սկավառակի տարածքը սնվում էր, իսկ սերվերը կանգառ էր տալիս (լավագույն դեպքում)։ Երբեմն ոմանք ինձ փսխեցին հոդվածի վրա, որն ասում էր, թե ինչպես սկսել Ջենկինսը կոնտեյնում, և ինչպես նա կարող է ստեղծել և ջնջել կառուցման գործընթացները, проброшенный в него сокет докер демона: Իդեան ինձ դուր եկավ, բայց որոշեցի գնալ ավելի հեռու և փորձել Դոկերը անմիջապես սկսել Դոկերի ներսում։ Այդ ժամանակ мне seemed вполне логичным решением выкачать докер образы и создать контейнеры всех приложений, которые мне нужны для тестирования внутри другого контейнера (назовем его staging контейнер)։ Կարծիքս այն էր, որ պետք է սկսել staging կոնտեյնեեր -rm ֆլագով, որը ավտոմատ կերպով ջնջում է ողջ կոնտեյները բոլոր առկա նյութերով երբ կանգառում է։ Ես անցավ եմ գործընկերություն դոկեր պատկերացված Դոկերի սեփականությունից,

Սկիզբ
Բայց այն չափազանց ծանր էր, և ես չեմ կարողացել այն աշխատեցնել այնպես, ինչպես ինձ անհրաժեշտ էր, իսկ ինձ ուզած ճանապարհը անցնել։Պրակտիկա։ Զանգվածներ
Ես նպատակ ունեի, որպեսզի կոնտեյները աշխատի այնպես, ինչպես ինձ պետք է, ու շարունակեցի իմ փորձերը, որոնց արդյունքն էր անվերջ քանակությամբ զանգվածներ։ Իմ ինքնասպանության արդյունքն էր հետևյալ ալգորիթմը՝
Սկսում ենք Դոկեր կոնտեյները ցուցիչի ռեժիմում։
docker run --privileged -it docker:18.09.6
Խնդրում եմ ուշադրություն դարձնել կոնտեյնի տարբերակում, քայլ вправо или в лево и ваш ДинД превращается в тыкву. Իրականում, ամեն ինչ աջակից է լինում նոր տարբերակների հետ։Մենք պետք է անմիջապես մտնենք շելլ։
Մեզ պետք է անմիջապես մտնել կանչի սահմանված մաֆիա կամ հասարակություն.Մենք փորձում ենք հասկանալ, թե quais контейներներ են աշխատում (Պատասխան: ոչ մի), բայց եկեք կատարենք հրահանգը միևնույնն է:
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 foundՈւսուցում ենք iptables և bash փաթեթները (bash-ով աշխատելը ավելի հաճելի է, քան sh-ով):
apk add --no-cache iptables bashԲացենք bash-ը: Ա enfin մենք կրկին ենք привычном шелле
փորձենք դեռ մեկը մղել 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Սեղմենք Enter: Մենք կրկին ենք bash-ում:
Այս պահին մենք կարող ենք փորձել սկսել այլ контейներ մեր Docker контейների ներսում, բայց ինչքան մենք ցանկանում ենք բարձրացնել ևս մեկ Docker контейներ մեր Docker контейների ներսում, կամ ինչ-որ բան սխալ կլինի եւ контейերը "վերցնումը"? սկսենք ամեն ինչ նախնական:
Մեր սեփական DinD контейները և նոր փորձեր
Որպեսզի չկրկնել վերոնշված քայլերը կրկին ու կրկին, ես ստեղծել եմ իմ սեփական DinD контейրը:
Աշխատող DinD լուծումը ինձ հնարավորություն է տվել դրամագլուխ գլխավորը Docker-ի ներսում Docker-ում ռեկուրսիվ լինել և ավելի համարձակ փորձեր անցկացնել:
Բարելավված փորձերից մեկը MySQL և Nodejs-ը գործարկելուց հետո ես հիմա պատրաստվում եմ նկարագրել:
Արժեքավորները կարող են տեսնել այդ բոլորը այստեղ

Այսպես, սկսենք:
Այս ինտրավորոմ DinD-ը պետք է բացենք ինտերակտիվ ռեժիմում: Այս DinD-ի տարբերակում մենք պետք է ձեռքով համեմատենք բոլոր պորտերը, որոնք կարող են օգտագործել մեր զարմիկ контейները (ես այս թեմայի վրա աշխատում եմ):
docker run --privileged -it -p 80:8080 -p 3306:3306 alekslitvinenk/dindՄենք մտնում ենք bash, որտեղ անմիջապես կարող ենք սկսել զարմիկ контейների գործարկումը:
Գործարկում ենք 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-ի վրա բրաուզերում, հաստատում ենք, որ սերվերը պատասխանում է "Hello World!"
Իմ դեպքում փորձը ներփարձված Docker-container-ների հետ բավական բարենպաստ էր, և ես շարունակեմ զարգացնել նախագիծը և օգտագործել այն հանգստացման համար: Ես认为,这比Kubernetes和Jenkins X更轻量级的解决方案。但是这是我的主观观点。
Ես կարծում եմ, որ այսօրվա հոդվածի համար դա ամեն ինչ է: Կողմնային հոդվածում ես ավելի մանրամասն կներկայացնեմ փորձեր Docker-ի ռեկուրսիվ գործարկման և ներդրված контейների հատվի մասերում:
P.S. Եթե կարծում եք, որ այս նախագիծը օգտակար է, ապա խնդրում ենք դրական գնահատական տալ GitHub-ում, կատարեք տարբերակ և պատմեք ընկերներին:
Edit1 Որոնեց այն սխալները, կենտրոնացավ 2 տեսանյութի վրա
Ընտանիք: habr.com
