Opprette et Docker -bilde fra bunnen av

Creating Docker Image From Scratch



Den største fordelen med Docker fremfor annen containeriseringsteknologi er at Docker er rettet mot utviklere og deres upstack -applikasjoner. Mens den riktige containeriseringsteknologien liker LXC , Soner og Fengsler er målrettet fra et operasjonsperspektiv, eller for å si det enkelt, disse plattformene er en erstatning for virtuelle maskiner som kjører på nettskyen. Hvor som helst er Docker en erstatning for pakker og kjørbare binære filer.

Løst sett blir Docker mer og mer som en universell pakkeleder som fungerer på tvers av alle mulige Linux -plattformer. Den tar containere og bruker dem til å løse et helt annet problem som utviklere står overfor. Problemet er at utviklere bruker sitt stasjonære operativsystem (som Windows, macOS eller Linux med tonnevis med skrivebordsrelaterte pakker) for å skrive applikasjoner. Programmet de skriver kjører ofte på et helt annet operativsystem på en server et sted med litt Linux -distribusjon helt annerledes enn utviklerens bærbare datamaskin.







Med Docker er tanken at applikasjonen din kommer pakket som et Docker -bilde. Det er Docker sin jobb å ta dette bildet og kjøre det som en containerisert applikasjon for deg. Å være containerisert betyr at applikasjonen og dens avhengigheter vil kjøre i et isolert miljø som kan avvike helt fra utviklerens bærbare datamaskin og til og med produksjonsserveren. Så lenge de begge støtter Docker, kan de begge kjøre den samme applikasjonen på nøyaktig samme måte.



Anatomi av et Docker -bilde

Som nevnt tidligere, vil en Docker -app kjøre på et avtalt miljø. Nå er spørsmålet hvordan vi skaper det miljøet? De fleste applikasjonsbilder vil importere et Docker -basisbilde og bygge programmet på toppen av det.



Søknader er laget av lag med programvare. Et wordpress -beholderbilde er bygget ved hjelp av et httpd -beholderbilde, som igjen er bygget på toppen av et Ubuntu -bilde. Bildet som et nyere bilde er bygget på er kjent som FORELDERBILDET i Docker -terminologi. I Dockerfile (vi kommer til hva en Dockerfile betyr, litt senere), nevnes dette overordnede bildet øverst i filen som vist nedenfor:





FRA Ubuntu: 18.04
## Resten av Dockerfilen

Denne Dockerfilen, når den kjøres, konverterer applikasjonen din til et Docker -bilde (en binær av slags) som du deretter kan skyve til et register hvorfra den kan trekkes for å lage nye beholdere andre steder. Imidlertid vil de alle ha Ubuntu: 18.04 som hovedbilde, og kjøre som om det er et Ubuntu -system de kjører i.

Du har kanskje lagt merke til dette når du prøver å trekke et nytt dockerbilde.



Opprette Docker Image fra Scratch

Dette viser hvor mange lag som trekkes før selve applikasjonen (som kan være bare noen få megabyte) blir brakt inn.

Av denne grunn ønsker vi å lage det som er kjent som et grunnbilde. Som ikke er bygget oppå noe annet. Søkeordet scratch brukes til å indikere at dette laget ikke er bygget på toppen av noe annet. Som så:

Fra bunnen av
## Resten av Dcoker -filen

Vi skal først lage en enkel hallo-verden-applikasjon og deretter finne ut hva resten av Dockerfilen kommer til å være. Vertssystemet er Ubuntu: 18.04 LTS, og vi bruker Docker versjon 17.12.1-ce for eksperimentet.

Opprette en statisk binær

Docker -containere er en samling prosesser som kjører isolert fra resten av operativsystemet. Det eneste prosessen er i kontakt med er kjernen. Kernel er ansvarlig for å planlegge disse prosessene på CPU, utføre minnestyring og noen få andre grunnleggende oppbevaringsoppgaver.

Men de fleste applikasjoner på høyt nivå er avhengige av mange systembiblioteker (som glibc, musl, klibc, etc. ) og mange kjøretidsavhengigheter som Python eller Node.js eller Java Runtime. Den binære applikasjonen har ikke alle bibliotekene tilgjengelig i den, men når den starter utførelsen, kaller den bibliotekene fra vertsoperativsystemet.

Fordi vi prøver å lage et bilde fra bunnen av, ville vi ikke få disse finhetene. Så applikasjonen vår må være en statisk fil eller en frittstående kjørbar.

La oss starte med å lage en mappe som heter MyDockerImage og lage en hello.cc -fil inne i den.

$mkdirMyDockerImage
$CDMyDockerImage
$ta påhei.cc

Åpne hello.cc ved å bruke din favoritt tekstredigerer, og legg til følgende linjer i den.

#inkludere
ved hjelp av navneområde std;
inthoved-(){
koste<< 'Hallo! Denne meldingen kommer fra en beholder n';
komme tilbake 0;

}

Dette er et enkelt C ++ - program som skriver ut Hello! Denne meldingen …

Av årsaker diskutert tidligere, vil vi kompilere dette ved hjelp av det statiske flagget. Kompilatoren som brukes er g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

For å kompilere programmet, kjør følgende kommando i den samme katalogen:

$ g++ -o hei-statiskHallo.DC

Dette oppretter en binær kjørbar fil hei i den samme katalogen. Det er vår statiske fil. Test om det kjører etter hensikten ved å nevne filnavnet i terminalen.

$./Hallo

Nå er vi klare til å containere dette enkle programmet.

Dockerfile

Dockerfilen består av et sett med regler som tar applikasjonsfilene dine (som binære filer, kildefiler, osv.) Sammen med forskjellige konfigurasjonsparametere som filsystemoppsett, eksponerte porter osv. Og gjør dem til en Docker -bildefil. Du kan deretter dele bildefilen med alle som ønsker å kjøre programmet.

Vi vil ikke grave i alle tilgjengelige alternativer for Dockerfile, i stedet vil vi skrive en veldig minimalistisk Dockerfile. Opprett en tom fil med navnet i den samme katalogen der den kjørbare filen ligger Dockerfile.

$ta påDockerfile

Åpne den med din favoritt tekstredigerer, og skriv følgende linjer til den:

Fra bunnen av
Legg til hei/
CMD['/Hallo']

ripe er ikke et forelderbilde. Det indikerer snarere Docker at bildet ikke er bygget oppå noe annet bilde. Den er bygget fra bunnen av. ADD -kommandoen ville ta den statiske binæren | _+_ | fra den nåværende katalogen og legge den til rotkatalogen til bildefilen. Når vi endelig skulle kjøre en beholder basert på dette bildet, vil den kjørbare hallo bli sett inne i selve rotkatalogen på | _+_ |

Til slutt har CMD -linjen en streng /Hallo denne strengen vil bli utført som en skallkommando når en beholder opprettes fra dette bildet, og dermed den binære filen som vi la til i beholderen vår og skrive ut meldingen som vi skrev i appen vår.

La oss bygge bildet ved å påkalle docker -bygg kommando som skulle gå gjennom Dockerfilens innhold og generere bildet. Kjør følgende kommando i samme katalog som Dockerfile og den kjørbare binæren.

$docker -bygg--stikkordHallo .

De –Tag hei flag angir bildenavnet til Hallo og prikken ( . ) på slutten forteller docker -bygg for å se på den nåværende katalogen for Dockerfile og relatert innhold.

Kjører Docker -beholderen

For å sjekke om bildet vi nettopp har opprettet, vises i listen over bilder, kjører du:

$docker -bilder

Legg merke til hvor lite hei -bildet er sammenlignet med andre bilder. Uansett er den klar til å kjøres som en beholder,

$docker run hallo

Det er det! Du opprettet din første minimalistiske beholder fra bunnen av.

Andre muligheter

Selv om det alltid er et alternativ å lage bilder fra bunnen av, har folk ofte en tendens til å lage bilder fra andre lette Linux -distroer. For eksempel er bilder som alpine og busybox virkelig lette miljøer med mindre biblioteker som musl i stedet for glibc.

Bruk dem som ditt foreldrebilde ved å bruke FRA alpint: siste ville også resultere i mindre bilder. Siden basisbildene bare er 2-5 MB i størrelse. Gi oss beskjed om det er noe Docker -relatert emne som du kanskje vil at vi skal dekke neste. Du kan nå oss på Twitter , Facebook eller abonnere på oss via e -post.