Skapa en Docker -bild från Scratch

Creating Docker Image From Scratch



Den största fördelen med Docker jämfört med någon annan containeriseringsteknik är att Docker riktar sig till utvecklare och deras uppstackapplikationer. Medan rätt containeriseringsteknik gillar LXC , Zoner och Fängelser är inriktade ur ett operativa perspektiv, eller, för att uttrycka det enkelt, dessa plattformar är ett substitut för virtuella maskiner som körs på molnet. Där är Docker ett substitut för paket och körbara binärer.

Löst sett blir Docker mer och mer som en universell pakethanterare som fungerar på alla möjliga Linux -plattformar. Det tar behållare och använder dem för att lösa ett helt annat problem som utvecklare står inför. Problemet är att utvecklare använder sitt stationära operativsystem (som Windows, macOS eller Linux med massor av skrivbordsrelaterade paket) för att skriva applikationer. Programmet de skriver körs ofta på ett helt annat operativsystem på en server någonstans med någon Linux -distribution helt annorlunda än utvecklarens bärbara dator.







Med Docker är tanken att din applikation kommer packad som en Docker -bild. Det är Dockers jobb att ta den här bilden och köra den som en containeriserad applikation för dig. Att vara containeriserad innebär att applikationen och dess beroenden kommer att köras i en isolerad miljö som kan skilja sig helt från utvecklarens bärbara dator och till och med produktionsservern. Så länge de båda stöder Docker kan de båda köra samma applikation på exakt samma sätt.



Anatomi av en Docker -bild

Som nämnts tidigare körs en Docker -app i en överenskommen miljö. Nu är frågan hur skapar vi den miljön? De flesta applikationsbilder skulle importera en Docker -basbild och bygga sin applikation ovanpå den.



Ansökningar är gjorda av lager av programvara. En wordpress -behållaravbildning byggs med en httpd -behållaravbildning som i sin tur byggs ovanpå en Ubuntu -bild. Bilden på vilken en nyare bild är byggd är känd som FÖRÄLDRBILD i Docker -terminologi. I Dockerfile (vi kommer till vad en Dockerfile betyder, lite senare) nämns denna överordnade bild högst upp i filen enligt nedan:





FRÅN Ubuntu: 18.04
## Resten av Dockerfilen

Denna Dockerfile när den körs omvandlar din applikation till en Docker -avbild (en binär av olika slag) som du sedan kan flytta till ett register varifrån den kan dras för att skapa nya behållare någon annanstans. De kommer dock alla att ha Ubuntu: 18.04 som basbild, och köra som om det är ett Ubuntu -system som de körs i.

Du kanske har märkt detta när du försöker dra en ny dockningsbild.



Skapa Docker Image från Scratch

Detta visar hur många lager som dras innan den faktiska applikationen (som kan vara endast några megabyte stor) tas in.

Av denna anledning skulle vi vilja skapa det som kallas en basbild. Som inte är byggd ovanpå något annat. Nyckelordet scratch används för att indikera att detta lager inte är byggt ovanpå något annat. Såhär:

Från början
## Resten av Dcokerfilen

Vi kommer först att skapa en enkel hello-world-applikation och sedan ta reda på vad resten av Dockerfilen kommer att bli. Värdsystemet är Ubuntu: 18.04 LTS och vi använder Docker version 17.12.1-ce för experimentet.

Skapa en statisk binär

Dockerbehållare är en samling processer som körs isolerade från resten av operativsystemet. Det enda som processen är i kontakt med är kärnan. Kernel ansvarar för att schemalägga dessa processer på CPU: n, göra minneshantering och några andra grundläggande bokningsuppgifter.

Men de flesta applikationer på hög nivå beror på många systembibliotek (som glibc, musl, klibc, etc. ) och många körtidsberoende som Python eller Node.js eller Java Runtime. Programbinären har inte alla tillgängliga bibliotek i den, men när den börjar köras anropar den biblioteken från värdoperativsystemet.

Eftersom vi försöker skapa en bild från grunden, skulle vi inte få dessa trevligheter. Så vår applikation måste vara en statisk fil eller en fristående körbar.

Låt oss börja med att skapa en mapp som heter MyDockerImage och skapa en fil hello.cc inuti den.

$mkdirMyDockerImage
$CDMyDockerImage
$Rörhej.cc

Öppna hello.cc med din favorittextredigerare och lägg till följande rader i den.

#omfatta
med namnutrymme std;
inthuvud(){
kosta<< 'Hej! Det här meddelandet kommer från en behållare n';
lämna tillbaka 0;

}

Detta är ett enkelt C ++ - program som skriver ut Hej! Det här meddelandet …

Av skäl som diskuterats tidigare kommer vi att sammanställa detta med hjälp av den statiska flaggan. Kompilatorn som används är g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

För att kompilera programmet kör du följande kommando i samma katalog:

$ g++ -o hej-statiskHej.DC

Detta skapar en binär körbar fil hej i samma katalog. Det är vår statiska fil. Testa om det körs som avsett genom att nämna filnamnet i terminalen.

$./Hej

Nu är vi redo att containerisera detta enkla program.

Dockerfile

Dockerfilen består av en uppsättning regler som tar dina applikationsfiler (som binärer, källfiler, etc.) tillsammans med olika konfigurationsparametrar som filsystemlayout, exponerade portar etc och gör dem till en Docker -bildfil. Du kan sedan dela bildfilen med alla som vill köra det programmet.

Vi kommer inte att gräva i alla tillgängliga alternativ för Dockerfile, istället skriver vi en mycket minimalistisk Dockerfile. Skapa en tom fil med namnet i samma katalog, där din körbara hello finns Dockerfile.

$RörDockerfile

Öppna den med din favorittextredigerare och skriv följande rader till den:

Från början
LÄGG TILL hej/
CMD['/Hej']

repa är inte en förälderbild. Det indikerar snarare Docker att bilden inte är byggd ovanpå någon annan bild. Den är byggd från grunden. ADD -kommandot skulle ta den statiska binära namnet | _+_ | från den aktuella katalogen och lägga till den i rotkatalogen för bildfilen. När vi äntligen skulle köra en behållare baserad på den här bilden, kommer den hej körbara filen att ses inuti själva rotkatalogen på | _+_ |

Slutligen har CMD -raden en sträng /Hej den här strängen kommer att köras som ett skalkommando när en behållare skapas från den här bilden, alltså den binära filen som vi lade till i vår behållare och skriva ut meddelandet som vi skrev i vår app.

Låt oss bygga bilden genom att åberopa dockningsbyggnad kommando som skulle gå igenom Dockerfilens innehåll och generera bilden. Kör följande kommando i samma katalog som Dockerfilen och den körbara binären.

$dockningsbyggnad--märkaHej .

De –Tag hej flag anger bildnamnet till Hej och pricken ( . ) i slutet berättar dockningsbyggnad för att titta på den aktuella katalogen för Dockerfile och relaterat innehåll.

Kör Docker -behållaren

För att kontrollera om bilden vi just skapade visas i listan över bilder, kör:

$dockningsbilder

Lägg märke till hur liten hallåbilden är jämfört med andra bilder. Det är i alla fall redo att köras som en behållare,

$docker kör hej

Det är allt! Du skapade din första minimalistiska behållare från grunden.

Andra alternativ

Även om det alltid är ett alternativ att skapa bilder från grunden, tenderar människor ofta att skapa bilder från andra lätta Linux -distros. Till exempel är bilder som alpine och busybox verkligen lätta miljöer med mindre bibliotek som musl istället för glibc.

Använd dem som din förälderbild med FRÅN alpint: senaste skulle resultera i mindre bilder också. Eftersom basbilderna bara är 2-5 MB stora. Låt oss veta om det finns något Docker -relaterat ämne som du kanske vill att vi ska behandla härnäst. Du kan nå oss på Twitter , Facebook eller prenumerera på oss via e -post.