Docker -kép létrehozása a Scratch -ből

Creating Docker Image From Scratch



A Docker fő előnye bármely más tárolótechnológiával szemben az, hogy a Docker a fejlesztőket és azok felhalmozott alkalmazásait célozza meg. Míg a megfelelő konténeres technológiák, mint pl LXC , Zónák és Börtönök műveletek szempontjából céloznak meg, vagy egyszerűen leegyszerűsítve ezek a platformok helyettesítik a felhőben futó virtuális gépeket. Ahol a Docker helyettesíti a csomagokat és a futtatható bináris fájlokat.

Lazán szólva a Docker egyre inkább olyan, mint egy univerzális csomagkezelő, amely minden lehetséges Linux platformon működik. Tartályokat vesz fel, és ezek segítségével egy teljesen más problémát old meg, amellyel a fejlesztők szembesülnek. A probléma az, hogy a fejlesztők asztali operációs rendszerüket használják (például Windows, macOS vagy Linux, rengeteg asztali csomaggal) alkalmazások írásához. Az általuk írt alkalmazás gyakran egy teljesen más operációs rendszeren fut egy szerveren, valahol valami más Linux -disztribúcióval, mint a fejlesztő laptopja.







A Dockerrel az ötlet az, hogy az alkalmazás Docker képként kerül csomagolásra. A Docker feladata, hogy elkészítse ezt a képet, és tárolt alkalmazásként futtassa. A konténerbe helyezés azt jelenti, hogy az alkalmazás és annak függőségei elszigetelt környezetben fognak futni, amely teljesen eltérhet a fejlesztő laptopjától és még a termelési szervertől is. Mindaddig, amíg mindketten támogatják a Dockert, mindketten pontosan ugyanazt az alkalmazást futtathatják.



Egy dokkoló kép anatómiája

Amint korábban említettük, a Docker alkalmazás megegyezett környezetben fog futni. A kérdés most az, hogyan hozzuk létre ezt a környezetet? A legtöbb alkalmazáskép Docker alapképet importálna, és ráépítené az alkalmazását.



Az alkalmazások szoftverrétegekből készülnek. A wordpress tároló képe egy httpd tárolókép használatával épül fel, amely viszont egy Ubuntu kép tetejére épül. Az a kép, amelyre egy újabb kép épül, a Docker terminológiában PARENT IMAGE néven ismert. A Dockerfile -ban (egy kicsit később megtudjuk, mit jelent a Dockerfile) ez a szülőkép szerepel a fájl tetején, az alábbiak szerint:





Ubuntu -ból: 18.04
## A Dockerfile többi része

Ez a Dockerfile végrehajtáskor átalakítja az alkalmazást Docker -képpé (egyfajta bináris formátumba), amelyet ezután egy rendszerleíró adatbázisba helyezhet, ahonnan lehúzva új tárolókat hozhat létre máshol. Mindazonáltal mindegyiküknek az Ubuntu: 18.04 lesz az alapképe, és úgy futnak, mintha egy Ubuntu rendszer lenne, amelyben futnak.

Ezt észrevehette, amikor új dokkolói képet akart lekérni.



Docker -kép létrehozása a Scratch -ből

Ez megmutatja, hogy hány réteget húz le, mielőtt beviszi a tényleges alkalmazást (amely csak néhány megabájt lehet).

Ezért szeretnénk létrehozni az úgynevezett alapképet. Ami nem másra épül. A scratch kulcsszó azt jelzi, hogy ez a réteg nem épül másra. Például így:

A semmiből
## A Dcokerfile többi része

Először létrehozunk egy egyszerű hello-world alkalmazást, majd kitaláljuk, hogy mi lesz a Dockerfile többi része. A gazdarendszer Ubuntu: 18.04 LTS, és a kísérlethez a Docker 17.12.1-ce verzióját használjuk.

Statikus bináris létrehozása

A Docker konténerek az operációs rendszer többi részétől elszigetelten futó folyamatok gyűjteménye. Az egyetlen dolog, amellyel a folyamat kapcsolatban áll, a kernel. A Kernel felelős ezen folyamatok CPU -n történő ütemezéséért, memóriakezelésért és néhány egyéb alapvető foglalási feladatért.

De a legtöbb magas szintű alkalmazás sok rendszerkönyvtártól függ (pl glibc, musl, klibc, stb ) és sok futásidejű függőség, például a Python vagy a Node.js vagy a Java Runtime. A bináris alkalmazás nem rendelkezik minden könyvtárral, de amikor elindítja a végrehajtást, meghívja ezeket a könyvtárakat a gazda operációs rendszerből.

Mivel a semmiből próbálunk képet alkotni, nem kapnánk meg ezeket a finomságokat. Tehát alkalmazásunknak statikus fájlnak vagy önálló végrehajtható fájlnak kell lennie.

Kezdjük azzal, hogy létrehozunk egy MyDockerImage nevű mappát, és létrehozunk egy hello.cc fájlt.

$mkdirMyDockerImage
$CDMyDockerImage
$érintéshello.cc

Nyissa meg a hello.cc alkalmazást kedvenc szövegszerkesztőjével, és adja hozzá a következő sorokat.

#befoglalni
névtér standard használatával;
intfő-(){
költség<< 'Helló! Ez az üzenet egy tárolóból érkezik n';
Visszatérés 0;

}

Ez egy egyszerű C ++ program, amely Hello! Ez az üzenet …

A korábban tárgyalt okokból ezt a statikus zászló használatával állítjuk össze. A használt fordító az g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

A program fordításához futtassa a következő parancsot ugyanabban a könyvtárban:

$ g++ -o hello-statikusHelló.DC

Ez egy bináris futtatható fájlt hoz létre ugyanabban a könyvtárban. Ez a statikus fájlunk. Ellenőrizze, hogy megfelelően működik -e a fájlnév megemlítésével a terminálon.

$./Helló

Most készen állunk arra, hogy konténerbe rakjuk ezt az egyszerű programot.

Dockerfile

A Dockerfile olyan szabálykészletből áll, amely az alkalmazásfájlokat (például bináris fájlokat, forrásfájlokat stb.), Valamint a különböző konfigurációs paramétereket, például a fájlrendszer -elrendezést, a kitett portokat stb. Tartalmazza, és Docker -képfájlmá alakítja őket. Ezután megoszthatja a képfájlt mindenkivel, aki futtatni szeretné az alkalmazást.

Nem fogunk mélyedni a Dockerfile számára rendelkezésre álló összes lehetőségben, hanem egy nagyon minimalista Dockerfile -t fogunk írni. Ugyanebben a könyvtárban, ahol a hello végrehajtható fájl található, hozzon létre egy üres fájlt Dockerfile.

$érintésDockerfile

Nyissa meg kedvenc szövegszerkesztőjével, és írja be a következő sorokat:

A semmiből
ADD hello/
CMD['/Helló']

karcolás nem szülői kép. Inkább azt jelzi a Docker számára, hogy a kép nem más kép tetejére épül. A semmiből épül fel. Az ADD parancs leveszi a statikus bináris | _+_ | nevet az aktuális könyvtárból, és hozzáadja a képfájl gyökérkönyvtárához. Amikor végre elindítunk egy tárolót ezen kép alapján, a hello futtatható fájl megjelenik a gyökérkönyvtárban | _+_ |

Végül, a CMD sorban van egy karakterlánc /Helló ez a karakterlánc shell parancsként fog végrehajtódni, amikor egy tárolót hoznak létre ebből a képből, tehát a bináris fájlból, amelyet hozzáadtunk a tárolónkhoz, és kinyomtatjuk az alkalmazásunkban írt üzenetet.

Építsük fel a képet a dokkoló épít parancs, amely átmegy a Dockerfile tartalmán, és létrehozza a képet. Futtassa a következő parancsot ugyanabban a könyvtárban, mint a Dockerfile és a futtatható bináris fájl.

$dokkoló épít--címkeHelló .

Az - üdvözlöm zászló a kép nevét erre állítja Helló és a pont ( . ) a végén elmondja dokkoló épít keresse meg a Dockerfile és a kapcsolódó tartalmak aktuális könyvtárát.

A Docker tároló futtatása

Ha ellenőrizni szeretné, hogy az imént létrehozott kép megjelenik -e a képek listájában, futtassa:

$dokkoló képek

Figyeld meg, milyen kicsi a hello kép más képekhez képest. Mindenesetre készen áll a tartályként való futtatásra,

$dokkoló sziasztok

Ez az! Az első minimalista tárolót a semmiből hozta létre.

Egyéb opciók

Bár a képek létrehozása a semmiből mindig opció, az emberek gyakran hajlamosak más könnyű Linux disztribúciókból létrehozni képeket. Például az olyan képek, mint az alpesi és a busybox nagyon könnyű környezet, kisebb könyvtárakkal, mint a musl, a glibc helyett.

Használja őket szülői képként a használatával FROM alpesi: legújabb kisebb képeket is eredményezne. Mivel az alapképek csak 2-5 MB méretűek. Tájékoztasson bennünket, ha van olyan Dockerrel kapcsolatos téma, amelyet szeretne, ha legközelebb foglalkozunk. Elérhet minket Twitter , Facebook vagy iratkozzon fel nekünk e -mailben.