Abrufen eines vorhandenen Docker-Images und lokale Bereitstellung

Abgeschlossen

Docker ist eine Technologie, mit der Sie Anwendungen und Dienste schnell und einfach bereitstellen können. Eine Docker-App wird mithilfe eines Docker-Images ausgeführt. Ein Docker-Image ist eine vorkonfigurierte Umgebung, die den Anwendungscode und die Umgebung enthält, in der der Code ausgeführt wird.

In dem zuvor beschriebenen Unternehmensszenario möchten Sie die Machbarkeit des Packens und der Ausführung einer App mit Docker untersuchen. Sie entscheiden sich für die Erstellung und Bereitstellung eines Docker-Images mit einer Test-Web-App.

In diesem Abschnitt erfahren Sie mehr über die wichtigsten Konzepte und Prozesse beim Ausführen einer containerisierten App, die in einem Docker-Image gespeichert ist.

Übersicht über Docker

Docker ist ein Tool zum Ausführen von containerisierten Apps. Eine containerisierte App beinhaltet die App und das Dateisystem, das die Umgebung bereitstellt, in der sie ausgeführt wird. Eine containerisierte App kann beispielsweise eine Datenbank und andere zugehörige Software und Konfigurationsinformationen enthalten, die zum Ausführen der App erforderlich sind.

Eine containerisierte App hat in der Regel einen viel geringeren Speicherbedarf als ein virtueller Computer, der für die Ausführung derselben App konfiguriert ist. Dieser geringere Speicherbedarf ist darauf zurückzuführen, dass ein virtueller Computer das gesamte Betriebssystem und die zugehörige unterstützende Umgebung bereitstellen muss. Bei einem Docker-Container entfällt dieser Mehraufwand, da Docker den Betriebssystemkernel des Hostcomputers verwendet, um den Container zu betreiben. Das Herunterladen und Starten eines Docker-Images ist viel schneller und platzsparender als das Herunterladen und Ausführen eines virtuellen Computers, der ähnliche Funktionen bietet.

Sie erstellen eine containerisierte App, indem Sie ein Image erstellen, das eine Gruppe von Dateien und einen von Docker verwendeten Abschnitt mit Konfigurationsinformationen enthält. Sie führen die App aus, indem Sie Docker anweisen, einen Container basierend auf dem Image zu starten. Wenn der Container gestartet wird, verwendet Docker die Imagekonfiguration, um festzustellen, welche Anwendung innerhalb des Containers ausgeführt werden soll. Docker bietet die Betriebssystemressourcen und die notwendige Sicherheit. Der Dienst stellt sicher, dass Container gleichzeitig ausgeführt werden und relativ isoliert bleiben.

Wichtig

Docker bietet nicht den Isolierungsgrad, der bei virtuellen Computern verfügbar ist. Ein virtueller Computer implementiert die Isolierung auf Hardwareebene. Docker-Container nutzen zugrunde liegende Betriebssystemressourcen und Bibliotheken gemeinsam. Docker stellt jedoch sicher, dass ein Container nicht auf die Ressourcen eines anderen Containers zugreifen kann, es sei denn, die Container sind dafür konfiguriert.

Sie können Docker auf Ihrem Desktop- oder Laptopcomputer ausführen, wenn Sie lokal entwickeln und testen. Für Produktionssysteme ist Docker für Serverumgebungen verfügbar, darunter viele Varianten von Linux und Microsoft Windows Server 2016. Viele Hersteller unterstützen auch Docker in der Cloud. Beispielsweise können Sie Docker-Images in Azure Container Registry speichern und Container mit Azure Container Instances ausführen.

In diesem Modul verwenden Sie Docker lokal, um ein Image zu erstellen und auszuführen. Anschließend laden Sie das Image in Azure Container Registry hoch und führen es in einer Azure-Containerinstanz aus. Diese Version von Docker eignet sich für die lokale Entwicklung und das Testen von Docker-Images.

Linux- und Windows-Docker-Images

Docker wurde zunächst für Linux entwickelt und dann erweitert, damit Windows unterstützt wird. Einzelne Docker-Images sind Windows-basiert oder Linux-basiert, jedoch nicht beides gleichzeitig. Das Betriebssystem des Images bestimmt, welche Art von Betriebssystemumgebung innerhalb des Containers verwendet wird.

Autoren von Docker-Images, die eine ähnliche Funktionalität sowohl in Linux- als auch in Windows-basierten Images anbieten möchten, können diese Images separat erstellen. Microsoft bietet beispielsweise Windows- und Linux-Docker-Images mit einer ASP.NET-Core-Umgebung an, die als Grundlage für containerisierte ASP.NET-Core-Anwendungen verwendet werden können.

Linux-Computer, auf denen Docker installiert ist, können nur Linux-Container ausführen. Windows-Computer, auf denen Docker installiert ist, können beide Arten von Containern ausführen. Windows führt beide durch die Verwendung eines virtuellen Computers zum Ausführen eines Linux-Systems aus und nutzt das virtuelle Linux-System, um Linux-Container auszuführen.

In diesem Modul erstellen Sie ein Linux-basiertes Image und führen es aus.

Docker-Registrierungen und Docker Hub

Docker-Images werden in Registrierungen gespeichert und zur Verfügung gestellt. Eine Registrierung ist ein Webdienst, mit dem Docker zum Hoch- und Herunterladen von Containerimages eine Verbindung herstellen kann. Die bekannteste Registrierung ist Docker Hub, eine öffentliche Registrierung. Viele Einzelpersonen und Unternehmen veröffentlichen Images in Docker Hub, und Sie können diese Images herunterladen und ausführen, indem Sie Docker auf Ihrem Desktop, auf einem Server oder in der Cloud ausführen. Sie können ein Docker Hub-Konto erstellen und Ihre Images dort kostenlos hochladen.

Eine Registrierung ist als eine Reihe von Repositorys organisiert. Jedes Repository enthält mehrere Docker-Images, die einen gemeinsamen Namen und im Allgemeinen den gleichen Zweck und die gleiche Funktionalität haben. Diese Images weisen normalerweise verschiedene Versionen auf, die mit einem Tag gekennzeichnet sind. Dieser Mechanismus ermöglicht es Ihnen, aus Kompatibilitätsgründen mehrere Versionen von Images zu veröffentlichen und zu speichern. Wenn Sie ein Image herunterladen und ausführen, müssen Sie die Registrierung, das Repository und das Versionstag für das Image angeben. Tags sind Textbezeichnungen, und Sie können Ihr Versionsnummerierungssystem verwenden (v1.0, v1.1, v1.2, v2.0 usw.).

Angenommen, Sie möchten das Docker-Image für die ASP.NET Core Runtime verwenden. Dieses Image ist in zwei Versionen verfügbar:

  • mcr.microsoft.com/dotnet/core/aspnet:2.2
  • mcr.microsoft.com/dotnet/core/aspnet:2.1

Nehmen wir weiter an, Sie möchten die Docker-Images für .NET Core-Beispiele verwenden. Hier stehen vier Versionen zur Auswahl:

  • mcr.microsoft.com/dotnet/samples:dotnetapp
  • mcr.microsoft.com/dotnet/samples:aspnetapp

Hinweis

Einem einzelnen Image können mehrere Tags zugewiesen werden. Gemäß der Konvention wird der neuesten Version eines Images zusätzlich zu einem Tag, das dessen Versionsnummer beschreibt, das Tag latest zugewiesen. Wenn Sie eine neue Version eines Images freigeben, können Sie das Tag latest neu zuweisen, damit es auf das neue Image verweist.

Ein Repository ist auch die Einheit des Datenschutzes für ein Image. Wenn Sie ein Image nicht freigeben möchten, können Sie das Repository als privat erklären. Sie können anderen Benutzern, für die Sie das Image freigeben möchten, Zugriff gewähren.

Durchsuchen von Docker Hub und Pullen eines Images

Hinweis

Sie müssen keines der Beispiele noch den Code in den folgenden Abschnitten ausführen. Darum geht es in der nächsten Lerneinheit.

Häufig gibt es in Docker Hub ein Image, das mit dem Typ der Anwendung, die Sie containerisieren möchten, sehr genau übereinstimmt. Sie können ein solches Image herunterladen und mit Ihrem Anwendungscode erweitern.

Docker Hub enthält viele Tausend Images. Sie können eine Registrierung mithilfe von Docker über die Befehlszeile oder die Docker Hub-Website suchen und durchsuchen. Auf der Website können Sie Images nach Typ und Herausgeber suchen, filtern und auswählen. In der folgenden Abbildung sehen Sie ein Beispiel für die Suchseite.

Screenshot der Docker Hub-Suchseite mit aufgelisteten unterschiedlichen Containerimages.

