Wie man ein Docker-Windows-Image mit Docker-Build-Tag erstellt

Bist du neu bei Docker Windows Images? Arbeitest du derzeit in einem Windows-Shop und möchtest mehr über Docker-Builds für Container-Images erfahren? Du bist hier genau richtig. Der beste Weg, etwas Neues zu lernen, ist durch praktische Anwendung mit den `docker build` und `docker build „tag“` Befehlen!

In diesem Artikel lernst du, wie du dein erstes Windows Docker-Image aus einer Dockerfile mit dem `docker build` Befehl erstellst.

Lass uns loslegen!

Verständnis von Docker-Container-Images

Jahrelang war der einzige Weg, um Tests durchzuführen oder Entwicklung auf mehreren Betriebssystemen (OS) durchzuführen, die Verwendung mehrerer dedizierter physischer oder virtueller Maschinen, die mit der OS-Version Ihrer Wahl gebootet wurden. Diese Methodik erforderte mehr Hardware und Aufwand, um neue Maschinen für jede Software- und OS-Spezifikation bereitzustellen.

Heutzutage ist jedoch die Verwendung von Docker Container-Images teilweise auf die Popularität der Microservice-Architektur zurückzuführen. Als Reaktion auf den Anstieg der Popularität von Docker unterstützt Microsoft öffentlich Docker-Images für mehrere Flaggschiffprodukte auf ihrer Docker Hub-Seite. Sie haben sogar die native Unterstützung für Bilder für Windows als Produktmerkmal in Windows 10 und Windows Server 2016 hinzugefügt!

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

Verständnis von Docker Build und Images

Der docker build-Befehl kann genutzt werden, um die automatische Erstellung von Container-Images zu ermöglichen, eine Container-als-Code-DevOps-Praxis zu übernehmen und die Containerisierung in den Entwicklungszyklus Ihrer Projekte zu integrieren. Dockerfiles sind einfach Textdateien, die Build-Anweisungen enthalten, die von Docker verwendet werden, um ein neues Container-Image zu erstellen, das auf einem vorhandenen Image basiert.

Der Benutzer kann das Basisimage und die Liste der Befehle angeben, die ausgeführt werden sollen, wenn ein Container-Image bereitgestellt oder beim ersten Start ausgeführt wird. In diesem Artikel erfahren Sie, wie Sie ein Windows-basiertes Docker-Image aus einer Dockerdatei mithilfe eines Windows-Containers erstellen.

Dieser Prozess bietet mehrere Vorteile gegenüber der Verwendung eines vorgefertigten Container-Images:

  1. Sie können ein Container-Image für mehrere Versionen von Windows neu erstellen, was für das Testen von Codeänderungen auf verschiedenen Plattformen großartig ist.
  2. Sie haben mehr Kontrolle darüber, was im Container installiert ist. Dies ermöglicht es Ihnen, die Größe Ihres Containers auf ein Minimum zu reduzieren.
  3. Aus Sicherheitsgründen möchten Sie möglicherweise den Container auf Sicherheitslücken überprüfen und die Sicherheit des Basisimages erhöhen.

Voraussetzungen/Anforderungen

Dieser Artikel ist eine Anleitung zum Erlernen des Aufbaus eines Docker-Images mithilfe einer Dockerdatei. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie die folgenden Voraussetzungen erfüllen.

Hinweis: Stellen Sie sicher, dass bei der Installation von Docker die Konfiguration für Windows-Container aktiviert ist.

Vorbereitung

Sie benötigen zunächst einen Ordner, um alle Docker-Images und Container zu speichern, die Sie aus diesen Images erstellen werden. Öffnen Sie dazu ein PowerShell- oder Cmd-Terminal (im Verlauf dieses Artikels wird ausschließlich PowerShell verwendet) und erstellen Sie ein neues Verzeichnis namens C:\Containers.

Nachdem der Ordner erstellt wurde, wechseln Sie zu diesem Verzeichnis. Dadurch wird das aktuelle Arbeitsverzeichnis der Konsole auf C:\Containers gesetzt, um alle Downloads standardmäßig in dieses Verzeichnis zu speichern.

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

In diesem Artikel erhalten Sie einen Vorsprung. Die meisten Dateien für dieses Projekt sind bereits verfügbar. Sobald der Ordner erstellt ist, führen Sie einen Git pull aus, um die für diesen Artikel benötigten Dateien aus dem TechSnips Github-Repository in den Ordner C:\Containers zu kopieren. Überprüfen Sie anschließend, ob der Ordner C:\Containers wie unten aussieht.

Tutorial files

Herunterladen des IIS Windows Docker-Images

Die erste Aufgabe besteht darin, ein „Template“ oder Basismodell herunterzuladen. Sie werden später Ihr eigenes Docker-Image erstellen, aber zuerst benötigen Sie ein Bild, um zu beginnen. Sie werden die neuesten IIS- und Windows Server Core-Bilder herunterladen, die für dieses Tutorial erforderlich sind. Die aktualisierte Liste der Bilder finden Sie auf der offiziellen Microsoft Docker-Hub-Bildseite.

