Si e drejtova Docker brenda Docker dhe çfarë doli prej tij

Pershendetje te gjitheve! Në të tijën artikulli i mëparshëm, premtova të flas për drejtimin e Docker në Docker dhe aspektet praktike të përdorimit të këtij mësimi. Është koha për të mbajtur premtimin tuaj. Një zhvillues me përvojë ndoshta do të kundërshtojë që ata që kanë nevojë për Docker brenda Docker thjesht e përcjellin prizën e daemonit Docker nga hosti në kontejner dhe kjo do të jetë e mjaftueshme në 99% të rasteve. Por mos nxitoni të më hidhni biskota, sepse ne do të flasim për drejtimin e vërtetë të Docker brenda Docker. Kjo zgjidhje ka shumë aplikime të mundshme dhe ky artikull ka të bëjë me njërën prej tyre, ndaj uluni dhe drejtoni krahët para jush.

Si e drejtova Docker brenda Docker dhe çfarë doli prej tij

Fillim

Gjithçka filloi në një mbrëmje shtatori me shi, kur po pastroja makinën që mora me qira për 5 dollarë në Digital Ocean, e cila ishte ngrirë për shkak të faktit se Docker kishte mbushur të gjitha 24 gigabajt hapësirë ​​të disponueshme në disk me imazhet dhe kontejnerët e saj. Ironia ishte se të gjitha këto imazhe dhe kontejnerë ishin kalimtare dhe nevojiteshin vetëm për të testuar performancën e aplikacionit tim sa herë që lëshohej një version i ri i një biblioteke ose kornizë. Unë u përpoqa të shkruaja skriptet e guaskës dhe të vendosja një orar cron për të pastruar mbeturinat, por nuk më ndihmoi: sa herë që përfundonte në mënyrë të pashmangshme me konsumimin e hapësirës së diskut të serverit tim dhe varjen e serverit (në rastin më të mirë). Në një moment, hasa në një artikull se si të ekzekutoj Jenkins në një kontejner dhe se si mund të krijojë dhe fshijë tubacionet e ndërtimit përmes një foleje daemon docker të dërguar në të. Më pëlqeu ideja, por vendosa të shkoj më tej dhe të përpiqem të eksperimentoj me drejtimin e drejtpërdrejtë të Docker brenda Docker. Në atë kohë, më dukej një zgjidhje plotësisht logjike për të shkarkuar imazhet e Docker dhe për të krijuar kontejnerë për të gjitha aplikacionet që më duheshin për të testuar brenda një kontejneri tjetër (le ta quajmë një kontejner skenik). Ideja ishte që të fillonte një kontejner me skemë me flamurin -rm, i cili automatikisht fshin të gjithë kontejnerin dhe të gjithë përmbajtjen e tij kur ndalet. Unë ngatërrova imazhin Docker nga vetë Docker (https://hub.docker.com/_/docker), por doli të ishte shumë e rëndë dhe kurrë nuk arrita ta bëja të funksiononte ashtu siç kisha nevojë dhe doja të shkoja vetë deri në fund.

Praktikoni. Kone

Nisa ta bëja enën të funksiononte ashtu siç kisha nevojë dhe vazhdova eksperimentet e mia, të cilat rezultuan në një mori sythash. Rezultati i vetë-torturës sime ishte algoritmi i mëposhtëm:

  1. Ne nisim kontejnerin Docker në modalitetin interaktiv.

    docker run --privileged -it docker:18.09.6

    Kushtojini vëmendje versionit të enës, hapni djathtas ose majtas dhe DinD juaj kthehet në një kungull. Në fakt, gjërat prishen mjaft shpesh kur lëshohet një version i ri.
    Ne duhet menjëherë të futemi në guaskë.

  2. Ne po përpiqemi të zbulojmë se cilët kontejnerë po funksionojnë (Përgjigje: asnjë), por le të ekzekutojmë komandën gjithsesi:

    docker ps

    Do të habiteni pak, por rezulton se daemon Docker as nuk po funksionon:

    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. Le ta drejtojmë vetë:

    dockerd &

    Një tjetër surprizë e pakëndshme:

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

  4. Instaloni paketat iptables dhe bash (çdo gjë është më e këndshme për të punuar në bash sesa në sh):

    apk add --no-cache iptables bash

  5. Le të nisim bash. Më në fund jemi kthyer në guaskën e zakonshme

  6. Le të përpiqemi të fillojmë përsëri Docker:

    dockerd &

    Ne duhet të shohim një fletë të gjatë shkrimesh që mbarojnë me:

    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. Shtypni Enter. Ne jemi kthyer në bash.

Që tani e tutje, ne mund të përpiqemi të lëshojmë kontejnerë të tjerë brenda kontejnerit tonë Docker, por çka nëse duam të lëshojmë një kontejner tjetër Docker brenda kontejnerit tonë Docker ose diçka nuk shkon dhe kontejneri rrëzohet? Filloni përsëri nga e para.

Zotëroni kontejnerin DinD dhe eksperimente të reja

Si e drejtova Docker brenda Docker dhe çfarë doli prej tij
Për të shmangur përsëritjen e hapave të mësipërm pa pushim, unë krijova kontejnerin tim DinD:

https://github.com/alekslitvinenk/dind

Zgjidhja e punës DinD më dha mundësinë për të drejtuar Docker brenda Docker në mënyrë rekursive dhe për të bërë eksperimente më aventureske.
Unë do të përshkruaj një eksperiment të tillë (të suksesshëm) me ekzekutimin e MySQL dhe Nodejs tani.
Më të paduruarit mund ta shohin se si ishte këtu

Pra, le të fillojmë:

  1. Ne e hapim DinD në modalitetin interaktiv. Në këtë version të DinD, ne duhet të hartojmë manualisht të gjitha portat që mund të përdorin kontejnerët tanë të fëmijëve (Unë tashmë jam duke punuar për këtë)

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

    Ne futemi në bash, nga ku mund të fillojmë menjëherë hedhjen e kontejnerëve për fëmijë.

  2. Hapni MySQL:

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

  3. Ne lidhemi me bazën e të dhënave në të njëjtën mënyrë siç do të lidheshim me të në nivel lokal. Le të sigurohemi që gjithçka të funksionojë.

  4. Lëshoni enën e dytë:

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

    Ju lutemi vini re se harta e portit do të jetë saktësisht 8080:8080, meqenëse tashmë kemi hartuar portin 80 nga hosti në kontejnerin prind në portin 8080.

  5. Ne shkojmë te localhost në shfletues, sigurohuni që serveri të përgjigjet "Hello World!"

Në rastin tim, eksperimenti me kontejnerët e mbivendosur Docker doli të ishte mjaft pozitiv dhe unë do të vazhdoj ta zhvilloj projektin dhe ta përdor për skenë. Më duket se kjo është një zgjidhje shumë më e lehtë se Kubernetes dhe Jenkins X. Por ky është mendimi im subjektiv.

Unë mendoj se kjo është e gjitha për artikullin e sotëm. Në artikullin tjetër do të përshkruaj më në detaje eksperimentet me ekzekutimin e Docker-it në mënyrë rekursive në Docker dhe montimin e drejtorive thellë në kontejnerë të mbivendosur.

PS Nëse ju duket i dobishëm ky projekt, ju lutemi jepni një yll në GitHub, ndani atë dhe tregojuni miqve tuaj.

Redaktoni1 Gabimet e korrigjuara, të fokusuara në 2 video

Burimi: www.habr.com

Shto një koment