Zum Abrufen eines Images verwenden Sie den Befehl docker pull mit dem Imagenamen. Wenn Sie nur den Repositorynamen angeben, lädt Docker standardmäßig das mit latest gekennzeichnete Image aus diesem Repository auf Docker Hub herunter. Sie können aber den Befehl ändern, um unterschiedliche Tags und aus verschiedenen Repositorys abzurufen. In diesem Beispiel wird das Image mit dem Tag aspnetapp aus dem Repository mcr.microsoft.com/dotnet/core/samples:aspnetapp abgerufen. Dieses Image enthält eine einfache ASP.NET Core-Web-App.

Hinweis

Die Beispiele in dieser Einheit sollen die Syntax der verschiedenen Docker-Befehle zeigen. Sie müssen diese Befehle beim Lesen dieser Einheit nicht ausführen. Die Übungen, die auf diese Einheit folgen, führen Sie schrittweise durch das direkte Arbeiten mit Docker.

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp

Wenn Sie ein Image abrufen, speichert Docker es lokal und stellt es für die Ausführung von Containern zur Verfügung. Sie können die Images in Ihrer lokalen Registrierung mit dem Befehl docker image list anzeigen.

docker image list

Die Ausgabe sieht wie folgt aus:

REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples   aspnetapp           6e2737d83726        6 days ago          263MB

Sie verwenden die Imagenamen-ID, um auf das Image in vielen anderen Docker-Befehlen zu verweisen.

Ausführen eines Docker-Containers

Verwenden Sie den Befehl docker run, um einen Container zu starten. Geben Sie das auszuführende Image über seinen Namen oder die ID an Wenn Sie das Image noch nicht mit docker pull abgerufen haben, übernimmt Docker dies für Sie.

docker run mcr.microsoft.com/dotnet/samples:aspnetapp

In diesem Beispiel antwortet der Befehl mit der folgenden Meldung:

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
 No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

Dieses Image enthält eine Web-App, sodass sie jetzt auf Anforderungen an HTTP-Port 80 lauscht. Wenn Sie aber einen Webbrowser öffnen und zu http://localhost:80 navigieren, wird die App nicht angezeigt.

Standardmäßig erlaubt Docker nicht, dass eingehende Netzwerkanforderungen Ihren Container erreichen. Sie müssen Docker anweisen, eine bestimmte Portnummer von Ihrem Computer einer bestimmten Portnummer im Container zuzuweisen, indem Sie die Option -p zu docker run hinzufügen. Diese Anweisung ermöglicht Netzwerkanforderungen für den Container an dem angegebenen Port.

Außerdem soll die Web-App in diesem Image nicht interaktiv über die Befehlszeile genutzt werden können. Wenn wir sie starten, möchten wir, dass Docker sie im Hintergrund startet und einfach nur ausführt. Verwenden Sie das Flag -d, um Docker anzuweisen, die Web-App im Hintergrund zu starten.

Drücken Sie STRG+C, um das Image zu beenden und es dann neu zu starten, wie im folgenden Beispiel gezeigt:

docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp

Der Befehl ordnet Port 80 im Container Port 8080 auf Ihrem Computer zu. Wenn Sie die Seite http://localhost:8080 in einem Browser besuchen, sehen Sie die Beispiel-Web-App.

Screenshot: Ausführung der Beispiel-Web-App in einem Browser

Container und Dateien

Wenn ein ausgeführter Container Änderungen an den Dateien in seinem Image vornimmt, sind diese Änderungen nur in dem Container vorhanden, in dem die Änderungen vorgenommen werden. Wenn Sie keine besonderen Maßnahmen ergreifen, um den Zustand eines Containers beizubehalten, gehen diese Änderungen beim Entfernen des Containers verloren. Ebenso verwenden mehrere Container, die auf demselben Image basieren und gleichzeitig ausgeführt werden, nicht die Dateien im Image gemeinsam. Jeder Container verfügt über seine eigene unabhängige Kopie. Alle Daten, die von einem Container in sein Dateisystem geschrieben werden, sind für den anderen Container nicht sichtbar.

Es ist möglich, einem Container beschreibbare Volumes hinzuzufügen. Ein Volume stellt ein Dateisystem dar, das vom Container eingebunden und der im Container ausgeführten Anwendung zur Verfügung gestellt werden kann. Die Daten in einem Volume bleiben erhalten, wenn der Container beendet wird, und mehrere Container können das gleiche Volume gemeinsam verwenden. Die Details zum Erstellen und Verwenden von Volumes würden den Rahmen dieses Moduls sprengen.

