Hoe Docker-installatiekopieën werken

Voltooid

Zoals u weet, wordt de containerinstallatiekopie de eenheid die we gebruiken om toepassingen te distribueren. We hebben ook gezegd dat de container een gestandaardiseerde indeling heeft die zowel onze ontwikkelaars- als operationele teams gebruiken.

Hier bekijken we de verschillen tussen software, pakketten en installatiekopieën zoals gebruikt in Docker. Als u de verschillen tussen deze concepten kent, begrijpt u beter hoe Docker-installatiekopieën werken.

We bespreken ook kort de rol die het besturingssysteem speelt dat wordt uitgevoerd op de host en de rol van het besturingssysteem dat in de container wordt uitgevoerd.

Software die is verpakt in een container

De software die in een container is verpakt, is niet beperkt tot de toepassingen die door onze ontwikkelaars worden gebouwd. Als we het over software hebben, verwijzen we naar toepassingscode, systeempakketten, binaire bestanden, bibliotheken, configuratiebestanden en het besturingssysteem die allen in de container worden uitgevoerd.

Stel dat we een portal voor het bijhouden van bestellingen ontwikkelen voor de verschillende verkoopkanalen van ons bedrijf. We moeten naar alle software kijken die onze webtoepassing gebruikt om te worden uitgevoerd. De toepassing die we bouwen is een .NET Core MVC-app en we zijn van plan om de toepassing te implementeren met behulp van nginx als een omgekeerde proxyserver in Ubuntu Linux. Al deze softwareonderdelen maken deel uit van de containerinstallatiekopie.

Wat is een containerinstallatiekopie?

Een containerinstallatiekopie is een overdraagbaar pakket dat software bevat. Deze installatiekopie wordt onze container zodra deze wordt uitgevoerd. De container is een exemplaar in het geheugen van een installatiekopieën.

Een containerinstallatiekopie is onveranderbaar. Zodra u een installatiekopie hebt gemaakt, kunt u deze niet meer wijzigen. De enige manier om een installatiekopie te wijzigen, is door een nieuwe installatiekopie te maken. Deze functie biedt ons de garantie dat de installatiekopie die we in productie gebruiken dezelfde is als de installatiekopie die tijdens de ontwikkel- en QA-fase is gebruikt.

Wat is het hostbesturingssysteem?

Het hostbesturingssysteem is het besturingssysteem waarop de Docker-engine wordt uitgevoerd. Docker-containers die worden uitgevoerd op Linux delen de host-besturingssysteemkernel en vereisen geen container-besturingssysteem zolang het binaire bestand rechtstreeks toegang heeft tot de besturingssysteemkernel.

Diagram met een Docker-installatiekopie zonder basisbesturingssysteem en de afhankelijkheid van de hostbesturingssysteemkernel.

Voor Windows-containers is echter een containerbesturingssysteem nodig. De container is afhankelijk van de besturingssysteemkernel om services te beheren, zoals het bestandssysteem, netwerkbeheer, procesplanning en geheugenbeheer.

Wat is het containerbesturingssysteem?

Het container-besturingssysteem is het besturingssysteem dat deel uitmaakt van de verpakte installatiekopieën. We hebben de flexibiliteit om verschillende versies van Linux- of Windows-besturingssystemen in een container op te nemen. Dankzij deze flexibiliteit kunnen we toegang krijgen tot specifieke functies van het besturingssysteem of aanvullende software installeren die onze toepassingen mogelijk gebruiken.

Diagram met een Docker-installatiekopie met een Ubuntu-basisbesturingssysteem en de afhankelijkheid van de hostbesturingssysteemkernel.

Het container-besturingssysteem is geïsoleerd van het host-besturingssysteem en het is de omgeving waarin we onze toepassing implementeren en uitvoeren. De combinatie van de onveranderbaarheid van de installatiekopie en deze isolatie betekent dat de toepassing die we uitvoeren gegarandeerd dezelfde is als de installatiekopie in productie.

In ons voorbeeld gebruiken we Ubuntu Linux als het container-besturingssysteem en dit besturingssysteem verandert niet van ontwikkeling of productie. We gebruiken dus altijd dezelfde installatiekopie.

Wat is Stackable Unification File System (Unionfs)?

We gebruiken Unionfs om Docker-installatiekopieën te maken. Unionfs is een bestandssysteem waarmee u verschillende directory's, ook wel vertakkingen genoemd, kunt stapelen op een manier die lijkt alsof de inhoud wordt samengevoegd. De inhoud wordt fysiek echter gescheiden gehouden. Met Unionfs kunt u vertakkingen toevoegen en verwijderen als u uw bestandssysteem uitbouwt.

Diagram met de stapeling van lagen in een Docker-installatiekopie die is gemaakt met unionfs.

Laten we bijvoorbeeld aannemen dat u een installatiekopie bouwt voor de eerdergenoemde webtoepassing. We leggen de distributie van Ubuntu als basisinstallatiekopie boven op het opstartbestandssysteem. Vervolgens installeren we nginx en onze web-app. We lagen nginx en de web-app effectief boven op de oorspronkelijke Ubuntu-installatiekopie.

Er wordt een definitieve beschrijfbare laag gemaakt, zodra de container vanaf de installatiekopie wordt uitgevoerd. Deze laag blijft echter niet behouden wanneer de container wordt vernietigd.

Wat is een basisinstallatiekopie?

Een basisinstallatiekopie is een installatiekopie die van de Docker-installatiekopie scratch gebruikmaakt. De installatiekopie scratch is een lege containerinstallatiekopie waarmee geen bestandssysteemlaag wordt gemaakt. Voor deze installatiekopie wordt ervan uitgegaan dat de toepassing die u gaat uitvoeren, rechtstreeks gebruik kan maken van de hostbesturingssysteemkernel.

Wat is een bovenliggende installatiekopie?

Een bovenliggende installatiekopie is een containerinstallatiekopie van waaruit u uw installatiekopieën maakt.

In plaats van bijvoorbeeld een installatiekopie te maken van scratch en vervolgens Ubuntu te installeren, gebruiken we al een installatiekopie op basis van Ubuntu. We kunnen zelfs een installatiekopieën gebruiken waarop nginx al is geïnstalleerd. Een bovenliggende installatiekopie bevat meestal al een containerbesturingssysteem.

Wat is het belangrijkste verschil tussen basis- en bovenliggende installatiekopieën?

Met beide typen installatiekopieën kunnen we een herbruikbare installatiekopie maken. Basisinstallatiekopieën bieden echter meer controle over de uiteindelijke inhoud van de installatiekopieën. Zoals eerder gezegd, is een afbeelding onveranderbaar; u kunt alleen een afbeelding toevoegen en niet aftrekken.

In Windows kunt u alleen containerinstallatiekopieën maken die zijn gebaseerd op Windows-basiscontainerinstallatiekopieën. Microsoft biedt en services deze Windows-basiscontainerinstallatiekopieën.

Wat is een Dockerfile?

Een Dockerfile is een tekstbestand dat de instructies bevat om een Docker-installatiekopie te bouwen en uit te voeren. De afbeelding definieert de volgende aspecten:

  • De basis- of bovenliggende installatiekopie die wordt gebruikt om de nieuwe installatiekopie te maken
  • Opdrachten om het basisbesturingssysteem bij te werken en extra software te installeren
  • Buildartefacten die moeten worden toegevoegd, zoals een ontwikkelde toepassing
  • Services die beschikbaar moeten worden gesteld, zoals opslag en netwerkconfiguratie
  • De opdracht die moet worden uitgevoerd als de container wordt gestart

Laten we deze aspecten eens gaan toewijzen aan een voorbeeld-Dockerfile. Stel dat we een Docker-installatiekopie maken voor onze ASP.NET Core-website. Het Dockerfile kan eruitzien als in het volgende voorbeeld:

