Docker fra bakken Bygg bilder

Dockercontainere stiger som en god praksis for distribusjon og styring av cloud-native distribuerte systemer. Beholdere er forekomster av Docker-bilder. Det viser seg at det er mye å vite og forstå om bilder. 

I denne todelte opplæringen dekker jeg Docker-bilder i dybden. I del ett diskuterte jeg de grunnleggende prinsippene, designhensyn, og inspeksjon av bildeplaner. I denne delen dekker jeg å bygge dine egne bilder, feilsøking og jobbe med bildebeholdere. 

Når du kommer ut på den andre siden, har du en solid forståelse av hva Docker-bilder er akkurat og hvordan du kan bruke dem effektivt i dine egne applikasjoner og systemer.

Bygge bilder

Det er to måter å bygge bilder på. Du kan endre og eksisterende container og deretter begå den som et nytt bilde, eller du kan skrive en Dockerfil og bygge den til et bilde. Vi går over begge deler og forklarer fordeler og ulemper.

Manuelle bygg

Med manuelle bygg, behandler du beholderen som en vanlig datamaskin. Du installerer pakker, skriver filer, og når det er alt sagt og gjort, forplikter du det og ender opp med et nytt bilde som du bruker som en mal for å lage mange flere identiske beholdere eller til og med base andre bilder på.

La oss starte med det alpine bildet, som er et veldig lite og spartansk bilde basert på Alpine Linux. Vi kan kjøre den i interaktiv modus for å komme inn i et skall. Vårt mål er å legge til en fil som heter "ja" som inneholder teksten "det virker!" til rotkatalogen og deretter opprette et nytt bilde fra det kalt "yeah-alpine". 

Her går vi. Fint, vi er allerede i roten dir. La oss se hva som er der.

> docker kjøre-en alpin / bin / sh / # ls bin dev etc hjem lib linuxrc media mnt proc root run sbin srv ss tmp usr var

Hvilken redaktør er tilgjengelig? Ingen vim, ingen nano?

/ # vim / bin / sh: vim: ikke funnet / # nano / bin / sh: nano: ikke funnet

Jaja. Vi vil bare lage en fil:

/ # echo "det virker!" > ja / # cat ja det virker! 

Jeg forlot det interaktive skallet, og jeg kan se beholderen som heter "vibrant_spenc" med docker ps --all. De --alle flagg er viktig fordi beholderen ikke løper lenger.

> docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS NAVN c8faeb05de5f alpine "/ bin / sh" 6 minutter siden avsluttet vibrant_spence

Her lager jeg et nytt bilde fra "vibrate_spence" -beholderen. Jeg har lagt til meldingen "Mine, mine, mine" for godt mål.

> docker commit -m "min, min, min" vibrant_spence yeah-alpine sha256: e3c98cd21f4d85a1428 ... e220da99995fd8bf6b49aa

La oss sjekke det ut. Ja, det er et nytt bilde, og i sin historie kan du se et nytt lag med "min, min, min" kommentaren.

> docker bilder REPOSITORY TAG IMAGE ID STØRRELSE ja-alpine nyeste e3c98cd21f4d 4.8 MB python siste 775dae9b960e 687 MB d4w / nsenter nyeste 9e4f13a0901e 83,8 kB ubuntu-med-ssh siste 87391dca396d 221 MB ubuntu nyeste bd3d4369aebc 127 MB hello-world nyeste c54a2cc56cbb 1,85 kB alpine nyeste 4e38e38c8ce0 4.8 MB nsqio / nsq siste 2a82c70fe5e3 70.7 MB> dockerhistorie yeah-alpine IMAGE CREATED SIZE COMMENT e3c98cd21f4d 40 sekunder siden 66 B mine, mine, min 4e38e38c8ce0 7 måneder siden 4.8 MB

Nå for den virkelige testen. La oss slette beholderen og opprette en ny beholder fra bildet. Det forventede resultatet er at "ja" -filen vil være til stede i den nye beholderen.

> docker rm vibrant_spence vibrant_spence> docker kjøre -i yeah-alpine / bin / sh / # cat ja det virker! / #

Hva kan jeg si? Ja, det virker!

Bruke en dockerfil

Å lage bilder ut av modifiserte beholdere er kult, men det er ingen ansvar. Det er vanskelig å holde rede på endringene og vite hva de spesifikke endringene var. Den disiplinerte måten å lage bilder på er å bygge dem med en Dockerfile.

Dockerfilen er en tekstfil som ligner på et shell-skript, men det støtter flere kommandoer. Hver kommando som endrer filsystemet skaper et nytt lag. I del ett diskuterte vi viktigheten av å dele bildet ditt riktig i lag. Dockerfilen er et stort tema i seg selv. 

Her skal jeg bare vise et par kommandoer for å lage et annet bilde, "oh-yeah-alpine", basert på en Dockerfile. I tillegg til å lage den beryktede "ja" -filen, la oss også installere vim. Den alpine Linux-distribusjonen bruker et pakkehåndteringssystem kalt "apk". Her er Dockerfilen:

FRA alpin # Kopier "ja" filen fra verten COPY ja / ja # Oppdater og installer vim ved hjelp av apk RUN apk oppdatering && apk legg til vim CMD cat / yeah

Basebildet er alpint. Den kopierer "ja" -filen fra samme vertskatalog hvor Dockerfile er (byggekontekstbanen). Så løper det apk oppdatering og installerer vim. Endelig setter den kommandoen som utføres når beholderen går. I dette tilfellet vil det skrive ut på skjermen innholdet i "ja" -filen.

OK. Nå som vi vet hva vi kommer inn, la oss bygge denne tingen. Alternativet "-t" setter depotet. Jeg angav ikke en tagg, så det vil være standard "siste".

> docker bygge -t oh-yeah-alpine. Sende byggekontekst til Docker daemon 3.072 kB Trinn 1/4: FRA alpin ---> 4e38e38c8ce0 Trinn 2/4: COPY ja / yeah ---> 1b2a228cc2a5 Fjerne mellombeholder a6221f725845 Trinn 3/4: RUN oppdatering && apk legg til vim ---> Kjører i e2c0524bd792 hente http://dl-cdn.alpinelinux.org/.../APKINDEX.tar.gz hente http: //dl-cdn.alpinelinux.org.../x86_64/APKINDEX.tar.gz v3. 4.6-60-gc61f5bf [http://dl-cdn.alpinelinux.org/alpine/v3.4/main] v3.4.6-33-g38ef2d2 [http://dl-cdn.alpinelinux.org/.../v3. 4 / community] OK: 5977 forskjellige pakker tilgjengelig (1/5) Installere lua5.2-libs (5.2.4-r2) (2/5) Installere ncurses-terminfo-base (6.0-r7) (3/5) Installere ncurses-terminfo (6.0-r7) (4/5) Installere ncurses-libs (6.0-r7) (5/5) Installere vim (7.4.1831-r2) Utføre busybox-1.24.2-r9.trigger OK: 37 MiB i 16 pakker ---> 7fa4cba6d14f Fjerne mellombeholder e2c0524bd792 Trinn 4/4: CMD cat / yeah ---> Kjører i 351b4f1c1eb1 ---> e124405f28f4 Fjerne mellombeholder 351b4f1c1eb1 Successf ully bygget e124405f28f4

Ser bra ut. La oss bekrefte at bildet ble opprettet:

> docker bilder | grep oh-yeah oh-yeah-alpine siste e124405f28f4 Om et minutt siden 30,5 MB

Legg merke til hvordan installering av vim og dens avhengigheter oppsvarte størrelsen på beholderen fra 4.8MB av base alpine bildet til en massiv 30.5MB!

Det er veldig bra. Men fungerer det?

> Docker kjøre oh-yeah-alpine det fungerer!

Oh, det virker!

Hvis du fortsatt er mistenksom, la oss gå inn i beholderen og undersøke "ja" -filen med vår nyinstallerte vim.

> docker kjøre-en oh-yeah-alpine / bin / sh / # vim ja det virker! ~ ~ ... ~ "ja" 1L, 10C

Byggkonteksten og .dockerignore-filen

Jeg fortalte deg ikke, men opprinnelig da jeg prøvde å bygge oh-yeah-alpine bildet, hang det bare i flere minutter. Problemet var at jeg bare satte Dockerfile i min hjemmekatalog. Når Docker bygger et bilde, pakker det først hele katalogen der Dockerfile er (inkludert underkataloger) og gjør det tilgjengelig for COPY-kommandoer i Dockerfile. 

Docker forsøker ikke å være smart og analysere dine COPY-kommandoer. Det pakker bare hele greia. Legg merke til at byggeinnholdet ikke slutter i bildet ditt, men det vil redusere byggekommandoen din hvis din kontekst er unødvendig stor.

I dette tilfellet kopierte jeg bare Dockerfile og "yeah" til en underkatalog og kjørte kommandoen for dockerbygging i den underkatalogen. Men noen ganger har du et komplisert katalogtreet der du vil kopiere bestemte underkataloger og filer og ignorere andre. Skriv inn .dockerignore-filen. 

Denne filen lar deg kontrollere nøyaktig hva som går inn i byggekonteksten. Mitt favoritttrick er å først utelukke alt og så begynne å inkludere biter og stykker jeg trenger. For eksempel, i dette tilfellet kunne jeg opprette følgende .dockerignore-fil og holde Docker-filen og "Ja" i min hjemmekatalog:

# Unntatt ALLE først * # Nå inneholder selektivt ting! Ja

Det er ikke nødvendig å inkludere selve "Dockerfilen" eller ".dockerignore" -filen i byggekonteksten.

Kopiering versus montering

Kopiering av filer til bildet er noen ganger det du trenger, men i andre tilfeller vil du kanskje at beholderne skal være mer dynamiske og arbeide med filer på verten. Dette er hvor volumer og fester kommer inn i spill. 

Montering av verts kataloger er et annet ballspill. Dataene eies av verten og ikke av containeren. Dataene kan endres når beholderen er stoppet. Den samme beholderen kan startes med forskjellige verts kataloger montert.

Merking av bilder

Merking av bilder er svært viktig hvis du utvikler et microservices-basert system, og du genererer mange bilder som noen ganger må være knyttet til hverandre. Du kan legge til så mange koder som du vil ha et bilde. 

Du har allerede sett standard "siste" taggen. Noen ganger er det fornuftig å legge til andre koder, som "testet", "release-1.4" eller git-forpliktelsen som tilsvarer bildet.

Du kan merke et bilde under en bygning eller senere. Slik legger du til en etikett i et eksisterende bilde. Legg merke til at mens det kalles en tag, kan du også tildele et nytt lager.

> docker tag oh-yeah-alpine oh-yeah-alpine: cool-tag> docker tag oh-yeah-alpine oh-yeah-alpine-2> docker bilder | grep oh-yeah oh-yeah-alpine-2 siste e124405f28f4 30.5 MB oh-yeah-alpine cool-tag e124405f28f4 30,5 MB oh-yeah-alpine nyeste e124405f28f4 30,5 MB

Du kan også untag ved å fjerne et bilde ved navn på taggen. Dette er litt skremmende fordi hvis du fjerner den siste taggen ved et uhell, mister du bildet. Men hvis du bygger bilder fra en Dockerfil, kan du bare gjenoppbygge bildet.

> docker rmi oh-yeah-alpine-2 Untagged: oh-yeah-alpine-2: siste> docker rmi oh-yeah-alpine: cool-tag Untagged: oh-yeah-alpine: cool-tag

Hvis jeg prøver å fjerne det siste gjenværende merkede bildet, får jeg en feil fordi den brukes av en container.

> docker rmi oh-yeah-alpine Feil respons fra daemon: konflikt: kan ikke fjerne repository referanse "oh-yeah-alpine" (må tvinge) - container a1443a7ca9d2 bruker det refererte bildet e124405f28f4