Für Anwendungen, die mit Docker bereitgestellt werden, hat es sich bewährt, Änderungen am Imagedateisystem zu vermeiden. Verwenden Sie diese nur für temporäre Dateien, deren Verlust verschmerzbar ist.

Verwalten von Docker-Containern

Sie können aktive Container mit dem Befehl docker ps anzeigen.

docker ps

Die Ausgabe enthält den Status des Containers (Up, wenn er ausgeführt wird, Exited, wenn er beendet wurde, sowie andere Werte), die beim Start des Images angegebenen Befehlszeilenflags und weitere Informationen. Docker ermöglicht es Ihnen, mehrere Container aus demselben Image gleichzeitig auszuführen, sodass jedem Container eine eindeutige ID und ein eindeutiger, von Menschen lesbarer Name zugewiesen wird. Die meisten Docker-Befehle, die zur Verwaltung einzelner Container verwendet werden, können entweder die ID oder den Namen verwenden, um sich auf einen bestimmten Container zu beziehen.

In der folgenden Ausgabe sehen Sie zwei Container. Das Feld PORTS zeigt, dass der Container mit der ID elegant_ramanujan das Image ist, das mit Port 80 auf dem Docker-Host ausgeführt wird, der Port 8080 auf Ihrem Computer zugeordnet ist. Die youthful_heisenberg-Instanz ist der Container für die vorherige Ausführung des Images. Das Feld COMMAND zeigt den Befehl, den der Container ausgeführt hat, um die Anwendung im Image zu starten. In diesem Fall lautet er für beide Container dotnet aspnetapp.dll. Die Image-ID für die Container ist außerdem, da beide Container das gleiche Image ausführen.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   42 seconds ago      Up 41 seconds       0.0.0.0:8080->80/tcp   elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   5 minutes ago      Up 5 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Hinweis

docker ps ist eine Abkürzung für docker container ls. Die Namen dieser Befehle basieren auf den Linux-Hilfsprogrammen ps und ls, die aktuell ausgeführte Prozesse bzw. Dateien auflisten.

Sie können einen aktiven Container mit dem Befehl docker stop beenden und die Container-ID angeben.

docker stop elegant_ramanujan

Wenn Sie docker ps noch mal ausführen, sehen Sie, dass der Container elegant_ramanujan in der Ausgabe nicht mehr vorhanden ist. Der Container ist noch vorhanden, hostet aber keinen aktiven Prozess mehr. Sie können beendete Container in die Ausgabe von docker ps einschließen, indem Sie das Flag -a verwenden:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   2 minutes ago       Exited (0) 21 seconds ago                       elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   7 minutes ago      Up 7 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Sie können einen beendeten Container mit dem Befehl docker start neu starten. Der Hauptprozess des Containers wird neu gestartet.

docker start elegant_ramanujan

In der Regel sollte ein Container, sobald er beendet wurde, auch entfernt werden. Durch das Entfernen eines Containers werden alle Ressourcen, die er hinterlässt, bereinigt. Sobald Sie einen Container entfernen, gehen alle Änderungen, die in seinem Imagedateisystem vorgenommen wurden, dauerhaft verloren.

docker rm elegant_ramanujan

Sie können einen aktuell ausgeführten Container nicht entfernen, aber Sie können mit dem Flag -f für den Befehl docker rm erzwingen, dass ein Container beendet und entfernt wird. So können Sie einen Container schnell beenden und entfernen. Sie sollte dies jedoch nur tun, wenn für die App im Container kein ordnungsgemäßes Herunterfahren erforderlich ist.

docker container rm -f elegant_ramanujan

Entfernen von Docker-Images

Sie können ein Image mit dem Befehl docker image rm vom lokalen Computer entfernen. Geben Sie die Image-ID des Images an, das entfernt werden soll. Im folgenden Beispiel wird das Image für die Beispiel-Web-App entfernt.

docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp

Container, die das Image ausführen, müssen beendet werden, bevor das Image entfernt werden kann. Wenn das Image noch von einem Container verwendet wird, erhalten Sie eine Fehlermeldung wie die folgende. In diesem Beispiel tritt der Fehler auf, weil das Image noch vom Container youthful_heisenberg verwendet wird.

Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe