Giunsa nako pagpadagan ang Docker sa sulod sa Docker ug kung unsa ang migawas niini

Kumusta tanan! Sa iyang miaging artikulo, Misaad ako nga maghisgot bahin sa pagpadagan sa Docker sa Docker ug ang praktikal nga mga aspeto sa paggamit niini nga leksyon. Panahon na nga tumanon ang imong saad. Ang usa ka eksperyensiyado nga devopser tingali mosupak nga kadtong nanginahanglan sa Docker sulod sa Docker ipasa lang ang Docker daemon socket gikan sa host ngadto sa sudlanan ug kini igo na sa 99% sa mga kaso. Apan ayaw pagdali sa paglabay sa mga cookies kanako, tungod kay maghisgot kami bahin sa aktwal nga pagpadagan sa Docker sa sulod sa Docker. Kini nga solusyon adunay daghang posible nga mga aplikasyon ug kini nga artikulo bahin sa usa niini, busa lingkod ug tul-ira ang imong mga bukton sa imong atubangan.

Giunsa nako pagpadagan ang Docker sa sulod sa Docker ug kung unsa ang migawas niini

Начало

Nagsugod ang tanan sa usa ka ting-ulan nga gabii sa Septyembre sa dihang gilimpyohan nako ang makina nga akong giabangan alang sa $ 5 sa Digital Ocean, nga nagyelo tungod sa kamatuoran nga napuno sa Docker ang tanan nga 24 gigabytes nga magamit nga disk space sa mga imahe ug sulud niini. Ang kataw-anan mao nga kining tanan nga mga imahe ug mga sudlanan lumalabay lamang ug gikinahanglan lamang sa pagsulay sa performance sa akong aplikasyon sa matag higayon nga ang usa ka bag-ong bersyon sa usa ka librarya o gambalay ipagawas. Gisulayan nako ang pagsulat sa mga script sa kabhang ug pag-set up sa usa ka cron nga eskedyul sa paglimpyo sa basura, apan wala kini makatabang: sa matag higayon nga kini dili kalikayan nga matapos uban sa disk space sa akong server nga gikaon ug ang server nagbitay (labing maayo). Sa pila ka punto, nakit-an nako ang usa ka artikulo kung giunsa pagpadagan ang Jenkins sa usa ka sudlanan ug kung giunsa kini paghimo ug pagtangtang sa mga pipeline sa pagtukod pinaagi sa usa ka docker daemon socket nga gipasa niini. Ganahan ko sa ideya, apan nakahukom ko nga mopadayon ug mosulay sa pag-eksperimento sa direktang pagpadagan sa Docker sulod sa Docker. Niadtong panahona, para nako usa ka bug-os nga lohikal nga solusyon ang pag-download sa mga imahe sa Docker ug paghimo og mga sudlanan alang sa tanan nga mga aplikasyon nga akong gikinahanglan alang sa pagsulay sa sulod sa laing sudlanan (tawgon nato kini nga sudlanan sa dula). Ang ideya mao ang pagsugod sa usa ka sudlanan sa dula nga adunay -rm nga bandila, nga awtomatikong magtangtang sa tibuuk nga sulud ug tanan nga sulud niini kung kini gihunong. Gisusi nako ang imahe sa Docker gikan sa Docker mismo (https://hub.docker.com/_/docker), apan kini nahimong lisud kaayo ug wala gayud nako kini mahimo sa paagi nga akong gikinahanglan ug gusto ko nga moadto sa tanan nga paagi sa akong kaugalingon.

Pagpraktis. Cones

Nagsugod ako sa paghimo sa sudlanan nga molihok sa paagi nga akong gikinahanglan ug nagpadayon sa akong mga eksperimento, nga miresulta sa daghang mga putot. Ang resulta sa akong pagsakit sa kaugalingon mao ang mosunod nga algorithm:

  1. Gilunsad namo ang sudlanan sa Docker sa interactive mode.

    docker run --privileged -it docker:18.09.6

    Hatagi'g pagtagad ang bersyon sa sudlanan, lakang sa tuo o wala ug ang imong DinD mahimong kalabasa. Sa tinuud, kanunay nga maguba ang mga butang kung gipagawas ang usa ka bag-ong bersyon.
    Kinahanglan nga mosulod dayon kita sa kabhang.

  2. Gisulayan namon nga mahibal-an kung unsang mga sudlanan ang nagdagan (Tubag: wala), apan padaganon gihapon ang mando:

    docker ps

    Medyo matingala ka, apan nahimo nga ang Docker daemon wala gani nagdagan:

    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. Atong daganon kini sa atong kaugalingon:

    dockerd &

    Laing dili maayo nga sorpresa:

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

  4. I-install ang mga iptable ug bash nga mga pakete (ang tanan mas nindot nga magtrabaho sa bash kaysa sa sh):

    apk add --no-cache iptables bash

  5. Atong ilunsad ang bash. Sa katapusan nakabalik na kami sa naandan nga kabhang

  6. Atong sulayan nga sugdan pag-usab ang Docker:

    dockerd &

    Kinahanglan natong makita ang usa ka taas nga panid sa mga troso nga nagtapos sa:

    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. Pindota ang Enter. Nibalik mi sa bash.

Sukad karon, mahimo namong sulayan ang paglansad sa ubang mga sudlanan sa sulod sa among Docker container, apan unsa man kung gusto namon nga maglansad og lain nga Docker container sa sulod sa among Docker container o adunay dili maayo ug ang sudlanan nahagsa? Pagsugod pag-usab sa tanan.

Kaugalingong sudlanan sa DinD ug bag-ong mga eksperimento

Giunsa nako pagpadagan ang Docker sa sulod sa Docker ug kung unsa ang migawas niini
Aron malikayan nga balik-balikon ang mga lakang sa ibabaw, naghimo ko sa akong kaugalingon nga sudlanan sa DinD:

https://github.com/alekslitvinenk/dind

Ang nagtrabaho nga solusyon sa DinD naghatag kanako og katakus sa pagpadagan sa Docker sulod sa Docker nga balikbalik ug paghimo og mas daghang adventurous nga mga eksperimento.
Akong ihulagway ang usa sa ingon (malampuson) nga eksperimento sa pagpadagan sa MySQL ug Nodejs karon.
Ang labing dili mapailubon makakita kung giunsa kini dinhi

Mao nga, magsugod kita:

  1. Gilusad namo ang DinD sa interactive mode. Sa kini nga bersyon sa DinD, kinahanglan namon nga mano-mano nga mapa ang tanan nga mga pantalan nga magamit sa among mga sulud sa bata (gibuhat na nako kini)

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

    Nakasulod kami sa bash, gikan sa diin kami makasugod dayon sa paglansad sa mga sulud sa bata.

  2. Ilunsad ang MySQL:

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

  3. Nagkonektar kami sa database sa parehas nga paagi sama sa among pagkonektar niini sa lokal. Atong siguroon nga ang tanan molihok.

  4. Ilunsad ang ikaduhang sudlanan:

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

    Palihug timan-i nga ang port mapping mahimong eksakto 8080:8080, tungod kay na-mapa na namo ang port 80 gikan sa host ngadto sa parent container ngadto sa port 8080.

  5. Moadto kami sa localhost sa browser, siguroha nga ang server motubag sa "Hello World!"

Sa akong kaso, ang eksperimento sa mga nested Docker nga mga sudlanan nahimo’g positibo ug magpadayon ako sa pagpalambo sa proyekto ug gamiton kini alang sa dula. Para nako kini usa ka mas gaan nga solusyon kaysa Kubernetes ug Jenkins X. Apan kini ang akong suhetibong opinyon.

Sa akong hunahuna kana ra para sa artikulo karong adlawa. Sa sunod nga artikulo akong ihulagway sa mas detalyado nga mga eksperimento sa pagpadagan sa Docker nga recursively sa Docker ug pag-mount sa mga direktoryo nga lawom sa mga nested container.

PS Kung nakita nimo nga mapuslanon kini nga proyekto, palihug hatagi kini usa ka bituon sa GitHub, i-fork kini ug isulti sa imong mga higala.

Edit1 Gitul-id nga mga sayup, naka-focus sa 2 nga mga video

Source: www.habr.com

Idugang sa usa ka comment