Би Docker-ийг Докер дотор хэрхэн ажиллуулж, үүнээс юу гарсан

Сайн уу! Түүний дотор өмнөх нийтлэл, Би Docker програмыг Docker дээр ажиллуулах талаар болон энэ хичээлийг ашиглах практик талуудын талаар ярихаа амласан. Амлалтаа биелүүлэх цаг болжээ. Туршлагатай хөгжүүлэгчид Docker дотор Docker хэрэгтэй байгаа хүмүүс Docker дэмоны залгуурыг хостоос контейнер руу дамжуулахыг эсэргүүцэж магадгүй бөгөөд энэ нь тохиолдлын 99% -д хангалттай байх болно. Гэхдээ над руу жигнэмэг шидэх гэж бүү яар, учир нь бид Docker дотор Docker ажиллуулах тухай ярих болно. Энэ шийдэл нь олон боломжит хэрэглээтэй бөгөөд энэ нийтлэл нь тэдгээрийн аль нэгнийх нь тухай тул хойш суугаад гараа урдуураа шулуун болго.

Би Docker-ийг Докер дотор хэрхэн ажиллуулж, үүнээс юу гарсан

Начало

Энэ бүхэн 5-р сарын бороотой орой Дижитал далай дээр 24 доллараар түрээсэлсэн машинаа цэвэрлэж байх үед эхэлсэн бөгөөд Docker бүх дискний XNUMX гигабайт зайг зураг, савнуудаараа дүүргэснээс болж хөлдсөн байв. Хамгийн хачирхалтай нь эдгээр бүх зураг, контейнерууд түр зуурынх бөгөөд номын сан эсвэл фреймворкийн шинэ хувилбар гарах бүрт миний програмын гүйцэтгэлийг шалгахад л хэрэгтэй байсан. Би хог хаягдлыг цэвэрлэхийн тулд бүрхүүлийн скрипт бичиж, 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 багцуудыг суулгана уу (бүх зүйл sh-ээс bash дээр ажиллахад илүү тааламжтай байдаг):

    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-ийг Докер дотор хэрхэн ажиллуулж, үүнээс юу гарсан
Дээрх алхмуудыг дахин дахин давтахгүйн тулд би өөрийн 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 савтай хийсэн туршилт нэлээд эерэг болсон тул би төслийг үргэлжлүүлэн боловсруулж, үе шатанд ашиглах болно. Энэ бол Кубернетес, Женкинс Иксээс хамаагүй хөнгөн шийдэл юм шиг санагдаж байна. Гэхдээ энэ бол миний субъектив бодол юм.

Өнөөдрийн нийтлэлийн хувьд энэ л байна гэж би бодож байна. Дараагийн өгүүллээр би Docker-ийг Docker-д рекурсив байдлаар ажиллуулах, лавлахуудыг үүрлэсэн контейнерт суулгах туршилтуудыг илүү дэлгэрэнгүй тайлбарлах болно.

PS Хэрэв танд энэ төсөл хэрэгтэй гэж бодож байвал GitHub дээр од өгөөд, сэрээгээд найзууддаа хэлээрэй.

Засварлах1 2 видеон дээр төвлөрсөн алдааг зассан

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх