Sådan fungerer Docker-billeder
Husk, at vi sagde, at objektbeholderbilledet bliver den enhed, vi bruger til at distribuere programmer. Vi nævnte også, at objektbeholderen er i et standardiseret format, som både vores udvikler- og driftsteams bruger.
Her ser vi på forskellene mellem software, pakker og billeder, som bruges i Docker. Kendskab til forskellene mellem disse begreber vil hjælpe os med bedre at forstå, hvordan Docker-billeder fungerer.
Vi gennemgår også kort rollerne for det operativsystem, der kører på værten, og det operativsystem, der kører i objektbeholderen.
Software, der er pakket ind i en objektbeholder
Softwaren, der er pakket ind i en objektbeholder, er ikke begrænset til de programmer, som vores udviklere bygger. Når vi taler om software, henviser vi til programkode, systempakker, binære filer, biblioteker, konfigurationsfiler og det operativsystem, der kører i objektbeholderen.
Antag f.eks., at vi udvikler en ordresporingsportal, som vores virksomheds forskellige afsætningsmuligheder kan bruge. Vi er nødt til at se på den komplette stak af software, der vil køre vores web-program. Det program, vi bygger, er en .NET Core MVC-app, og vi planlægger at installere programmet ved hjælp af nginx som en omvendt proxyserver på Ubuntu Linux. Alle disse softwarekomponenter er en del af objektbeholderbilledet.
Hvad er et objektbeholderbillede?
Et objektbeholderbillede er en bærbar pakke, der indeholder software. Det er dette billede, der, når det køres, bliver vores objektbeholder. Objektbeholderen er et billedes forekomst i hukommelsen.
Et objektbeholderbillede er uforanderligt. Når du har bygget et billede, kan du ikke ændre det. Den eneste måde at ændre et billede på er ved at oprette et nyt billede. Denne funktion er vores garanti for, at det billede, vi bruger i produktionen, er det samme billede, der bruges i udvikling og kvalitetskontrol.
Hvad er værtsoperativsystemet?
Værtsoperativsystemet er det operativsystem, som Docker-programmet kører på. Docker-objektbeholdere, der kører på Linux, deler os-værtskernen og kræver ikke et objektbeholderoperativsystemer, så længe den binære fil kan få direkte adgang til OS-kernen.
Windows-objektbeholdere skal dog bruge et objektbeholderoperativsystemer. Objektbeholderen afhænger af OS-kernen til at administrere tjenester som f.eks. filsystemet, netværksadministration, procesplanlægning og hukommelsesstyring.
Hvad er objektbeholderens operativsystem?
Objektbeholderens operativsystem er det operativsystem, der er en del af det pakkede billede. Vi har fleksibiliteten til at inkludere forskellige versioner af Linux- eller Windows-operativsystemer i en objektbeholder. Denne fleksibilitet giver os adgang til specifikke OS-funktioner eller installerer yderligere software, som vores programmer kan bruge.
Objektbeholderoperativsystemet er isoleret fra værtsoperativsystemet, og det er det miljø, hvor vi udruller og kører vores program. Kombineret med billedets uforanderlighed betyder denne isolation, at miljøet for vores program, der kører under udvikling, er det samme som i produktionen.
I vores eksempel bruger vi Ubuntu Linux som objektbeholderoperativsystemet, og dette operativsystem ændres ikke fra udvikling eller produktion. Det billede, vi bruger, er altid det samme.
Hvad er Stackable Unification File System (Unionfs
)?
Vi bruger Unionfs
til at oprette Docker-billeder.
Unionfs
er et filsystem, der giver dig mulighed for at stable flere mapper – kaldet forgreninger – på en sådan måde, at det ser ud, som om indholdet flettes. Indholdet holdes dog fysisk adskilt.
Unionfs
giver dig mulighed for at tilføje og fjerne forgreninger, når du bygger dit filsystem.
Antag f.eks., at vi bygger et billede til vores webprogram fra tidligere. Vi lægger Ubuntu-distributionen som et basisbillede oven på startfilsystemet. Derefter installerer vi nginx og vores webapp. Vi lagdelte effektivt nginx og webappen oven på det oprindelige Ubuntu-billede.
Der oprettes et endeligt skrivbart lag, når objektbeholderen køres fra billedet. Dette lag bevares dog ikke, når objektbeholderen ødelægges.
Hvad er et basisbillede?
Et basisbillede er et billede, der bruger Docker-scratch
-billedet. Det scratch
billede er et tomt objektbeholderbillede, der ikke opretter et filsystemlag. Dette billede forudsætter, at det program, du vil køre, kan bruge værts-OS-kernen direkte.
Hvad er et overordnet billede?
Et overordnet billede er et objektbeholderbillede, som du opretter dine billeder ud fra.
I stedet for f.eks. at oprette et billede fra scratch
og derefter installere Ubuntu, bruger vi et billede, der allerede er baseret på Ubuntu. Vi kan endda bruge et billede, der allerede har nginx installeret. Et overordnet billede indeholder normalt et objektbeholderoperativsystemer.
Hvad er den primære forskel mellem basisbilleder og overordnede billeder?
Begge billedtyper giver os mulighed for at oprette et billede, der kan genbruges. Basisbilleder giver os dog større kontrol over det endelige billedindhold. Husk fra tidligere, at et billede er uforanderligt; Du kan kun føje til et billede og ikke subtrahere.
I Windows kan du kun oprette objektbeholderafbildninger, der er baseret på Windows-basisobjektbeholderafbildninger. Microsoft leverer og servicer disse Windows-basisobjektbeholderafbildninger.
Hvad er en Dockerfile?
En Dockerfile er en tekstfil, der indeholder de instruktioner, vi bruger til at bygge og køre et Docker-billede. Den definerer følgende aspekter af billedet:
- Det grundlæggende eller overordnede billede, vi bruger til at oprette det nye billede
- Kommandoer til opdatering af det grundlæggende operativsystem og installation af yderligere software
- Byg artefakter, der skal medtages, f.eks. et udviklet program
- Tjenester, der skal vises, f.eks. lager- og netværkskonfiguration
- Kommando, der skal køres, når objektbeholderen startes
Lad os knytte disse aspekter til et eksempel på Dockerfile. Lad os antage, at vi opretter et Docker-billede til vores ASP.NET Core-websted. Dockerfile kan se ud som i følgende eksempel:
# Step 1: Specify the parent image for the new image
FROM ubuntu:18.04
# Step 2: Update OS packages and install additional software
RUN apt -y update && apt install -y wget nginx software-properties-common apt-transport-https \
&& wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
&& dpkg -i packages-microsoft-prod.deb \
&& add-apt-repository universe \
&& apt -y update \
&& apt install -y dotnet-sdk-3.0
# Step 3: Configure Nginx environment
CMD service nginx start
# Step 4: Configure Nginx environment
COPY ./default /etc/nginx/sites-available/default
# STEP 5: Configure work directory
WORKDIR /app
# STEP 6: Copy website code to container
COPY ./website/. .
# STEP 7: Configure network requirements
EXPOSE 80:8080
# STEP 8: Define the entry point of the process that runs in the container
ENTRYPOINT ["dotnet", "website.dll"]
Vi dækker ikke specifikationen af Dockerfile-filen her eller detaljerne for hver kommando i det foregående eksempel. Bemærk dog, at der er flere kommandoer i denne fil, der giver os mulighed for at manipulere billedstrukturen. Kommandoen COPY
kopierer f.eks. indholdet fra en bestemt mappe på den lokale computer til det objektbeholderbillede, vi bygger.
Husk, at tidligere nævnte vi, at Docker-billeder gør brug af unionfs
. Hvert af disse trin opretter et cachelagret objektbeholderbillede, når vi opretter det endelige objektbeholderbillede. Disse midlertidige billeder er lagdelt oven på det forrige billede og vises som et enkelt billede, når alle trin er fuldført.
Læg til sidst mærke til det sidste trin, trin 8. Den ENTRYPOINT
i filen angiver, hvilken proces der udføres, når vi kører en objektbeholder fra et billede. Hvis der ikke er noget ENTRYPOINT eller en anden proces, der skal udføres, fortolker Docker dette, da der ikke er noget at gøre for objektbeholderen, og objektbeholderen afsluttes.
Sådan administrerer du Docker-billeder
Docker-billeder er store filer, der oprindeligt er gemt på din pc, og vi har brug for værktøjer til at administrere disse filer.
Docker CLI og Docker Desktop giver os mulighed for at administrere billeder ved at bygge, vise, fjerne og køre dem. Vi administrerer Docker-billeder ved hjælp af docker
-klienten. Klienten udfører ikke kommandoerne direkte og sender alle forespørgsler til den dockerd
daemon.
Vi dækker ikke alle klientkommandoer og kommandoflag her, men vi vil se på nogle af de mest anvendte kommandoer. Afsnittet Få mere at vide i dette moduls Summary-undermodulet indeholder links til Dokumentationen til Docker, som indeholder detaljerede oplysninger om alle kommandoer og kommandoflag.
Sådan opretter du et billede
Vi bruger kommandoen docker build
til at oprette Docker-billeder. Lad os antage, at vi bruger Dockerfile-definitionen fra tidligere til at oprette et billede. Her er et eksempel, der viser kommandoen build:
docker build -t temp-ubuntu .
Her er det output, som kommandoen build genererer:
Sending build context to Docker daemon 4.69MB
Step 1/8 : FROM ubuntu:18.04
---> a2a15febcdf3
Step 2/8 : RUN apt -y update && apt install -y wget nginx software-properties-common apt-transport-https && wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb && dpkg -i packages-microsoft-prod.deb && add-apt-repository universe && apt -y update && apt install -y dotnet-sdk-3.0
---> Using cache
---> feb452bac55a
Step 3/8 : CMD service nginx start
---> Using cache
---> ce3fd40bd13c
Step 4/8 : COPY ./default /etc/nginx/sites-available/default
---> 97ff0c042b03
Step 5/8 : WORKDIR /app
---> Running in 883f8dc5dcce
Removing intermediate container 883f8dc5dcce
---> 6e36758d40b1
Step 6/8 : COPY ./website/. .
---> bfe84cc406a4
Step 7/8 : EXPOSE 80:8080
---> Running in b611a87425f2
Removing intermediate container b611a87425f2
---> 209b54a9567f
Step 8/8 : ENTRYPOINT ["dotnet", "website.dll"]
---> Running in ea2efbc6c375
Removing intermediate container ea2efbc6c375
---> f982892ea056
Successfully built f982892ea056
Successfully tagged temp-ubuntu:latest
Bare rolig, hvis du ikke forstår det foregående output. Bemærk dog de trin, der er angivet i outputtet. Når hvert trin udføres, føjes der et nyt lag til det billede, vi bygger.
Bemærk også, at vi udfører en række kommandoer for at installere software og administrere konfiguration. I trin 2 kører vi f.eks. kommandoerne apt -y update
og apt install -y
for at opdatere operativsystemet. Disse kommandoer udføres i en kørende objektbeholder, der er oprettet for det pågældende trin. Når kommandoen kører, fjernes den mellemliggende objektbeholder. Det underliggende cachelagrede billede bevares på buildværten og slettes ikke automatisk. Denne optimering sikrer, at senere builds genbruger disse billeder for at fremskynde buildtider.
Hvad er et billedmærke?
Et billedmærke er en tekststreng, der bruges til at versionere et billede.
I eksempelbuildet fra tidligere kan du se den seneste buildmeddelelse med teksten "Det lykkedes at mærke temp-ubuntu: seneste". Når du opretter et billede, navngiver og markerer vi eventuelt billedet ved hjælp af kommandoflaget -t
. I vores eksempel kaldte vi billedet ved hjælp af -t temp-ubuntu
, mens det resulterende billednavn blev mærket temp-ubuntu: seneste. Et billede er forsynet med mærket latest
, hvis du ikke angiver et mærke.
Et enkelt billede kan have tildelt flere mærker. Efter konvention tildeles den nyeste version af et billede nyeste-tag og et mærke, der beskriver billedets versionsnummer. Når du udgiver en ny version af et billede, kan du tildele det nyeste mærke igen for at referere til det nye billede.
Til Windows leverer Microsoft ikke grundlæggende objektbeholderbilleder med det nyeste mærke. For Windows-basisobjektbeholderafbildninger skal du angive et mærke, du vil bruge. Windows-basisobjektbeholderafbildningen for Server Core er f.eks. mcr.microsoft.com/windows/servercore
. Blandt koderne er ltsc2016
, ltsc2019
og ltsc2022
.
Her er et andet eksempel. Lad os antage, at du vil bruge .NET Core-eksemplerne Docker-billeder. Her har vi fire platforme versioner, hvorfra vi kan vælge:
mcr.microsoft.com/dotnet/core/samples:dotnetapp
mcr.microsoft.com/dotnet/core/samples:aspnetapp
mcr.microsoft.com/dotnet/core/samples:wcfservice
mcr.microsoft.com/dotnet/core/samples:wcfclient
På den foregående billedliste kan vi se, at Microsoft leverer flere eksempler på .NET Core. Mærker angiver, hvilke eksempler billedet refererer til: ASP.NET, WCF Service osv.
Sådan viser du billeder
Docker-softwaren konfigurerer automatisk en lokal billedregistreringsdatabase på computeren. Du kan få vist billederne i denne registreringsdatabase med kommandoen docker images
.
docker images
Outputtet ser ud som i følgende eksempel:
REPOSITORY TAG IMAGE ID CREATED SIZE
tmp-ubuntu latest f89469694960 14 minutes ago 1.69GB
tmp-ubuntu version-1.0 f89469694960 14 minutes ago 1.69GB
ubuntu 18.04 a2a15febcdf3 5 weeks ago 64.2MB
Bemærk, hvordan billedet vises med Name, Tagog et Image ID. Husk, at vi kan anvende flere mærkater på et billede. Det foregående output viser et eksempel. Selvom billednavnene er forskellige, kan vi se, at id'erne er de samme.
Billed-id'et er en nyttig måde at identificere og administrere billeder på, hvor navnet eller mærket på et billede kan være tvetydigt.
Sådan fjerner du et billede
Du kan fjerne et billede fra den lokale docker-registreringsdatabase med kommandoen docker rmi
. Dette er nyttigt, hvis du har brug for at spare plads på objektbeholderens værtsdisk, fordi lag af objektbeholderafbildninger øger den samlede tilgængelige plads.
Angiv navnet eller id'et på det billede, der skal fjernes. I dette eksempel fjernes billedet for eksempelwebappen ved hjælp af billednavnet:
docker rmi temp-ubuntu:version-1.0
Du kan ikke fjerne et billede, hvis en objektbeholder stadig bruger billedet. Kommandoen docker rmi
returnerer en fejlmeddelelse, som viser den objektbeholder, der er afhængig af billedet.
Vi har udforsket de grundlæggende funktioner i Docker-billeder, hvordan du administrerer disse billeder, og hvordan du kører en objektbeholder fra et billede. Derefter skal vi se på, hvordan du administrerer objektbeholdere.