Hoe maak je een Docker Windows-image met Docker Build-tag

Bent u nieuw in Docker Windows-images? Werkt u momenteel in een Windows-omgeving en bent u nieuwsgierig om meer te weten te komen over Docker-builds voor containerafbeeldingen? Dan bent u hier aan het juiste adres. De beste manier om iets nieuws te leren, is door het te doen met de docker build– en docker build "tag"-opdrachten!

In dit artikel leert u hoe u uw eerste Windows Docker-afbeelding maakt vanuit een Dockerfile met behulp van de docker build-opdracht.

Laten we beginnen!

Begrip van Docker-containerafbeeldingen

Jarenlang was de enige manier om tests uit te voeren of ontwikkeling te doen op meerdere besturingssystemen (OS) het hebben van verschillende toegewijde fysieke of virtuele machines geïmaged met de OS-versie van uw keuze. Deze methodologie vereiste meer hardware en overhead om nieuwe machines te voorzien van elke software- en OS-specificatie.

Maar tegenwoordig is het gebruik van Docker container-afbeeldingen deels gegroeid vanwege de populariteit van microservices-architectuur. Als reactie op de stijgende populariteit van Docker is Microsoft begonnen met het openbaar ondersteunen van Docker-afbeeldingen voor verschillende vlaggenschipproducten op hun Docker Hub-pagina. Ze hebben zelfs native ondersteuning toegevoegd voor afbeeldingen voor Windows als een productfunctie in Windows 10 en Windows Server 2016!

A Docker image is run on a container by using the Docker Engine. Docker images have many benefits such as portability (applicable to multiple environments and platforms), customizable, and highly scalable.  As you can see below, unlike traditional virtual machines, the Docker engine runs on a layer between the host OS kernel and the isolated application services that are being containerized.

Source: Docker

Begrip van Docker Build en Afbeeldingen

Het docker build commando kan worden gebruikt om de creatie van containerimages te automatiseren, een DevOps-praktijk van container-als-code over te nemen en containerisatie te integreren in de ontwikkelingscyclus van uw projecten. Dockerfiles zijn eenvoudigweg tekstbestanden die build-instructies bevatten die door Docker worden gebruikt om een nieuw containerimage te maken dat is gebaseerd op een bestaand image.

De gebruiker kan het basisimage specificeren en een lijst met commando’s opgeven die moeten worden uitgevoerd wanneer een containerimage wordt ingezet of opstart voor de eerste keer. In dit artikel leert u hoe u een op Windows gebaseerd dockerimage maakt vanuit een Dockerfile met behulp van een Windows-container.

Deze werkwijze heeft verschillende voordelen ten opzichte van het gebruik van een vooraf gebouwd containerimage:

  1. U kunt een containerimage opnieuw opbouwen voor verschillende versies van Windows – wat geweldig is voor het testen van codeveranderingen op verschillende platforms.
  2. U heeft meer controle over wat er in de container wordt geïnstalleerd. Dit stelt u in staat om de grootte van uw container tot een minimum te beperken.
  3. Om veiligheidsredenen wilt u mogelijk de container controleren op kwetsbaarheden en beveiligingsverharding toepassen op het basisimage

Vereisten:

Dit artikel is een stapsgewijze handleiding voor het leren bouwen van een Docker-image met behulp van een Dockerfile. Als u wilt meedoen, zorg er dan voor dat u aan de volgende vereisten voldoet.

  • Docker voor Windows geïnstalleerd. Ik zal de Docker Community Edition (CE) versie 2.1.0.4 in mijn omgeving gebruiken.
  • Internettoegang is vereist voor het downloaden van de Docker-afbeeldingen
  • Windows 10+ besturingssysteem (versie 1709 wordt gebruikt voor deze handleiding)
  • Ingeschakelde geneste virtualisatie
  • 5 GB vrije schijfruimte op uw lokale machine
  • PowerShell 5.0+
  • Deze handleiding maakt gebruik van de Visual Studio Code IDE. Voel u echter vrij om de IDE te gebruiken die u verkiest.

