Kā es palaidu Docker iekŔā Docker un kas no tā iznāca

Sveiki visiem! Viņa iepriekŔējais raksts, es apsolÄ«ju runāt par Docker palaiÅ”anu programmā Docker un Ŕīs nodarbÄ«bas praktiskajiem izmantoÅ”anas aspektiem. Ir pienācis laiks turēt savu solÄ«jumu. Pieredzējis devopsētājs droÅ”i vien iebildÄ«s, ka tiem, kam Docker iekŔā Docker nepiecieÅ”ams, vienkārÅ”i pārsÅ«ta Docker dēmona ligzdu no saimniekdatora uz konteineru un ar to pietiks 99% gadÄ«jumu. Bet nesteidzieties mest man cepumus, jo mēs runāsim par to, kā faktiski darbināt Docker iekŔā Docker. Å im risinājumam ir daudz iespējamo lietojumu, un Å”is raksts ir par vienu no tiem, tāpēc apsēdieties un iztaisnojiet rokas sev priekŔā.

Kā es palaidu Docker iekŔā Docker un kas no tā iznāca

sākums

Viss sākās lietainā septembra vakarā, kad Digital Ocean tÄ«rÄ«ju maŔīnu, ko par 5 dolāriem noÄ«rēju, kas bija iesaldēta tādēļ, ka Docker bija aizpildÄ«jis visus 24 gigabaitus pieejamās diska vietas ar saviem attēliem un konteineriem. Ironija bija tāda, ka visi Å”ie attēli un konteineri bija Ä«slaicÄ«gi un bija nepiecieÅ”ami tikai, lai pārbaudÄ«tu manas lietojumprogrammas veiktspēju katru reizi, kad tika izlaista jauna bibliotēkas vai ietvara versija. Es mēģināju rakstÄ«t čaulas skriptus un iestatÄ«t cron grafiku, lai iztÄ«rÄ«tu atkritumus, taču tas nepalÄ«dzēja: katru reizi tas neizbēgami beidzās ar mana servera diska vietas apÄ“Å”anu un servera karāŔanos (labākajā gadÄ«jumā). Kādā brÄ«dÄ« es saskāros ar rakstu par to, kā palaist Jenkins konteinerā un kā tas var izveidot un dzēst bÅ«vniecÄ«bas cauruļvadus, izmantojot tajā pārsÅ«tÄ«to docker dēmona ligzdu. Man patika Ŕī ideja, taču es nolēmu iet tālāk un mēģināt eksperimentēt ar Docker tieÅ”u palaiÅ”anu iekŔā Docker. TobrÄ«d man Ŕķita pilnÄ«gi loÄ£isks risinājums cita konteinera (sauksim to par inscenÄ“Å”anas konteineru) iekÅ”ienē lejupielādēt Docker attēlus un izveidot konteinerus visām testÄ“Å”anai nepiecieÅ”amajām aplikācijām. Ideja bija sākt inscenÄ“Å”anas konteineru ar karogu -rm, kas automātiski izdzÄ“Å” visu konteineru un visu tā saturu, kad tas tiek apturēts. Es izdomāju Docker attēlu no paÅ”a Docker (https://hub.docker.com/_/docker), taču tas izrādÄ«jās pārāk apgrÅ«tinoÅ”i, un man nekad neizdevās panākt, lai tas darbotos tā, kā man vajadzēja, un es gribēju pats noiet visu ceļu.

Prakse. Konusi

Es nolēmu, lai konteiners darbotos tā, kā man vajadzēja, un turpināju savus eksperimentus, kuru rezultātā radās neskaitāmi pumpuri. Manas paÅ”spÄ«dzināŔanas rezultāts bija Ŕāds algoritms:

  1. Mēs palaižam Docker konteineru interaktīvajā režīmā.

    docker run --privileged -it docker:18.09.6

    Pievērsiet uzmanÄ«bu konteinera versijai, pagriezieties pa labi vai pa kreisi, un jÅ«su DinD pārvērÅ”as par Ä·irbi. Faktiski lietas diezgan bieži sabojājas, kad tiek izlaista jauna versija.
    Mums nekavējoties jāiekļūst čaulā.

  2. Mēs cenÅ”amies noskaidrot, kuri konteineri darbojas (atbilde: nav), taču izpildÄ«sim komandu tik un tā:

    docker ps

    Jūs būsiet nedaudz pārsteigts, bet izrādās, ka Docker dēmons pat nedarbojas:

    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. Izpildīsim paŔi:

    dockerd &

    Vēl viens nepatīkams pārsteigums:

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

  4. Instalējiet iptables un bash pakotnes (bash ir patīkamāk strādāt nekā sh):

    apk add --no-cache iptables bash

  5. Palaidīsim bash. Beidzot esam atgriezuŔies ierastajā čaulā

  6. Mēģināsim vēlreiz palaist Docker:

    dockerd &

    Mums vajadzētu redzēt garu žurnālu lapu, kas beidzas ar:

    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. Nospiediet Enter. Mēs esam atgriezuÅ”ies spārnos.

No Ŕī brīža mēs varam mēģināt palaist citus konteinerus mÅ«su Docker konteinerā, bet ko darÄ«t, ja mēs vēlamies palaist citu Docker konteineru mÅ«su Docker konteinerā vai kaut kas noiet greizi un konteiners avarē? Sāciet visu no jauna.

Savs DinD konteiners un jauni eksperimenti

Kā es palaidu Docker iekŔā Docker un kas no tā iznāca
Lai izvairÄ«tos no iepriekÅ” minēto darbÄ«bu atkārtoÅ”anas atkal un atkal, es izveidoju savu DinD konteineru:

https://github.com/alekslitvinenk/dind

DarbojoÅ”ais DinD risinājums man deva iespēju rekursÄ«vi palaist Docker iekŔā Docker un veikt piedzÄ«vojumiem bagātākus eksperimentus.
Es tagad aprakstīŔu vienu Ŕādu (veiksmīgu) eksperimentu ar MySQL un Nodejs darbināŔanu.
NepacietÄ«gākie var redzēt, kā Å”eit bija

Tātad, sāksim:

  1. Mēs palaižam DinD interaktÄ«vajā režīmā. Å ajā DinD versijā mums ir manuāli jākartē visi porti, kurus var izmantot mÅ«su bērnu konteineri (es jau strādāju pie Ŕī)

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

    Nokļūstam bashā, no kurienes uzreiz varam sākt palaist bērnu konteinerus.

  2. Palaidiet MySQL:

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

  3. Mēs izveidojam savienojumu ar datu bāzi tādā paŔā veidā, kā mēs pieslēgtos tai lokāli. Pārliecināsimies, ka viss darbojas.

  4. Palaidiet otro konteineru:

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

    LÅ«dzu, ņemiet vērā, ka ostas kartējums bÅ«s precÄ«zs 8080:8080, jo mēs jau esam kartējuÅ”i 80. portu no resursdatora uz vecāku konteineru ar portu 8080.

  5. Pārlūkprogrammā mēs ejam uz vietni localhost, pārliecinieties, vai serveris atbild: "Sveika pasaule!"

Manā gadÄ«jumā eksperiments ar ligzdotajiem Docker konteineriem izrādÄ«jās diezgan pozitÄ«vs un es turpināŔu izstrādāt projektu un izmantot to inscenÄ“Å”anai. Man Ŕķiet, ka Å”is ir daudz vieglāks risinājums nekā Kubernetes un Jenkins X. Bet tas ir mans subjektÄ«vais viedoklis.

Es domāju, ka tas ir viss Ŕodienas rakstam. Nākamajā rakstā es sīkāk aprakstīŔu eksperimentus ar Docker rekursīvu palaiŔanu programmā Docker un direktoriju montāžu dziļi ligzdotos konteineros.

PS Ja Å”is projekts jums Ŕķiet noderÄ«gs, lÅ«dzu, pieŔķiriet tam zvaigznÄ«ti vietnē GitHub, dakÅ”a un pastāstiet draugiem.

Rediģēt1 Izlabotas kļūdas, koncentrējoties uz 2 videoklipiem

Avots: www.habr.com

Pievieno komentāru