Nola exekutatu nuen Docker Docker barruan eta zer atera zen

Kaixo guztioi! Berean aurreko artikulua, Docker-en Docker-en exekutatzeko eta ikasgai hau erabiltzearen alderdi praktikoei buruz hitz egingo nuela agindu nuen. Zure promesa betetzeko garaia da. Esperientziadun devopser batek aurka egingo du Docker barruan Docker behar dutenek Docker daemon socketa ostalaritik edukiontzira bidaltzea besterik ez dutela eta hori nahikoa izango da kasuen % 99an. Baina ez zaitez niri cookieak botatzera presarik, Dockerren barruan Dockerren exekuzioari buruz hitz egingo baitugu. Irtenbide honek aplikazio posible asko ditu eta artikulu hau horietako bati buruzkoa da, beraz, eseri eta altxatu besoak zure aurrean.

Nola exekutatu nuen Docker Docker barruan eta zer atera zen

Начало

Dena iraileko arratsalde euritsu batean hasi zen Digital Ocean-en 5 dolarren truke alokatu nuen makina garbitzen ari nintzela, izoztuta zegoen Docker-ek bere irudi eta edukiontziekin erabilgarri zegoen diskoko 24 gigabyte guztiak bete zituelako. Ironia zen irudi eta edukiontzi horiek guztiak iragankorrak zirela eta nire aplikazioaren errendimendua probatzeko soilik behar zirela liburutegi edo esparru baten bertsio berri bat askatzen zen bakoitzean. Saiatu nintzen shell script-ak idazten eta cron programazioa konfiguratzen zaborra garbitzeko, baina ez zuen lagundu: ezinbestean amaitzen zen bakoitzean nire zerbitzariaren diskoko espazioa jan eta zerbitzaria zintzilik (onenean). Noizbait, Jenkins edukiontzi batean exekutatu nola exekutatu eta bertan birbidaltzen den docker daemon socket baten bidez eraikitzeko kanalizazioak sortu eta ezaba ditzakeenari buruzko artikulu bat topatu nuen. Ideia gustatu zitzaidan, baina urrunago joatea eta Dockerren barruan Docker zuzenean exekutatzen esperimentatzen saiatzea erabaki nuen. Garai hartan, irtenbide guztiz logikoa iruditu zitzaidan Docker irudiak deskargatzea eta beste edukiontzi baten barruan probatzeko behar nituen aplikazio guztientzako edukiontziak sortzea (eszenaratzeko edukiontzia dei dezagun). Ideia zen -rm bandera duen etapa-edukiontzi bat abiaraztea, automatikoki edukiontzi osoa eta bere eduki guztia gelditzen denean ezabatzen duena. Docker beraren Docker irudia moldatu nuen (https://hub.docker.com/_/docker), baina astuna suertatu zitzaidan eta inoiz ez nuen lortu behar nuen moduan funtzionatzea eta nik neuk egin nahi nuen bide osoa.

Praktikatu. Konoak

Ontzia behar nuen moduan funtzionatzeari ekin nion eta nire esperimentuekin jarraitu nuen, eta horrek fruitu ugari sortu zituen. Nire autotorturaren emaitza algoritmo hau izan zen:

  1. Docker edukiontzia modu interaktiboan abiarazten dugu.

    docker run --privileged -it docker:18.09.6

    Erreparatu ontziaren bertsioari, urrats eskuinera edo ezkerrera eta zure DinD kalabaza bihurtzen da. Izan ere, gauzak sarritan apurtzen dira bertsio berri bat kaleratzen denean.
    Berehala sartu behar dugu oskoletan.

  2. Zein edukiontzi exekutatzen ari diren jakiten saiatzen ari gara (Erantzuna: bat ere ez), baina exekutatu dezagun komandoa hala ere:

    docker ps

    Pixka bat harritu egingo zara, baina Docker deabrua ez da martxan jartzen ere egiten:

    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. Exekutatu dezagun geuk:

    dockerd &

    Beste sorpresa desatsegin bat:

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

  4. Instalatu iptables eta bash paketeak (dena atseginagoa da bash-en lan egiteko sh-n baino):

    apk add --no-cache iptables bash

  5. Abiarazi dezagun bash. Azkenik, ohiko oskoletara itzuli gara

  6. Saia gaitezen Docker berriro abiarazten:

    dockerd &

    Honekin amaitzen den erregistro-orri luze bat ikusi beharko genuke:

    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. Sakatu Sartu. Itzuli gara.

Hemendik aurrera, gure Docker edukiontziaren barruan beste edukiontzi batzuk abiarazten saia gaitezke, baina zer gertatzen da gure Docker edukiontziaren barruan beste Docker edukiontzi bat abiarazi nahi badugu edo zerbait gaizki gertatzen bada eta edukiontzia huts egiten badu? Hasi berriro.

DinD edukiontzi propioa eta esperimentu berriak

Nola exekutatu nuen Docker Docker barruan eta zer atera zen
Aurreko urratsak behin eta berriz errepika ez daitezen, nire DinD edukiontzi propioa sortu nuen:

https://github.com/alekslitvinenk/dind

Lanean ari den DinD irtenbideak Docker-en Docker-en barruan modu errekurtsiboan exekutatzeko eta esperimentu abenturazaleagoak egiteko gaitasuna eman zidan.
MySQL eta Nodejs exekutatzeko esperimentu (arrakastatsu) bat deskribatuko dut orain.
Pazientzia handienek hemen nola zegoen ikus dezakete

Beraz, hasi:

  1. DinD modu interaktiboan abiarazten dugu. DinD-ren bertsio honetan, gure haurren edukiontziak erabil ditzaketen portu guztiak eskuz mapatu behar ditugu (dagoeneko lanean ari naiz)

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

    Bashean sartuko gara, eta handik berehala has gaitezen haurrentzako edukiontziak jaurtitzen.

  2. Abiarazi MySQL:

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

  3. Datu-basera lokalean konektatuko ginen moduan konektatzen gara. Ea dena funtzionatzen duela.

  4. Abiarazi bigarren edukiontzia:

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

    Kontuan izan portuaren mapa zehatza izango dela 8080:8080, dagoeneko 80 ataka ostalaritik edukiontzi nagusira 8080 atakara mapatu baitugu.

  5. Arakatzailean localhost-era joaten gara, ziurtatu zerbitzariak "Kaixo Mundua!" erantzuten duela.

Nire kasuan, habiaraturiko Docker edukiontziekin egindako esperimentua nahiko positiboa izan zen eta proiektua garatzen eta eszenaratzeko erabiltzen jarraituko dut. Kubernetes eta Jenkins X baino askoz irtenbide arinagoa dela iruditzen zait. Baina hau da nire iritzi subjektiboa.

Uste dut hori guztia dela gaurko artikulurako. Hurrengo artikuluan zehatzago deskribatuko ditut Docker errekurtsiboki Docker-en exekutatzen diren esperimentuak eta direktorioak habiaratutako edukiontzietan sakonduz.

PS Proiektu hau erabilgarria iruditzen bazaizu, eman izar bat GitHub-en, sar ezazu eta esan zure lagunei.

Edit1 Akatsak zuzenduta, 2 bideotan zentratuta

Iturria: www.habr.com

Gehitu iruzkin berria