Hogyan futtattam a Dockert a Dockeren belül, és mi sült ki belőle

Sziasztok! Az övében előző cikk, Megígértem, hogy beszélek a Docker Dockerben való futtatásáról és a lecke használatának gyakorlati vonatkozásairól. Ideje betartani az ígéretét. Egy tapasztalt devopser valószínűleg kifogásolja, hogy akinek Dockerre van szüksége a Dockeren belül, egyszerűen továbbítja a Docker démon foglalatát a gazdagéptől a konténerbe, és ez az esetek 99%-ában elegendő lesz. De ne rohanjon a sütivel, mert beszélni fogunk arról, hogy a Docker valóban fut a Dockeren belül. Ennek a megoldásnak számos alkalmazási lehetősége van, és ez a cikk ezek egyikéről szól, ezért dőljön hátra, és egyenesítse ki a karját maga előtt.

Hogyan futtattam a Dockert a Dockeren belül, és mi sült ki belőle

kezdet

Az egész egy esős szeptemberi estén kezdődött, amikor a Digital Ocean-on 5 dollárért bérelt gépemet takarítottam, ami lefagyott amiatt, hogy a Docker mind a 24 gigabájtnyi szabad lemezterületet feltöltött képeivel és konténereivel. Az irónia az volt, hogy ezek a képek és tárolók átmenetiek voltak, és csak az alkalmazásom teljesítményének teszteléséhez volt szükségük minden alkalommal, amikor egy könyvtár vagy keretrendszer új verziója megjelent. Megpróbáltam shell szkripteket írni és cron ütemezést beállítani a szemét eltakarítására, de ez nem segített: minden alkalommal elkerülhetetlenül a szerverem lemezterületének felemésztésével és a szerver lefagyásával (legjobb esetben) a vége. Valamikor rábukkantam egy cikkre, amely arról szólt, hogyan futtassuk a Jenkinst egy konténerben, és hogyan tud létrehozni és törölni build-folyamatokat az oda továbbított docker démon socketen keresztül. Tetszett az ötlet, de úgy döntöttem, tovább megyek, és megpróbálok kísérletezni a Docker közvetlen futtatásával a Dockeren belül. Abban az időben számomra teljesen logikus megoldásnak tűnt, hogy letöltöttem a Docker-képeket, és egy másik konténerben (nevezzük állomásozó konténerben) konténereket készítek minden olyan alkalmazáshoz, amelyre szükségem volt a teszteléshez. Az ötlet az volt, hogy indítsunk el egy átmeneti tárolót az -rm kapcsolóval, amely automatikusan törli a teljes tárolót és annak teljes tartalmát, ha leállítjuk. A Docker-képet magából a Dockerből bütykölgettem (https://hub.docker.com/_/docker), de túl nehézkesnek bizonyult, és soha nem sikerült úgy működni, ahogyan szükségem volt rá, és én magam akartam végigmenni.

Gyakorlat. Kúpok

Elhatároztam, hogy a konténer úgy működjön, ahogyan szükségem volt, és folytattam a kísérleteimet, aminek eredményeként számtalan rügy keletkezett. Az önkínzásom eredménye a következő algoritmus volt:

  1. A Docker tárolót interaktív módban indítjuk el.

    docker run --privileged -it docker:18.09.6

    Ügyeljen a tartály verziójára, lépjen jobbra vagy balra, és a DinD tökké változik. Valójában a dolgok gyakran megszakadnak, amikor új verziót adnak ki.
    Azonnal be kell jutnunk a kagylóba.

  2. Próbáljuk kideríteni, hogy mely konténerek futnak (Válasz: egyik sem), de futtassuk le a parancsot:

    docker ps

    Kicsit meg fogsz lepődni, de kiderül, hogy a Docker démon nem is fut:

    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. Futtassuk mi magunk:

    dockerd &

    Még egy kellemetlen meglepetés:

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

  4. Telepítse az iptables és a bash csomagokat (bash-ban minden kellemesebb, mint sh-ben):

    apk add --no-cache iptables bash

  5. Indítsuk el a bash-t. Végre visszatértünk a megszokott kagylóba

  6. Próbáljuk meg újra futtatni a Dockert:

    dockerd &

    Egy hosszú naplólapot kell látnunk, amely a következőkkel végződik:

    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. Nyomd meg az Entert. Visszatértünk a csapásra.

Mostantól megpróbálhatunk más konténereket elindítani a Docker-konténerünkön belül, de mi van akkor, ha egy másik Docker-konténert szeretnénk elindítani a Docker-konténerünkben, vagy valami elromlik, és a konténer összeomlik? Előről kezdeni.

Saját DinD konténer és új kísérletek

Hogyan futtattam a Dockert a Dockeren belül, és mi sült ki belőle
A fenti lépések újra és újra megismétlésének elkerülése érdekében létrehoztam egy saját DinD tárolómat:

https://github.com/alekslitvinenk/dind

A működő DinD megoldás lehetővé tette számomra, hogy a Dockert rekurzívan futtassam a Dockeren belül, és kalandosabb kísérleteket végezhessek.
Most egy ilyen (sikeres) kísérletet írok le a MySQL és a Nodejs futtatásával.
A legtürelmetlenebbek láthatják, milyen volt itt

Tehát kezdjük:

  1. A DinD-t interaktív módban indítjuk el. A DinD ezen verziójában manuálisan kell leképeznünk az összes portot, amelyet gyermektárolóink ​​használhatnak (már dolgozom ezen)

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

    Beérünk a bashba, ahonnan azonnal elkezdhetjük a gyerekkonténerek vízre bocsátását.

  2. Indítsa el a MySQL-t:

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

  3. Ugyanúgy kapcsolódunk az adatbázishoz, mint helyileg. Győződjön meg róla, hogy minden működik.

  4. Indítsa el a második tárolót:

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

    Kérjük, vegye figyelembe, hogy a port-leképezés pontosan így lesz 8080:8080, mivel a 80-as portot a gazdagépről a szülőtárolóra már leképeztük a 8080-as portra.

  5. A böngészőben a localhost oldalra lépünk, és győződjön meg arról, hogy a szerver válaszol: „Hello World!”

Az én esetemben a beágyazott Docker konténerekkel végzett kísérlet meglehetősen pozitívra sikeredett, és tovább fogom fejleszteni a projektet, és felhasználom a színpadra. Nekem úgy tűnik, hogy ez egy sokkal könnyedebb megoldás, mint a Kubernetes és a Jenkins X. De ez az én szubjektív véleményem.

Azt hiszem, ennyi a mai cikkhez. A következő cikkben részletesebben leírom a Docker Dockerben való rekurzív futtatásával kapcsolatos kísérleteket, valamint a könyvtárak beágyazott tárolókba való beillesztését.

PS Ha hasznosnak találja ezt a projektet, jelölje meg csillaggal a GitHubon, forgassa el, és mondja el barátainak.

Edit1 Javítva a hibák, 2 videóra összpontosítva

Forrás: will.com

Hozzászólás