Sut rhedais Docker y tu mewn i Docker a beth ddaeth allan ohono

Helo pawb! Yn ei erthygl flaenorol, Addewais siarad am redeg Docker in Docker a'r agweddau ymarferol ar ddefnyddio'r wers hon. Mae'n bryd cadw'ch addewid. Mae'n debyg y bydd devopser profiadol yn gwrthwynebu bod y rhai sydd angen Docker y tu mewn i Docker yn anfon soced ellyll Docker o'r gwesteiwr i'r cynhwysydd a bydd hyn yn ddigon mewn 99% o achosion. Ond peidiwch Γ’ rhuthro i daflu cwcis ataf, oherwydd byddwn yn siarad am redeg Docker y tu mewn i Docker mewn gwirionedd. Mae gan yr ateb hwn lawer o gymwysiadau posibl ac mae'r erthygl hon yn ymwneud ag un ohonynt, felly eisteddwch yn Γ΄l a sythu'ch breichiau o'ch blaen.

Sut rhedais Docker y tu mewn i Docker a beth ddaeth allan ohono

Dechrau

Dechreuodd y cyfan ar noson lawog ym mis Medi pan oeddwn yn glanhau'r peiriant a rentais am $5 ar Digital Ocean, a gafodd ei rewi oherwydd bod Docker wedi llenwi pob un o'r 24 gigabeit o ofod disg oedd ar gael gyda'i ddelweddau a'i gynwysyddion. Yr eironi oedd bod yr holl ddelweddau a chynwysyddion hyn yn fyrhoedlog a dim ond i brofi perfformiad fy nghais bob tro y rhyddhawyd fersiwn newydd o lyfrgell neu fframwaith oedd eu hangen. Ceisiais ysgrifennu sgriptiau cregyn a sefydlu amserlen cron i lanhau sbwriel, ond nid oedd yn helpu: bob tro y daeth i ben yn anochel gyda gofod disg fy gweinydd yn cael ei fwyta a'r gweinydd yn hongian (ar y gorau). Ar ryw adeg, deuthum ar draws erthygl am sut i redeg Jenkins mewn cynhwysydd a sut y gall greu a dileu piblinellau adeiladu trwy soced ellyll docwr a anfonwyd ymlaen iddo. Hoffais y syniad, ond penderfynais fynd ymhellach a cheisio arbrofi Γ’ rhedeg Docker yn uniongyrchol y tu mewn i Docker. Bryd hynny, roedd yn ymddangos i mi yn ateb cwbl resymegol i lawrlwytho delweddau Docker a chreu cynwysyddion ar gyfer yr holl gymwysiadau yr oedd eu hangen arnaf ar gyfer profi y tu mewn i gynhwysydd arall (gadewch i ni ei alw'n gynhwysydd llwyfannu). Y syniad oedd cychwyn cynhwysydd llwyfannu gyda'r faner -rm, sy'n dileu'r cynhwysydd cyfan a'i holl gynnwys yn awtomatig pan gaiff ei stopio. Fe wnes i dinceri gyda delwedd Docker o Docker ei hun (https://hub.docker.com/_/docker), ond roedd yn rhy feichus ac ni lwyddais erioed i'w gael i weithio'r ffordd yr oeddwn ei angen ac roeddwn i eisiau mynd yr holl ffordd fy hun.

Ymarfer. Conau

Es ati i wneud i'r cynhwysydd weithio'r ffordd yr oeddwn ei angen a pharhau Γ’'m harbrofion, a arweiniodd at lu o blagur. Canlyniad fy hunan-artaith oedd yr algorithm canlynol:

  1. Rydym yn lansio'r cynhwysydd Docker yn y modd rhyngweithiol.

    docker run --privileged -it docker:18.09.6

    Rhowch sylw i fersiwn y cynhwysydd, camwch i'r dde neu'r chwith ac mae'ch DinD yn troi'n bwmpen. Mewn gwirionedd, mae pethau'n torri'n eithaf aml pan ryddheir fersiwn newydd.
    Rhaid inni fynd i mewn i'r gragen ar unwaith.

  2. Rydyn ni'n ceisio darganfod pa gynwysyddion sy'n rhedeg (Ateb: dim), ond gadewch i ni redeg y gorchymyn beth bynnag:

    docker ps

    Byddwch ychydig yn synnu, ond mae'n ymddangos nad yw daemon y Dociwr hyd yn oed yn rhedeg:

    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. Gadewch i ni ei redeg ein hunain:

    dockerd &

    Syndod annymunol arall:

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

  4. Gosodwch y pecynnau iptables a bash (mae popeth yn fwy dymunol i weithio mewn bash nag yn sh):

    apk add --no-cache iptables bash

  5. Gadewch i ni lansio bash. O'r diwedd rydym yn Γ΄l yn y gragen arferol

  6. Gadewch i ni geisio lansio Docker eto:

    dockerd &

    Dylem weld taflen hir o foncyffion yn gorffen gyda:

    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. Pwyswch Enter. Rydyn ni'n Γ΄l yn y bash.

O hyn ymlaen, gallwn geisio lansio cynwysyddion eraill y tu mewn i'n cynhwysydd Docker, ond beth os ydym am lansio cynhwysydd Docker arall y tu mewn i'n cynhwysydd Docker neu os aiff rhywbeth o'i le a bod y cynhwysydd yn damwain? Dechreuwch eto.

Yn berchen ar gynhwysydd DinD ac arbrofion newydd

Sut rhedais Docker y tu mewn i Docker a beth ddaeth allan ohono
Er mwyn osgoi ailadrodd y camau uchod dro ar Γ΄l tro, creais fy nghynhwysydd DinD fy hun:

https://github.com/alekslitvinenk/dind

Rhoddodd yr ateb DinD gweithredol y gallu i mi redeg Docker y tu mewn i Docker yn rheolaidd a gwneud arbrofion mwy anturus.
Rydw i'n mynd i ddisgrifio un arbrawf (llwyddiannus) o'r fath gyda rhedeg MySQL a Nodejs nawr.
Gall y mwyaf diamynedd weld sut yr oedd yma

Felly, gadewch i ni ddechrau:

  1. Rydym yn lansio DinD yn y modd rhyngweithiol. Yn y fersiwn hon o DinD, mae angen i ni fapio Γ’ llaw yr holl borthladdoedd y gall ein cynwysyddion plant eu defnyddio (Rwyf eisoes yn gweithio ar hyn)

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

    Rydyn ni'n mynd i mewn i'r bash, lle gallwn ni ddechrau lansio cynwysyddion plant ar unwaith.

  2. Lansio MySQL:

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

  3. Rydym yn cysylltu Γ’'r gronfa ddata yn yr un ffordd ag y byddem yn cysylltu ag ef yn lleol. Gadewch i ni sicrhau bod popeth yn gweithio.

  4. Lansio'r ail gynhwysydd:

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

    Sylwch y bydd y mapio porthladdoedd yn union 8080:8080, gan ein bod eisoes wedi mapio porthladd 80 o'r gwesteiwr i'r rhiant-gynhwysydd i borthladd 8080.

  5. Rydyn ni'n mynd i localhost yn y porwr, gwnewch yn siΕ΅r bod y gweinydd yn ymateb β€œHelo World!”

Yn fy achos i, roedd yr arbrawf gyda chynwysyddion Dociwr nythu yn eithaf cadarnhaol a byddaf yn parhau i ddatblygu'r prosiect a'i ddefnyddio ar gyfer llwyfannu. Ymddengys i mi fod hwn yn ateb llawer mwy ysgafn na Kubernetes a Jenkins X. Ond dyma fy marn oddrychol.

Rwy'n meddwl mai dyna'r cyfan ar gyfer erthygl heddiw. Yn yr erthygl nesaf byddaf yn disgrifio'n fanylach arbrofion gyda rhedeg Docker yn rheolaidd yn Docker a gosod cyfeiriaduron yn ddwfn i gynwysyddion nythu.

PS Os bydd y prosiect hwn yn ddefnyddiol i chi, rhowch seren iddo ar GitHub, fforchiwch hi a dywedwch wrth eich ffrindiau.

Edit1 Gwallau wedi'u cywiro, yn canolbwyntio ar 2 fideo

Ffynhonnell: hab.com

Ychwanegu sylw