# 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"]

We behandelen hier niet de specificatie van het Dockerfile-bestand of de details van elke opdracht in het vorige voorbeeld. U ziet echter dat er verschillende opdrachten in dit bestand zijn waarmee we de structuur van de installatiekopie kunnen bewerken. Met de COPY opdracht wordt bijvoorbeeld de inhoud gekopieerd van een specifieke map op de lokale computer naar de containerinstallatiekopieën die we bouwen.

Zoals eerder vermeld, hebben we vermeld dat Docker-installatiekopieën gebruikmaken van unionfs. Tijdens elk van deze stappen wordt een containerinstallatiekopie in de cache geplaatst terwijl we de uiteindelijke containerinstallatiekopie maken. Deze tijdelijke installatiekopieën worden gelaagd boven op de vorige afbeelding en weergegeven als één afbeelding zodra alle stappen zijn voltooid.

Kijk tot slot eens naar de laatste stap, stap 8. De ENTRYPOINT in het bestand geeft aan welk proces wordt uitgevoerd als er een container vanaf een installatiekopie wordt uitgevoerd. Als er geen ENTRYPOINT of een ander proces moet worden uitgevoerd, interpreteert Docker dat omdat er niets voor de container is en de container wordt afgesloten.

Docker-installatiekopieën beheren

Docker-installatiekopieën zijn grote bestanden die in eerste instantie zijn opgeslagen op uw pc en we hebben hulpprogramma's nodig om deze bestanden te beheren.

Met de Docker CLI en Docker Desktop kunnen we installatiekopieën beheren door ze te bouwen, weer te geven, te verwijderen en uit te voeren. Docker-installatiekopieën kunnen worden beheerd met behulp van de docker-client. De client voert de opdrachten niet rechtstreeks uit en verzendt alle query's naar de dockerd daemon.

We gaan hier niet alle clientopdrachten en opdrachtvlaggen behandelen, maar we gaan wel naar een aantal van de meest gebruikte opdrachten kijken. De sectie Meer informatie in de samenvattingseenheid van deze module bevat koppelingen naar Docker-documentatie, waarin alle opdrachten en opdrachtvlagmen in detail worden behandeld.

Een installatiekopie bouwen

We gebruiken de opdracht docker build om Docker-installatiekopieën te bouwen. Laten we aannemen dat we de definitie van de Dockerfile van voorheen gebruiken om een installatiekopie te bouwen. Hier volgt een voorbeeld van de buildopdracht:

docker build -t temp-ubuntu .

Hier volgt de uitvoer die de buildopdracht genereert:

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

Maak u geen zorgen als u de voorgaande uitvoer niet begrijpt. Let echter wel op de stappen die worden vermeld in de uitvoer. Bij het uitvoeren van elke stap, wordt er een nieuwe laag toegevoegd aan de installatiekopie die we bouwen.

Zoals u ziet, worden er ook een aantal opdrachten uitgevoerd voor het installeren van software en om de configuratie te beheren. In stap 2 voeren we bijvoorbeeld de opdrachten apt -y update en apt install -y uit om het besturingssysteem bij te werken. Deze opdrachten worden uitgevoerd in een actieve container die voor die stap is gemaakt. Zodra de opdracht wordt uitgevoerd, wordt de tussenliggende container verwijderd. De onderliggende installatiekopie in de cache wordt bewaard op de host waar de installatiekopie wordt gebouwd en deze wordt niet automatisch verwijderd. Deze optimalisatie zorgt ervoor dat bij latere pogingen om installatiekopieën te bouwen deze installatiekopieën opnieuw kunnen worden gebruikt zodat het minder tijd kost om er een te bouwen.

Wat is een installatiekopietag?

Een afbeeldingstag is een tekenreeks die wordt gebruikt om een afbeelding te versien.

