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

Helo pawb! Yn ei erthygl flaenorolAddewais siarad am redeg Docker o fewn Docker ac agweddau ymarferol yr ymarfer hwn. Mae'n bryd cyflawni'r addewid hwnnw. Gallai gweithiwr proffesiynol DevOps profiadol ddadlau bod y rhai sydd angen Docker o fewn Docker yn syml yn anfon y soced daemon Docker ymlaen o'r gwesteiwr i'r cynhwysydd, ac mae hynny'n ddigon mewn 99% o achosion. Ond peidiwch â rhuthro i daflu cwcis ataf, oherwydd rydyn ni'n siarad am redeg Docker o fewn Docker mewn gwirionedd. Mae gan yr ateb hwn lawer o gymwysiadau posibl, ac mae'r erthygl hon yn ymwneud ag un ohonyn nhw, felly eisteddwch yn ôl a sythwch eich 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 peiriant $5 roeddwn wedi'i rentu ar Digital Ocean, a oedd wedi rhewi oherwydd delweddau a chynwysyddion Docker yn llenwi'r holl 24 gigabyte o le disg sydd ar gael. Yr eironi oedd bod yr holl ddelweddau a chynwysyddion hyn yn rhai dros dro a dim ond i brofi ymarferoldeb fy nghais oedd eu hangen bob tro y byddai fersiwn newydd o lyfrgell neu fframwaith yn cael ei rhyddhau. Ceisiais ysgrifennu sgriptiau cragen a sefydlu swydd cron i lanhau sbwriel, ond ni helpodd: bob tro, roedd yn anochel yn gorffen gyda lle disg fy ngweinydd yn cael ei fwyta a'r gweinydd yn rhewi (ar y gorau). Ar ryw adeg, fe wnes i ddod o hyd i erthygl am sut i redeg Jenkins mewn cynhwysydd a sut y gall greu a dileu piblinellau adeiladu trwy soced daemon Docker a oedd yn agored iddo. Roeddwn i'n hoffi'r syniad, ond penderfynais fynd gam ymhellach ac arbrofi gyda rhedeg Docker yn uniongyrchol o fewn Docker. Roedd yn ymddangos fel ateb rhesymegol i mi bryd hynny i lawrlwytho delweddau Docker a chreu cynwysyddion o'r 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 rhedeg y cynhwysydd llwyfannu gyda'r faner -rm, sy'n dileu'r cynhwysydd cyfan a'i holl gynnwys yn awtomatig pan fydd yn stopio. Fe wnes i gloddio o gwmpas gyda delwedd Docker o Docker ei hun (https://hub.docker.com/_/docker), ond trodd allan i fod yn rhy feichus ac ni lwyddais byth i wneud iddo weithio yn y ffordd yr oedd ei hangen arnaf ac roeddwn i eisiau mynd trwy'r broses gyfan fy hun.

Ymarfer. Conau

Penderfynais wneud i'r cynhwysydd weithio yn y ffordd roedd ei angen arnaf a pharheais â'm harbrofion, a arweiniodd at broblemau dirifedi. Uchafbwynt fy hunan-arteithio oedd yr algorithm canlynol:

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

    docker run --privileged -it docker:18.09.6

    Rhowch sylw i'r fersiwn cynhwysydd. Un cam i'r dde neu'r chwith ac mae eich DinD yn troi'n bwmpen. Mewn gwirionedd, mae pethau'n torri'n eithaf aml pan fydd fersiwn newydd yn cael ei rhyddhau.
    Rhaid i ni fynd i mewn i'r gragen ar unwaith.

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

    docker ps

    Byddwch chi ychydig yn synnu, ond mae'n ymddangos nad yw daemon Docker 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 gweithio yn bash yn bendant yn fwy pleserus nag yn sh):

    apk add --no-cache iptables bash

  5. Gadewch i ni lansio bash. O'r diwedd, rydyn ni'n ôl yn ein cragen gyfarwydd.

  6. Gadewch i ni geisio rhedeg Docker eto:

    dockerd &

    Dylen ni weld dalen hir o logiau 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 tŵr.

O'r pwynt hwn ymlaen, gallwn geisio rhedeg cynwysyddion eraill y tu mewn i'n cynhwysydd Docker, ond beth os ydym am redeg cynhwysydd Docker arall y tu mewn i'n cynhwysydd Docker, neu os bydd rhywbeth yn mynd o'i le ac mae'r cynhwysydd yn damwain? Rhaid i ni ddechrau o'r newydd.

Cynhwysydd DinD eich hun 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

Roedd cael datrysiad DinD gweithredol yn rhoi'r gallu i mi redeg Docker o fewn Docker yn rekursif a gwneud arbrofion mwy anturus.
Rydw i'n mynd i ddisgrifio un arbrawf (llwyddiannus) o'r fath gyda lansio MySQL a Nodejs nawr.
Gall y rhai mwyaf amyneddgar weld sut oedd hi yma

Chwarae fideo

Felly, gadewch i ni ddechrau:

  1. Byddwn yn rhedeg DinD mewn modd rhyngweithiol. Yn y fersiwn hon o DinD, mae angen i ni fapio â llaw yr holl borthladdoedd y gall ein cynwysyddion plentyn eu defnyddio (dw i 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. Cysylltwch â'r gronfa ddata yn yr un ffordd ag y byddem yn cysylltu'n lleol. Gwnewch yn siŵr bod popeth yn gweithio.

  4. Rydym yn lansio'r ail gynhwysydd:

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

    Noder y bydd mapio'r porthladd yma yn union 8080:8080, gan ein bod eisoes wedi mapio porthladd 80 o'r gwesteiwr i'r cynhwysydd rhiant ar borthladd 8080.

  5. Ewch i localhost yn y porwr a gwnewch yn siŵr bod y gweinydd yn ymateb gyda "Helo Byd!"

Yn fy achos i, roedd yr arbrawf gyda chynwysyddion Docker wedi'u nythu yn eithaf cadarnhaol, a byddaf yn parhau i ddatblygu'r prosiect a'i ddefnyddio ar gyfer llwyfannu. Rwy'n credu ei fod yn ateb llawer ysgafnach na, dyweder, Kubernetes a Jenkins X. Ond dyna fy marn oddrychol yn unig.

Dw i'n meddwl mai dyna'r cyfan ar gyfer erthygl heddiw. Yn yr erthygl nesaf, byddaf yn disgrifio'n fanylach fy arbrofion gyda chychwyniadau Docker dychweliadol a gosod cyfeiriaduron yn ddwfn o fewn cynwysyddion nythu.

PS Os ydych chi'n gweld y prosiect hwn yn ddefnyddiol, rhowch seren iddo ar GitHub, fforchiwch ef, a rhannwch ef gyda'ch ffrindiau.

Golygu1 Wedi trwsio rhai gwallau a chanolbwyntio ar 2 fideo.

Ffynhonnell: hab.com

Prynu gwesteio dibynadwy ar gyfer gwefannau sydd â diogelwch DDoS, gweinyddwyr VPS VDS 🔥 Prynu cynnal gwefannau dibynadwy gyda diogelwch DDoS, gweinyddion VPS VDS | ProHoster