Opmerking: Zorg ervoor dat u Windows Containers Configuration inschakelt bij het installeren van Docker.

Zich voorbereiden

U hebt eerst een map nodig om alle Docker-afbeeldingen en containers op te slaan die u zult bouwen vanuit die afbeeldingen. Open hiervoor een PowerShell- of cmd-terminal (u zult PowerShell gebruiken in dit artikel) en maak een nieuwe map genaamd C:\Containers.

Zodra de map is gemaakt, ga naar die map. Hiermee wordt de huidige werkmap van de console ingesteld op C:\Containers om alle downloads standaard naar deze map te leiden.

PS51> mkdir C:\Containers
PS51> cd C:\Containers

In dit artikel krijg je een voorsprong. De meeste bestanden voor dit project zijn al beschikbaar. Zodra de map is aangemaakt, voer een Git pull uit om de benodigde bestanden voor dit artikel van het TechSnips Github-repository naar de map C:\Containers te kopiëren. Controleer vervolgens of de map C:\Containers eruitziet zoals hieronder weergegeven.

Tutorial files

Het downloaden van de IIS Windows Docker-image

De eerste taak die moet worden uitgevoerd, is het downloaden van een “sjabloon” of basisafbeelding. Je zult later je eigen Docker-afbeelding bouwen, maar eerst heb je een afbeelding nodig om mee te beginnen. Je zult de nieuwste IIS- en Windows Server Core-afbeeldingen downloaden die nodig zijn voor deze tutorial. De bijgewerkte lijst met afbeeldingen is te vinden op de officiële Microsoft Docker-hub-afbeeldingspagina.

Het beoordelen van de huidige Docker-basisafbeeldingen

Voordat je de afbeelding uit het afbeeldingenarchief downloadt, laten we eerst de huidige Docker-basisafbeeldingen bekijken die je momenteel op je lokale systeem hebt. Voer hiervoor een PowerShell-console uit als Administrator en typ vervolgens docker images. Deze opdracht geeft alle afbeeldingen op je lokale systeem terug.

Zoals je hieronder kunt zien, zijn de beschikbare afbeeldingen aanvankelijk leeg.

PS51> docker images
Docker Build Tag : Listing available Docker images

Het downloaden van de basisafbeelding

Nu is het tijd om de basis IIS-image te downloaden van Docker Hub. Voer hiervoor het volgende commando uit: docker pull, zoals hieronder getoond. Dit proces kan enige tijd duren, afhankelijk van de snelheid van je internetverbinding.

PS51> docker pull mcr.microsoft.com/windows/servercore/iis
Downloading an image from the Docker Hub

Voer nu docker images uit en je zou het nieuwste Microsoft Windows Core IIS-image beschikbaar moeten hebben voor deze tutorial.

PS51> docker images
Viewing available Docker images

Inspecteer het Dockerfile

In een eerdere stap heb je een bestaand Dockerfile gedownload voor deze tutorial. Laten we nu eens kijken naar wat dat precies inhoudt.

Open het bestand C:\Containers\Container1\Dockerfile in je favoriete editor. De inhoud van dit Dockerfile wordt gebruikt om te definiëren hoe het containerimage wordt geconfigureerd tijdens het bouwen.

Je kunt een uitleg zien van wat elk stukje van dit bestand doet in de in-line opmerkingen.

# Geeft aan dat de nieuwste Microsoft/IIS-image als basisimage zal worden gebruikt
# Wordt gebruikt om aan te geven welk basiscontainerimage door het bouwproces zal worden gebruikt.

# Let op dat de naamconventie is "**eigenaar/toepassingsnaam: tag-naam**"
# (weergegeven als microsoft/iis:latest); dus in ons geval is de eigenaar van het image
# Microsoft en de toepassing is IIS met de "latest" tag-naam die wordt gebruikt
# om aan te geven dat je het meest recente beschikbare imageversie wilt ophalen.
FROM microsoft/iis:latest

# Kopieert de inhoud van de wwwroot-map naar de inetpub/wwwroot-map in het nieuwe containerimage
# Wordt gebruikt om aan te geven dat je de WWWroot-map naar de IIS inetpub WWWroot wilt kopiëren
# map in de container. Je hoeft het volledige pad naar je lokale bestanden niet op te geven
# omdat Docker al de ingebouwde logica heeft om bestanden en mappen te refereren
# relatief aan de locatie van het Docker-bestand op jouw systeem. Merk ook op dat
# Docker alleen schuine strepen herkent voor bestandspaden - omdat dit een
# op Windows gebaseerde container is in plaats van Linux.
COPY wwwroot c:/inetpub/wwwroot

# Voer enkele PowerShell-commando's uit binnen de nieuwe container om het image op te zetten

# Voer de PowerShell-commando's uit om de standaard IIS-bestanden te verwijderen en een nieuwe
# toepassingspool genaamd TestPool te maken
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.htm -force
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.png -force
RUN powershell Import-Module WebAdministration
RUN powershell New-WebAppPool -Name 'TestPool'

# Opent poort 80 op het nieuwe containerimage
# Wordt gebruikt om TCP-poort 80 te openen voor het toestaan van een http-verbinding met de website.
# Deze regel is echter uitgeschakeld, omdat de IIS-container deze poort al
# standaard open heeft.
#EXPOSE 80

# Stelt de hoofdopdracht van het containerimage in
# Hiermee wordt het image verteld om een servicemonitor voor de w3svc-service uit te voeren.
# Wanneer dit is gespecificeerd, stopt de container automatisch met draaien
# als de w3svc-service stopt. Deze regel is uitgeschakeld vanwege de
# IIS-container heeft deze entrypoint al standaard ingesteld.
#ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]

Het bouwen van een nieuwe Docker-image

Je hebt het Docker-bestand klaar staan en een basis-IIS-image gedownload. Nu is het tijd om je nieuwe Docker-image te bouwen met behulp van het Docker-bestand.

Om een nieuwe image te bouwen, gebruik je het docker build "tag"-commando. Dit commando maakt de image aan. Voor dit artikel zie je hieronder dat je ook de -t **-optie gebruikt, die het “tag”-gedeelte vervangt. Deze optie stelt je in staat om je nieuwe image een vriendelijke tag-naam te geven en ook naar het Docker-bestand te verwijzen door het map-pad op te geven waar het zich bevindt.

Hieronder zie je een voorbeeld van het zorgen dat de console zich in de C:\Containers-map bevindt en vervolgens het bouwen van een nieuwe image vanuit het Docker-bestand in de C:\Containers\Container1-map.

PS51> cd C:\Containers
PS51> docker build -t container1 .\Container1

Zodra gestart, kun je de voortgang van het commando zien terwijl het elke instructie in het dockerbestand regel voor regel doorloopt:

Building a progress of the command as it traverses each instruction in the docker filenew Docker image

Zodra voltooid, zou je nu een nieuwe Docker-image moeten hebben!

Voer nu het docker images-commando uit om de beschikbare images te bekijken. Hieronder zie je een voorbeeld van de aangemaakte container1-image.

Viewing available Docker images

Opmerking: het docker build —help-commando is een handige parameter om gedetailleerde informatie over het uitgevoerde dockercommando weer te geven.

Het uitvoeren van de Docker-container

Op dit punt zou je een nieuwe image moeten hebben aangemaakt. Het is tijd om een container op te starten met behulp van die image. Gebruik het docker run-commando om een nieuwe container te starten.

De docker run opdracht zal een nieuwe Docker-container starten op basis van de container1 afbeelding die je eerder hebt aangemaakt. Je kunt hieronder een voorbeeld hiervan zien.

Merk op dat de -d parameter wordt gebruikt. Dit vertelt de Docker-runtime om de afbeelding te starten in de losgekoppelde modus en vervolgens af te sluiten wanneer het rootproces dat wordt gebruikt om de container uit te voeren, wordt afgesloten.

Wanneer docker run is voltooid, geeft het de ID terug van de gemaakte container. Het voorbeeld hieronder vangt deze ID op in een $containerID variabele zodat we er later gemakkelijk naar kunnen verwijzen.

PS51> $containerID = docker run -d container1
PS51> $containerID
Running a Docker container

Zodra de container is gestart, voer je nu de docker ps opdracht uit. Deze opdracht stelt je in staat om te zien welke containers momenteel draaien met behulp van elke afbeelding. Let hieronder op dat de draaiende afbeelding automatisch een bijnaam krijgt (busy_habit in dit geval). Deze bijnaam wordt soms gebruikt in plaats van de container-ID om de container te beheren.

Listing running Docker containers

Code uitvoeren binnen een Docker-container

A new container is built from a new image you just created. Let’s now start actually using that container to run code. Running code inside of a Docker container is done using the docker exec command.

In dit voorbeeld, voer docker exec uit om de PowerShell-uitvoer voor de Get-ChildItem opdracht in de container te bekijken met de onderstaande opdrachtsyntax. Dit zal ervoor zorgen dat de instructies in het Dockerfile om de standaard IIS-bestanden te verwijderen zijn gelukt.

PS51> docker exec $containerID powershell Get-ChildItem c:\inetpub\wwwroot

Je kunt hieronder zien dat het enige bestand dat bestaat index.html is, wat betekent dat de standaardbestanden zijn verwijderd.

Running PowerShell commands in a Docker container

Voer nu de ipconfig opdracht uit in de container om het lokale IP-adres van de containerafbeelding te krijgen, zodat je kunt proberen verbinding te maken met de IIS-website.

PS51> docker exec $containerID ipconfig

Je kunt hieronder zien dat ipconfig is uitgevoerd in de container, net zoals het zou worden uitgevoerd op je lokale computer, en alle IP-informatie heeft teruggegeven.

Running ipconfig in a Docker container

Inspecteer de IIS-website

Het is nu tijd om de vruchten van je werk te onthullen! Het is tijd om te zien of de IIS-server die in de Docker-container draait, de index.html-pagina correct serveert.

Open een browser en plak het IPv4-adres dat is gevonden via ipconfig in de adresbalk. Als alles goed is, zou je een Hello World!! bericht moeten zien zoals hieronder.

IIS webpage running in a Docker container

Beoordeling van Docker-geschiedenis

Een handige opdracht om te gebruiken bij het werken met Docker-containers is de docker history-opdracht. Hoewel niet noodzakelijk gerelateerd aan het maken van een image of container zelf, is de docker history-opdracht een nuttige opdracht waarmee je wijzigingen kunt bekijken die zijn aangebracht in de containerimage.

PS51> docker history container1

Je kunt hieronder zien dat docker history alle Dockerfile- en PowerShell-activiteiten retourneert die zijn uitgevoerd op de container1 container waaraan je hebt gewerkt.

Inspecting container changes with docker history

Opschonen van draaiende Docker-images

De onderstaande stappen worden gebruikt om alle gestopte containers op je machine op te ruimen. Dit zal schijfruimte en systeembronnen vrijmaken.

Voer de docker ps-opdracht uit om een lijst van de containers die op je systeem draaien te bekijken:

PS51> docker ps
Viewing available Docker containers

Stop vervolgens de draaiende containers met de docker stop-opdracht:

PS51> docker stop <image nick name: busy_haibt in my case>
PS51> docker stop <image nick name: unruffled_driscoll in my case>
Stopping Docker containers

Tenslotte kun je de gestopte containers permanent verwijderen met de docker system prune-opdracht.

PS51> docker system prune
Removing Docker images

Verder lezen

Source:
https://adamtheautomator.com/docker-build-tag/