Wéi ech Docker bannent Docker lafen a wat erauskomm ass

Moien alleguer! A sengem fréieren Artikel, Ech hu versprach iwwer d'Lafen Docker am Docker ze schwätzen an déi praktesch Aspekter vun dëser Lektioun ze benotzen. Et ass Zäit Äert Verspriechen ze halen. En erfahrenen Devopser wäert wahrscheinlech protestéieren datt déi, déi Docker am Docker brauchen, einfach den Docker Daemon Socket vum Host an de Container weiderginn an dëst wäert an 99% vun de Fäll genuch sinn. Awer net presséiert fir Cookien op mech ze werfen, well mir schwätzen iwwer den Docker am Docker ze lafen. Dës Léisung huet vill méiglech Uwendungen an dësen Artikel ass iwwer ee vun hinnen, also sëtzt Iech zréck a riicht Är Waffen virun Iech.

Wéi ech Docker bannent Docker lafen a wat erauskomm ass

Den Ufank

Et huet alles ugefaang op engem verreenten Septemberowend, wéi ech d'Maschinn gebotzt hunn, déi ech fir $ 5 op Digital Ocean gelount hunn, déi gefruer gouf wéinst der Tatsaach datt Docker all 24 Gigabyte vun verfügbaren Disk Space mat senge Biller a Container gefëllt huet. D'Ironie war datt all dës Biller a Container transient waren a waren nëmme gebraucht fir d'Performance vu menger Applikatioun ze testen all Kéier wann eng nei Versioun vun enger Bibliothéik oder Kader verëffentlecht gouf. Ech hu probéiert Shell-Skripte ze schreiwen an e Cron-Zäitplang opzestellen fir Gerempels ze botzen, awer et huet net gehollef: all Kéier wann et zwangsleefeg opgehalen ass, datt mäi Server seng Disk Space giess gouf an de Server hänkt (am beschten). Irgendwann sinn ech en Artikel begéint iwwer wéi een Jenkins an engem Container ausféiert a wéi et ka bauen a läschen Pipelines duerch en Docker Daemon Socket, deen an et fortgeet. Ech hunn d'Iddi gär, awer ech hu beschloss méi wäit ze goen an ze experimentéieren mat direkten Docker bannent Docker ze lafen. Zu där Zäit huet et mir eng komplett logesch Léisung geschéngt fir Docker Biller erofzelueden an Container fir all Uwendungen ze kreéieren déi ech gebraucht hunn fir an engem anere Container ze testen (loosst eis et e Staging Container nennen). D'Iddi war en Inszenéierungscontainer mam Fändel -rm ze starten, deen automatesch de ganze Container an all säin Inhalt läscht wann en gestoppt gëtt. Ech hunn mam Docker Bild vum Docker selwer gepaff (https://hub.docker.com/_/docker), awer et huet sech ze ëmständlech erausgestallt an ech hunn et ni fäerdeg bruecht et esou ze schaffen wéi ech et gebraucht hunn an ech wollt de ganze Wee selwer goen.

Praxis. Kegel

Ech hu virgestallt fir de Container ze maachen wéi ech gebraucht hunn an hunn meng Experimenter weidergefouert, wat zu enger Onmass vu Knospe gefouert huet. D'Resultat vu menger Selbstfolter war de folgenden Algorithmus:

  1. Mir starten den Docker Container am interaktiven Modus.

    docker run --privileged -it docker:18.09.6

    Opgepasst op d'Versioun vum Container, Schrëtt riets oder lénks an Är DinD gëtt an e Kürbis. Tatsächlech briechen d'Saachen zimlech dacks wann eng nei Versioun verëffentlecht gëtt.
    Mir mussen direkt an d'Schuel kommen.

  2. Mir probéieren erauszefannen, wéi eng Container lafen (Äntwert: keng), awer loosst eis de Kommando souwisou ausféieren:

    docker ps

    Dir wäert e bëssen iwwerrascht sinn, awer et stellt sech eraus datt den Docker Daemon net emol leeft:

    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. Loosst eis et selwer lafen:

    dockerd &

    Eng aner onsympathesch Iwwerraschung:

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

  4. Installéiert d'iptables a bash Packagen (alles ass méi agreabel fir am bash ze schaffen wéi am sh):

    apk add --no-cache iptables bash

  5. Loosst eis bash starten. Endlech si mir erëm an der üblecher Schuel

  6. Loosst eis probéieren den Docker erëm ze starten:

    dockerd &

    Mir sollten e laange Blat vu Logbicher gesinn, déi mat:

    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. Press Enter. Mir sinn zréck an de Bash.

Vun elo un kënne mir probéieren aner Container an eisem Docker Container ze lancéieren, awer wat wa mir en aneren Docker Container an eisem Docker Container wëllen starten oder eppes geet falsch an de Container crasht? Fänkt alles erëm un.

Eegent DinD Container an nei Experimenter

Wéi ech Docker bannent Docker lafen a wat erauskomm ass
Fir ze vermeiden déi uewe genannte Schrëtt ëmmer erëm ze widderhuelen, hunn ech mäin eegenen DinD Container erstallt:

https://github.com/alekslitvinenk/dind

Déi funktionéierend DinD Léisung huet mir d'Fäegkeet ginn Docker bannent Docker rekursiv ze lafen a méi abenteuerlech Experimenter ze maachen.
Ech wäert een esou (erfollegräich) Experiment beschreiwen mam Lafen MySQL an Nodejs elo.
Déi Ongedëllegst ka gesinn wéi et hei war

Also, loosst eis ufänken:

  1. Mir starten DinD am interaktive Modus. An dëser Versioun vum DinD musse mir all d'Ports manuell kartéieren déi eis Kannerbehälter kënne benotzen (ech schaffen schonn un dësem)

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

    Mir kommen an de Bash, vu wou mir direkt kënnen ufänken Kannercontainer ze lancéieren.

  2. MySQL starten:

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

  3. Mir konnektéieren op d'Datebank op déiselwecht Manéier wéi mir lokal dorop verbannen. Loosst eis sécherstellen datt alles funktionnéiert.

  4. Start den zweeten Container:

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

    Notéiert w.e.g. datt d'Portmapping genee wäert sinn 8080:8080, well mir schonn den Hafen 80 vum Host an den Elterendeel op den Hafen 8080 mapéiert hunn.

  5. Mir ginn op localhost am Browser, gitt sécher datt de Server "Hallo Welt!"

A mengem Fall ass d'Experiment mat Nested Docker Container ganz positiv erausgestallt an ech wäert de Projet weider entwéckelen an et fir d'Inszenéierung benotzen. Et schéngt mir datt dëst eng vill méi liicht Léisung ass wéi Kubernetes a Jenkins X. Awer dëst ass meng subjektiv Meenung.

Ech mengen dat ass alles fir den Artikel vun haut. Am nächsten Artikel wäert ech méi detailléiert Experimenter beschreiwen mat Docker rekursiv an Docker ze lafen an Verzeechnes déif an nested Container ze montéieren.

PS Wann Dir dëse Projet nëtzlech fannt, gitt w.e.g. e Stär op GitHub, gitt et a sot Äre Frënn.

Editéieren 1 Korrigéiert Feeler, fokusséiert op 2 Videoen

Source: will.com

Setzt e Commentaire