Let op het laatste bericht dat werd weergegeven toen u eerder een installatiekopie maakte, 'temp-ubuntu: latest is getagd'. Wanneer u een installatiekopie bouwt, kunt u ervoor kiezen deze van een tag te voorzien met behulp van de opdrachtvlag -t. In ons voorbeeld hebben we de installatiekopie met behulp van -t temp-ubuntu een naam gegeven, terwijl de resulterende naam van de installatiekopie de tag temp-ubuntu: latest heeft gekregen. Een installatiekopie krijgt de tag latest als u er geen opgeeft.

Aan één installatiekopie kunnen meerdere tags zijn toegewezen. Volgens de conventies wordt aan de meest recente versie van een installatiekopie de tag latest toegewezen, naast een tag dat het versienummer van de installatiekopie aanduidt. Als u een nieuwe versie van een installatiekopie vrijgeeft, kunt u de meest recente tag opnieuw toewijzen om naar de nieuwe installatiekopie te verwijzen.

Voor Windows biedt Microsoft geen basiscontainerinstallatiekopieën met de nieuwste tag. Voor Installatiekopieën van Windows-basiscontainers moet u een tag opgeven die u wilt gebruiken. De Windows-basiscontainerinstallatiekopieën voor Server Core zijn mcr.microsoft.com/windows/servercorebijvoorbeeld . Tussen de tags zijn ltsc2016, ltsc2019en ltsc2022.

Hier volgt nog een voorbeeld. Stel dat u de Docker-installatiekopieën van .NET Core-voorbeelden wilt gebruiken. Hier hebben we vier platformversies waaruit we kunnen kiezen:

  • 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

In de voorgaande lijst met afbeeldingen zien we dat Microsoft meerdere voorbeelden van .NET Core biedt. Tags geven aan welke voorbeelden de afbeelding verwijst: ASP.NET, WCF-service, enzovoort.

Installatiekopieën weergeven

Met de Docker-software wordt automatisch een lokaal installatiekopieregister op uw computer geregistreerd. U kunt de installatiekopieën in het register in lijstvorm weergeven met de opdracht docker images.

docker images

De uitvoer ziet eruit als in het volgende voorbeeld:

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

U ziet nu hoe de installatiekopie wordt weergegeven met de naam, de tag en een installatiekopie-id. U herinnert zich wellicht dat we meerdere labels voor een installatiekopie kunnen gebruiken. In de voorgaande uitvoer ziet u een voorbeeld; Hoewel de namen van de installatiekopieën verschillen, kunnen we zien dat de id's hetzelfde zijn.

De installatiekopie-id is een handige manier om installatiekopieën aan te duiden en te beheren, waarbij de naam of tag van een installatiekopie ambigu kan zijn.

Een installatiekopie verwijderen

U kunt een installatiekopie uit het lokale Docker-register verwijderen met de opdracht docker rmi. Dit is handig als u ruimte op de hostschijf van de container moet besparen, omdat containerinstallatiekopielagen de totale beschikbare ruimte toevoegen.

Geef de naam of het id op van de installatiekopie die moet worden verwijderd. In dit voorbeeld wordt de installatiekopie verwijderd voor de voorbeeld-web-app met behulp van de naam van de installatiekopie:

docker rmi temp-ubuntu:version-1.0

U kunt een installatiekopieën niet verwijderen als een container nog steeds gebruikmaakt van de installatiekopieën. De docker rmi opdracht retourneert een foutbericht, waarin de container wordt vermeld die afhankelijk is van de installatiekopieën.

We hebben de basisbeginselen van Docker-installatiekopieën verkend, hoe u deze installatiekopieën beheert en hoe u een container uitvoert vanuit een installatiekopieën. We gaan nu kijken hoe containers worden beheerd.

Kennis testen

1.

Docker Desktop is een app om containerapps en microservices te maken en delen die beschikbaar is op welke van de volgende besturingssystemen?

2.

Wat is de juiste Docker-opdracht om een containerinstallatiekopieën opnieuw te bouwen?

3.

Met welke van de volgende zinnen wordt het beste een containerinstallatiekopie beschreven?