Überprüfen der aktuellen Docker-Basisbilder

Bevor Sie das Bild aus dem Bild-Repository herunterladen, überprüfen wir zunächst die aktuellen Docker-Basisbilder, die sich derzeit auf Ihrem lokalen System befinden. Führen Sie dazu eine PowerShell-Konsole als Administrator aus und geben Sie dann docker images ein. Dieser Befehl gibt alle Bilder auf Ihrem lokalen System zurück.

Wie unten zu sehen ist, sind die verfügbaren Bilder zunächst leer.

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

Herunterladen des Basisbildes

Jetzt ist es an der Zeit, das Basis-IIS-Image von Docker Hub herunterzuladen. Führen Sie dazu den Befehl docker pull wie unten gezeigt aus. Dieser Vorgang kann je nach Internetgeschwindigkeit einige Zeit in Anspruch nehmen.

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

Führen Sie nun docker images aus, und Sie sollten das neueste Microsoft Windows Core IIS-Image für dieses Tutorial verfügbar haben.

PS51> docker images
Viewing available Docker images

Überprüfung des Dockerfile

In einem früheren Schritt haben Sie ein vorhandenes Dockerfile für dieses Tutorial heruntergeladen. Schauen wir uns nun genau an, was das bedeutet.

Öffnen Sie die Datei C:\Containers\Container1\Dockerfile in Ihrem bevorzugten Editor. Der Inhalt dieses Dockerfiles wird verwendet, um zu definieren, wie das Container-Image zur Build-Zeit konfiguriert wird.

Sie können eine Erklärung sehen, was jeder Abschnitt dieser Datei in den Inline-Kommentaren bewirkt.

# Gibt an, dass das neueste Microsoft/IIS-Abbild als Basisbild verwendet wird
# Wird verwendet, um anzugeben, welches Basiscontainerabbild im Buildprozess verwendet wird.

# Beachten Sie, dass die Namenskonvention "**Besitzer/Anwendungsname: Tag-Name**" lautet
# (angezeigt als microsoft/iis:latest); also ist in unserem Fall der Besitzer des Abbilds
# Microsoft und die Anwendung ist IIS mit dem Tag-Namen "latest", der verwendet wird,
# um anzugeben, dass Sie die neueste verfügbare Abbildversion abrufen werden.
FROM microsoft/iis:latest

# Kopiert den Inhalt des wwwroot-Ordners in den inetpub/wwwroot-Ordner im neuen Container-Abbild
# Wird verwendet, um anzugeben, dass Sie den WWWroot-Ordner in den IIS inetpub WWWroot kopieren möchten
# Ordner im Container. Sie müssen nicht den vollständigen Pfad zu Ihren lokalen angeben
# Dateien, da Docker bereits die Logik eingebaut hat, um Dateien und Ordner zu referenzieren
# relativ zum Docker-Dateistandort auf Ihrem System. Beachten Sie auch, dass
# Docker nur Schrägstriche für Dateipfade erkennt - da es sich um einen
# Windows-basierten Container handelt, nicht um Linux.
COPY wwwroot c:/inetpub/wwwroot

# Führen Sie einige PowerShell-Befehle im neuen Container aus, um das Abbild einzurichten

# Führen Sie die PowerShell-Befehle aus, um die Standard-IIS-Dateien zu entfernen und einen neuen
# Anwendungspool namens TestPool zu erstellen
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'

# Port 80 auf dem neuen Container-Abbild freigeben
# Wird verwendet, um TCP-Port 80 zu öffnen, um eine HTTP-Verbindung zur Website zu ermöglichen.
# Diese Zeile ist jedoch auskommentiert, da der IIS-Container diesen Port
# bereits standardmäßig geöffnet hat.
#EXPOSE 80

# Legt den Hauptbefehl des Container-Abbilds fest
# Dies teilt dem Abbild mit, dass ein Dienstmonitor für den w3svc-Dienst ausgeführt werden soll.
# Wenn dies angegeben ist, wird der Container automatisch gestoppt,
# wenn der w3svc-Dienst angehalten wird. Diese Zeile ist auskommentiert, weil der
# IIS-Container diesen Einstiegspunkt bereits standardmäßig hat.
#ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]

Erstellen eines neuen Docker-Images

Sie haben bereits die Dockerfile bereit und ein Basis-IIS-Image heruntergeladen. Jetzt ist es an der Zeit, Ihr neues Docker-Image mit Hilfe der Dockerfile zu erstellen.

Um ein neues Image zu erstellen, verwenden Sie den Befehl docker build "tag". Dieser Befehl erstellt das Image. In diesem Artikel verwenden Sie auch die Option -t **, die den „tag“-Teil ersetzt. Diese Option ermöglicht es Ihnen, Ihrem neuen Image einen freundlichen Tag-Namen zu geben und auch auf die Dockerfile zu verweisen, indem Sie den Ordnerpfad angeben, in dem sie sich befindet.

Im Folgenden sehen Sie ein Beispiel dafür, wie Sie sicherstellen können, dass die Konsole im Verzeichnis C:\Containers ist und dann ein neues Image aus der Dockerfile im Verzeichnis C:\Containers\Container1 erstellen.

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

Sobald gestartet, können Sie den Fortschritt des Befehls sehen, während er jede Anweisung in der Dockerfile Zeile für Zeile durchläuft:

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

Wenn alles erledigt ist, sollten Sie jetzt ein neues Docker-Image haben!

Führen Sie nun den Befehl docker images aus, um die verfügbaren Images anzuzeigen. Im folgenden Beispiel sehen Sie das erstellte Image container1.

Viewing available Docker images

Hinweis: Der Befehl docker build —help ist ein nützlicher Parameter, um detaillierte Informationen über den ausgeführten Docker-Befehl anzuzeigen.

Ausführen des Docker-Containers

Zu diesem Zeitpunkt sollten Sie ein neues Image erstellt haben. Es ist an der Zeit, einen Container mit diesem Image zu starten. Verwenden Sie dazu den Befehl docker run.

Der Befehl docker run startet einen neuen Docker-Container basierend auf dem zuvor erstellten container1-Image. Ein Beispiel dafür sehen Sie unten.

Beachten Sie, dass der Parameter -d verwendet wird. Dies teilt dem Docker-Laufzeitmodul mit, das Bild im abgetrennten Modus zu starten und dann zu beenden, wenn der Root-Prozess, der zum Ausführen des Containers verwendet wird, beendet ist.

Wenn docker run abgeschlossen ist, gibt es die ID des erstellten Containers zurück. Im folgenden Beispiel wird diese ID in eine $containerID-Variable eingefangen, damit wir später einfach darauf verweisen können.

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

Sobald der Container gestartet ist, führen Sie den Befehl docker ps aus. Dieser Befehl ermöglicht es Ihnen, die Container anzuzeigen, die derzeit unter Verwendung jedes Bilds ausgeführt werden. Beachten Sie unten, dass dem laufenden Bild automatisch ein Spitzname (busy_habit in diesem Fall) zugewiesen wird. Dieser Spitzname wird manchmal anstelle der Container-ID verwendet, um den Container zu verwalten.

Listing running Docker containers

Ausführen von Code innerhalb eines Docker-Containers

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 diesem Beispiel führen Sie docker exec aus, um die PowerShell-Ausgabe für den Befehl Get-ChildItem im Container mithilfe der folgenden Befehlssyntax anzuzeigen. Dadurch wird sichergestellt, dass die Anweisungen in der Docker-Datei zum Entfernen der Standard-IIS-Dateien erfolgreich waren.

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

Sie können unten sehen, dass die einzige vorhandene Datei index.html ist, was bedeutet, dass die Standarddateien entfernt wurden.

Running PowerShell commands in a Docker container

Führen Sie nun den Befehl ipconfig im Container aus, um die lokale IP-Adresse des Containerbilds zu erhalten, damit Sie versuchen können, eine Verbindung zur IIS-Website herzustellen.

PS51> docker exec $containerID ipconfig

Sie können unten sehen, dass ipconfig im Container ausgeführt wurde, als ob es auf Ihrem lokalen Computer ausgeführt würde, und alle IP-Informationen zurückgegeben hat.

Running ipconfig in a Docker container

Inspektion der IIS-Website

Jetzt ist es an der Zeit, die Früchte Ihrer Arbeit zu enthüllen! Es ist Zeit zu sehen, ob der IIS-Server, der im Docker-Container läuft, die index.html-Seite ordnungsgemäß bereitstellt.

Öffnen Sie einen Browser und fügen Sie die über ipconfig gefundene IPv4-Adresse in die Adressleiste ein. Wenn alles gut läuft, sollten Sie eine Hello World!! Nachricht wie unten sehen.

IIS webpage running in a Docker container

Überprüfung des Docker-Verlaufs

Ein nützlicher Befehl, der beim Arbeiten mit Docker-Containern verwendet wird, ist der docker history Befehl. Obwohl er nicht unbedingt mit der Erstellung eines Abbilds oder eines Containers selbst zusammenhängt, ist der docker history Befehl ein nützlicher Befehl, der es Ihnen ermöglicht, Änderungen am Container-Abbild zu überprüfen.

PS51> docker history container1

Sie können unten sehen, dass docker history alle Dockerfile- und PowerShell-Aktivitäten zurückgibt, die im container1 Container durchgeführt wurden, mit dem Sie gearbeitet haben.

Inspecting container changes with docker history

Bereinigen der ausgeführten Docker-Abbilder

Die folgenden Schritte werden verwendet, um alle gestoppten Container auf Ihrem Computer zu bereinigen. Dadurch werden Speicherplatz und Systemressourcen freigegeben.

Führen Sie den Befehl docker ps aus, um eine Liste der auf Ihrem System ausgeführten Container anzuzeigen:

PS51> docker ps
Viewing available Docker containers

Stoppen Sie nun die ausgeführten Container mit dem Befehl docker stop:

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

Schließlich können Sie die gestoppten Container dauerhaft mit dem Befehl docker system prune entfernen.

PS51> docker system prune
Removing Docker images

Weitere Informationen

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