Übung: Anpassen eines Docker-Images zum Ausführen Ihrer eigenen Web-App
Eine Dockerfile-Datei enthält die Schritte zum Erstellen eines benutzerdefinierten Docker-Images.
Sie möchten eine der Web-Apps Ihrer Organisation mithilfe von Docker bereitstellen. Sie wählen eine einfache Web-App aus, die eine Web-API für eine Hotelreservierungswebsite implementiert. Die Web-API macht HTTP POST- und GET-Vorgänge verfügbar, die Kundenbuchungen erstellen und abrufen.
Hinweis
In dieser Version der Web-App werden die Buchungen nicht persistent gespeichert, und Abfragen liefern Dummydaten.
In dieser Übung erstellen Sie eine Dockerfile-Datei für eine App, für die keine solche Datei vorhanden ist. Dann erstellen Sie das Image und führen es lokal aus.
Erstellen einer Dockerfile-Datei für die Web-App
Starten Sie Docker auf Ihrem Computer, falls das Programm noch nicht ausgeführt wird.
Führen Sie in einem Eingabeaufforderungsfenster auf Ihrem lokalen Computer den folgenden Befehl aus, um den Quellcode für die Web-App herunterzuladen.
git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
Geben Sie den folgenden Befehl ein, um das Verzeichnis
src
zu öffnen.cd mslearn-hotel-reservation-system/src
Geben Sie die folgenden Befehle im Verzeichnis
src
ein, um eine neue Datei mit dem NamenDockerfile
zu erstellen und im Editor zu öffnen:copy NUL Dockerfile notepad Dockerfile
Hinweis
Der Editor-Befehl öffnet standardmäßig eine Textdatei. Stellen Sie sicher, dass Sie den Dateityp All Files (Alle Dateien) ohne Dateierweiterung speichern. Um dies zu überprüfen, öffnen Sie den „src“-Ordner im Datei-Explorer, und wählen Sie „Ansicht“ > „Anzeigen“ > „Dateinamenerweiterungen“ aus. Benennen Sie die Datei bei Bedarf um, und entfernen Sie
.txt
aus dem Dateinamen.Fügen Sie dem Dockerfile den folgenden Code hinzu:
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 WORKDIR /src COPY ["/HotelReservationSystem/HotelReservationSystem.csproj", "HotelReservationSystem/"] COPY ["/HotelReservationSystemTypes/HotelReservationSystemTypes.csproj", "HotelReservationSystemTypes/"] RUN dotnet restore "HotelReservationSystem/HotelReservationSystem.csproj"
Dieser Code enthält Befehle zum Abrufen eines Images, dass das .NET Core SDK-Framework enthält. Die Dateien für das Web-App- (
HotelReservationSystem.csproj
) und das Bibliotheksprojekt (HotelReservationSystemTypes.csproj
) werden in den Ordner/src
kopiert, der sich im Container befindet. Über den Befehldotnet restore
werden die für diese Projekte erforderlichen Abhängigkeiten von NuGet heruntergeladen.Fügen Sie den folgenden Code am Ende des Dockerfiles an:
COPY . . WORKDIR "/src/HotelReservationSystem" RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
Diese Befehle kopieren den Quellcode für die Web-App in den Container und führen dann den Befehl „dotnet build“ aus, um die App zu erstellen. Die sich ergebenden DLLs werden in den Ordner
/app
im Container geschrieben.Fügen Sie den folgenden Befehl am Ende des Dockerfiles an.
RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
Der Befehl
dotnet publish
kopiert die ausführbaren Dateien für die Website in einen neuen Ordner und entfernt alle Zwischendateien. Die Dateien in diesem Ordner können dann für eine Website bereitgestellt werden.Fügen Sie die folgenden Befehle am Ende des Dockerfiles an.
EXPOSE 80 WORKDIR /app ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
Der erste Befehl öffnet Port 80 im Container. Der zweite Befehl führt den Verschiebevorgang in den Ordner
/app
aus, der die veröffentlichte Version der Web-App enthält. Der letzte Befehl gibt an, dass bei der Ausführung des Containers der Befehldotnet HotelReservationSystem.dll
ausgeführt werden soll. Diese Bibliothek enthält den kompilierten Code für die Web-App.Speichern Sie die Datei, und schließen Sie den Text-Editor. Stellen Sie sicher, dass Sie den Dateityp All Files (Alle Dateien) ohne Dateierweiterung speichern.
Erstellen und Bereitstellen des Images mithilfe der Dockerfile-Datei
Führen Sie an der Eingabeaufforderung den folgenden Befehl zum Erstellen des Images für die Beispiel-App mithilfe der Dockerfile-Datei aus. Vergessen Sie nicht den
.
am Ende des Befehls. Dieser Befehl erstellt das Image und speichert es lokal. Das Image erhält den Namenreservationsystem
. Stellen Sie sicher, dass das Image erfolgreich erstellt wurde. Eine Warnung zu Datei- und Verzeichnisberechtigungen kann angezeigt werden, wenn der Vorgang abgeschlossen ist. Sie können diese Warnung im Rahmen dieser Übung ignorieren. Die Erstellung des Images kann einen Moment dauern.docker build -t reservationsystem .
Führen Sie den folgenden Befehl aus, um zu überprüfen, ob das Image erstellt und in der lokalen Registrierung gespeichert wurde:
docker image list
Das Image trägt den Namen
reservationsystem
. Sie sehen auch ein Image namens microsoft/dotnet:REPOSITORY TAG IMAGE ID CREATED SIZE reservationsystem latest d2501f0f2ced About a minute ago 1.76GB
Testen der Web-App
Geben Sie den folgenden Code ein, um einen Container mithilfe des Images
reservationsystem
auszuführen. Docker gibt eine lange Kette von Hexadezimalziffern zurück. Der Container wird im Hintergrund ohne Benutzeroberfläche ausgeführt. Port 80 im Container wird Port 8080 auf dem Hostcomputer zugeordnet. Der Container heißtreservations
.docker run -p 8080:80 -d --name reservations reservationsystem
Starten Sie einen Webbrowser, und navigieren Sie zu
http://localhost:8080/api/reservations/1
. Es sollte ein JSON-Objekt mit den Daten für die Reservierungsnummer 1 ähnlich der folgenden Ausgabe angezeigt werden:Ersetzen Sie die „1“ am Ende der Localhost-URL durch eine andere Reservierungsnummer (z. B. 2 oder 20), um die entsprechenden Reservierungsdetails anzuzeigen.
Geben Sie den folgenden Befehl ein, um den Status des Containers anzuzeigen:
docker ps -a
Die Ausgabe listet für alle verfügbaren Container Folgendes auf:
- CONTAINER ID
- BILD
- COMMAND
- CREATED-Zeitpunkt
- STATUS
- PORTS
- NAMES
Überprüfen Sie, ob der
STATUS
des Containers Aktiv ist.CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 07b0d1de4db7 reservationsystem "dotnet HotelReserva…" 5 minutes ago Up 5 minutes 0.0.0.0:8080->80/tcp reservations
Geben Sie den folgenden Befehl ein, um den Container reservations (Reservierungen) zu beenden:
docker container stop reservations
Löschen Sie den Container reservations aus der lokalen Registrierung.
docker rm reservations
Belassen Sie den Container reservationsystem in der lokalen Registrierung. Sie verwenden dieses Image in der nächsten Übung.
Herzlichen Glückwunsch! Sie haben ein Image für Ihre Web-App erstellt und es mithilfe eines Docker-Containers ausgeführt.