Men hvis jeg fjerner beholderen ...

> Docker rmi oh-ja-alpine Uten etikett: oh-ja-alpin: siste Slettet: SHA256: e124405f28f48e ... 441d774d9413139e22386c4820df Slettet: SHA256: 7fa4cba6d14fdf ... d8940e6c50d30a157483de06fc59 Slettet: SHA256: 283d461dadfa6c ... dbff864c6557af23bc5aff9d66de Slettet: SHA256: 1b2a228cc2a5b4 ... 23c80a41a41da4ff92fcac95101e Slettet: SHA256: fe5fe2290c63a0 ... 8af394bb4bf15841661f71c71e9a> docker bilder | grep oh-yeah

Jepp. Det er borte. Men ikke bekymre deg. Vi kan gjenoppbygge det:

> docker bygge -t oh-yeah-alpine. > docker bilder | grep oh-yeah oh-yeah-alpine siste 1e831ce8afe1 1 minutt siden 30.5 MB 

Yay, det er tilbake. Dockerfile for seieren!

Arbeider med bilderegistre

Bilder er svært liknende på enkelte måter å git repositories. De er også bygget fra et bestilt sett av forpliktelser. Du kan tenke på to bilder som bruker de samme basebildene som grener (selv om det ikke er fusjon eller gjenoppretting i Docker). Et bilderegister er det samme som en sentral git-hosting-tjeneste som GitHub. Gjett hva er navnet på det offisielle Docker bilderegistret? Det er riktig, Docker Hub. 

Trekke bilder

Når du kjører et bilde, hvis det ikke eksisterer, vil Docker forsøke å trekke det fra et av dine konfigurerte bilderegistre. Som standard går det til Docker Hub, men du kan kontrollere det i filen "~ / .docker / config.json". Hvis du bruker et annet register, kan du følge instruksjonene, som vanligvis involverer å logge inn ved hjelp av deres legitimasjonsbeskrivelser.

La oss slette "hallo-verden" -bildet og trekke det igjen ved hjelp av docker trekk kommando.

> Dockere bilder | grep hei-verden hei-verden siste c54a2cc56cbb 7 måneder siden 1,85 kB> docker rmi hello-world hei verden

Det er borte. La oss trekke nå.

> Docker-trekk Hei-verden Bruke standard-taggen: Siste siste: Trekke fra bibliotek / Hei-verden 78445dd45222: Trekk komplett Digest: sha256: c5515758d4c5e1e ... 07e6f927b07d05f6d12a1ac8d7 Status: Nedlastet nyere bilde for hallo-verden: Siste> Dockere bilder | grep hello-world hello-world siste 48b5124b2768 2 uker siden 1,84 kB

Den siste hei-verdenen ble erstattet med en nyere versjon.

Skyve bilder

Pushing bilder er litt mer involvert. Først må du opprette en konto på Docker Hub (eller annet register). Deretter må du logge inn. Da må du merke bildet du vil skyve i henhold til kontonavnet ditt ("g1g1" i mitt tilfelle).

> docker login -u g1g1 -p  Innlogging Succeeded> Docker Tag Hello world g1g1 / hello-world> docker bilder | grep hei g1g1 / hello-world latest 48b5124b2768 2 uker siden 1,84 kB hello-world latest 48b5124b2768 2 uker siden 1,84 kB 

Nå kan jeg trykke på g1g1 / hello-world-tagget bildet.

> Docker push G1G1 / Hello world Verden refererer til et lager [docker.io/g1g1/hello-world] 98c944e98de8: Montert fra bibliotek / hallo-verden nyeste: fordøye: sha256: c5515758d4c5e ... f6d12a1ac8d7 størrelse: 524

Konklusjon

Dockerbilder er malene til containene dine. De er utformet for å være effektive og gir maksimal gjenbruk ved hjelp av en lagringssystem for filsystemet. 

Docker gir mange verktøy for oppføring, inspeksjon, bygging og merking av bilder. Du kan trekke og skyve bilder til bilderegistre som Docker Hub for å enkelt administrere og dele bildene dine.