Dieses Video bietet einen kurzen Überblick darüber, was Container sind, wie sie auf einem Windows Server-System ausgeführt werden und wofür sie verwendet werden können. Ein Container ist eine isolierte Umgebung, in der eine Anwendung ausgeführt werden kann.
Der Container, die Anwendung und alle ihre Abhängigkeiten werden mit Teilen der Hostressourcen wie einem Kernelbetriebssystem, einer CPU und einem Arbeitsspeicher erstellt. Und sie sind logisch von anderen Containern und vom Host selbst getrennt.
Dieses Diagramm zeigt, wie ein roter und ein gelber Container auf demselben Host mit denselben Hardwareressourcen und demselben Kernel-Betriebssystem koexistieren, aber in ihrem individuellen Bereich enthalten sind, sodass sie ihre Anwendungen ohne externe Interferenz ausführen können.
Dieselbe Hardware und dasselbe Betriebssystem, die auf dieser Hardware installiert sind, können ihre eigenen Anwendungen und Services ausführen, auch unabhängig davon, was in den einzelnen Containern geschieht.
Standardmäßig kann dieser Container verworfen werden. Wenn er beendet wird, werden die gesamte Software und die darin befindlichen Dateien gelöscht. Dasselbe passiert, wenn der Host neu gestartet wird.
Die Container nutzen auch die Firewall des Hostcomputers. Vergleichen wir all das mit einer virtuellen Maschine. Zunächst können Sie einen Container auf einer virtuellen Maschine ausführen, aber nicht umgekehrt.
Eine virtuelle Maschine simuliert einen ganzen Computer. Daher muss sie ein eigenes Betriebssystem ausführen, was eine höhere Sicherheit ermöglicht, aber gleichzeitig mehr Konfiguration und Wartung erfordert, was häufig zu ungenutzten Ressourcen führt.
Es gibt mehrere Möglichkeiten, mit Containern zu arbeiten, darunter Visual Studio, Azure, Kubernetes und Windows, aber in diesem Video sprechen wir über Docker.
Docker ist ein Platform as a Service-Produkt, das eine Anwendung, alle ihre Abhängigkeiten und Konfigurationsinformationen in einem einzigen Paket zusammenfasst, das als Container bezeichnet wird.
Docker kann dann verwendet werden, um diesen Container zu versenden, auszuführen oder zu löschen. Wir kehren gleich zu diesem Diagramm zurück. Sehen wir uns einen Teil davon in Aktion an und gehen dabei auf weitere Details ein. Hier haben wir eine Neuinstallation von Windows Server 2022.
Ich starte den Assistenten „Server Manager“, um Rollen und Funktionen hinzuzufügen. Beachten Sie, dass ich mit diesem Assistenten die Funktion „Containers“ hinzufügen kann. Docker wird damit aber nicht installiert.
Das müssen wir separat tun. Zu diesem Zweck breche ich diesen Assistenten ab und öffne PowerShell, um die folgende Befehlszeile auszuführen, um zunächst einen erforderlichen Provider zu installieren.
Install-Module, "DockerMsftProvider" und wir verwenden die "PSGallery" als Quelle. Ich drücke nun die Eingabetaste. Bei dieser Eingabeaufforderung wähle ich „Yes“ aus, um NuGet zu installieren, und warte, bis die Installation abgeschlossen ist.
Jetzt führe ich die zweite Befehlszeile aus, um Docker selbst zu installieren. Install-Package, "docker" und geben Sie dann den zuvor installierten "DockerMsftProvider" an. Ich drücke die Eingabetaste. Bei der gleich erscheinenden Eingabeaufforderung wähle ich „Yes“ aus, um fortzufahren.
Beachten Sie die Aufforderung, den Computer neu zu starten. Dazu führe ich den Befehl „Restart-Computer“ aus. Wenn der Computer gesichert ist, öffne ich den Assistenten zum Hinzufügen von Rollen und Features im Server-Manager erneut.
Sie werden feststellen, dass die Funktion „Containers“ bereits installiert ist. Wir haben dies mit den beiden PowerShell-Befehlszeilen gemacht, die wir zuvor ausgeführt haben. In PowerShell erhalten wir durch Ausführen eines Befehls wie „docker“ eine Vorstellung von all den Dingen, die wir tun können.
Die Docker-Version teilt uns beispielsweise mit, dass wir mit der Engine-Version 20.10.9 arbeiten. Ein anderer Befehl, „docker info“, teilt uns mit, dass wir unseren ersten Container noch erstellen müssen.
Dieser Kasten enthält außerdem Details wie die Menge an CPUs und RAM, die für Container verfügbar sind, die "Default Isolation Method" und die "Network"-Typen, die erstellt wurden. Diese besprechen wir vorerst nicht.
Führen wir nun die Schritte zum Erstellen und Ausführen unseres ersten Containers auf diesem Windows-System aus, auf dem wir Docker gerade installiert haben. Dieses Diagramm führt uns nochmal vor Augen, dass Docker ein Tool ist, mit dem mehrere Elemente in einen Container verpackt werden können. Wenn wir also beispielsweise eine Webanwendung in einem Container erstellen, müssen wir mehrere Elemente in diesen Container packen.
Zuerst benötigen wir ein „Dockerfile“. Diese Datei enthält Konfigurationsinformationen und Anweisungen, die zum Erstellen eines neuen Containers erforderlich sind. Ein Dockerfile sieht folgendermaßen aus. Es kann sehr komplex oder einfach sein.
Wir werden eine solche Datei gleich erstellen. Wir benötigen auch ein Container-Image. Ein Image ist sozusagen eine schreibgeschützte Vorlage. Sie können einen Container beispielsweise mithilfe der Vorlage "Windows Server Core" oder einer "Nano Server"-Vorlage erstellen.
Dieses Image oder diese Vorlage enthält auch einige der Abhängigkeiten, die die Webanwendung benötigt, wie den „IIS“-Service und das Entwicklungs-Framework. Und schließlich benötigen wir die Webanwendung selbst.
Docker bietet Ihnen die Möglichkeit, all dies in einem Container zusammenzufassen. Sehen wir uns dies in Aktion an. Auf dem Computer, auf dem wir Docker gerade in PowerShell installiert haben, wechsle ich zum Stammverzeichnis des Laufwerks C und erstelle ein neues Verzeichnis namens "containers".
Ich wechsle zu diesem neuen Verzeichnis „Containers“. Um unseren ersten Container zu erstellen, benötigen wir das Dockerfile, das wir zuvor besprochen haben. Denken Sie daran, dass es sich hierbei um eine Textdatei mit einer Reihe von Anweisungen für den Container handelt.
Dazu gebe ich „New-Item“ und den Namen „dockerfile“ ein. Beachten Sie, dass dieses Dockerfile keine Erweiterung hat. Wir können in Windows Explorer sehen, dass diese Datei erstellt wurde. Wir öffnen sie mit Notepad.
Um diesen ersten Container einfach zu halten, fügen wir diesem Dockerfile nur drei Zeilen hinzu. Ich werde sie nacheinander erläutern. Zunächst teilt die Anweisung „From“ Docker mit, welches Container-Image für die Erstellung des Containers verwendet wird.
Denken Sie daran, dass ein Image wie eine Vorlage ist. In diesem Fall weisen wir Docker an, ein Image aus der Microsoft-Containerregistrierung zu verwenden, das auf Windows Server Core basiert und bei dem außerdem die Rolle „IIS“ installiert ist.
Die zweite Zeile gibt an, welche Befehle auf dem neuen Container-Image ausgeführt werden sollen, sobald es ausgeführt wird. Wir können Befehle zum Installieren von Software oder zum Erstellen von Dateien und Verzeichnissen einfügen.
In diesem Fall weisen wir Docker lediglich an, PowerShell auf dem Container auszuführen, sobald er ausgeführt wird. Die Anweisung „Copy“ kopiert letztendlich Dateien oder Verzeichnisse vom Hostcomputer in das Dateisystem des Containers.
In diesem Fall weisen wir Docker an, einen Dateinamen "index.html" zu kopieren, der gleich erstellt wird und als Beispielwebanwendung vom Hostcomputer in diesen Ordner im Container dient, der zufällig der virtuelle Standardverzeichnispfad für IIS ist.
Und das ist alles. Nun speichern wir das Dockerfile. Kehren Sie nun zu PowerShell zurück, um die Webseite zu erstellen, die in diesem Container ausgeführt werden soll. Dazu verwende ich den Befehl „New-Item“ erneut und gebe dann „index.html“ als Namen der Datei an.
Wir öffnen diese Datei in Windows Explorer mit Notepad. Der Einfachheit halber fügen wir dieser Beispiel-HTML-Anwendung nur drei Zeilen hinzu, also eine einfache "Hello World"-Webseite.
Ich speichere das nun. Und jetzt haben wir alle Komponenten, die zum Erstellen eines Containers erforderlich sind. Docker wurde auf diesem Windows Server-System installiert.
Wir haben das Dockerfile, das wir zuvor mit den Anweisungen zur Verwendung des Server Core-Images aus der Microsoft-Registrierung erstellt haben, die IIS enthält.
Außerdem haben wir dem Dockerfile die Anweisung hinzugefügt, die HTML-Webseite, sobald wir sie erstellt haben, in den neuen Container zu kopieren. Doch bisher haben wir nur eine Reihe von Anweisungen. Es wird noch nichts ausgeführt.
Wenn wir also in PowerShell nun ein Image erstellen möchten, das auf diesen Anweisungen basiert, führen Sie „docker“, „build“ aus und weisen sie dann den Namen zu oder markieren sie den Webserver.
Und dieser abschließende Punkt zeigt an, dass wir an diesem Containerverzeichnis arbeiten werden, in dem wir unser Dockerfile und unsere "index.html"-Webseite haben. Ich drücke die Eingabetaste.
Diese Zeile erstellt das Basisimage, aus dem unsere Container mithilfe der Anweisungen erstellt werden, die wir in diesem Dockerfile angegeben haben. Da dieses Image auf diesem Server zum ersten Mal aufgerufen wird, muss es aus der Microsoft-Containerregistrierung heruntergeladen werden.
Wenn all dies abgeschlossen ist, wird beim Ausführen eines Befehls wie docker images ein kürzlich heruntergeladenes Image zusammen mit dem Namen oder Tag angezeigt, den wir ihm zugewiesen haben. Wir haben nun ein Container-Image, das sozusagen als Vorlage dient. Es werden jedoch noch keine Container ausgeführt.
Nur um zu zeigen, dass es noch nicht möglich ist, auf unsere Beispielwebanwendung zuzugreifen, öffne ich einen Webbrowser und gebe "localhost" ein. Dies schlägt fehl, was zu erwarten ist, weil der Host nicht über IIS verfügt und keine Webseite hosten kann.
Um den Container schließlich mit der heruntergeladenen Image-Vorlage auszuführen, geben wir wieder in PowerShell „docker run“ ein und geben dann den Namen für diesen Container an.
Wir verwenden den Namen „container1“. Mit diesem Switch geben wir an, dass der Container im Hintergrund ausgeführt wird. Und mit dem anderen wird festgelegt, dass "port 80" auf dem Container "port 80" auf dem Host zugeordnet wird. Und wir geben an, dass dieser Container mit dem Webserver-Image ausgeführt werden soll, das wir zuvor heruntergeladen und erstellt haben.
Ich drücke nun einfach die Eingabetaste. Und damit sind Sie fertig. Dadurch wird ein Container mit dem Namen „container1“ erstellt und ausgeführt, der auf dem gerade vorbereiteten Webserver-Image basiert.
Beachten Sie, dass wir diesem Container keinen Arbeitsspeicher zuweisen mussten und auch keine CPUs oder virtuellen Festplatten, wie dies bei virtuellen Maschinen der Fall ist.
Das liegt daran, dass Sie einem Container diese Ressourcen nicht zuweisen müssen. Er nutzt einfach das, was er benötigt. Gehen wir zurück zum Browser und geben wieder „localhost“ ein.
Wir sehen, dass unsere Beispiel-Webanwendung hochgefahren ist. Sie wird aber nicht auf dem Host ausgeführt. Stattdessen leitet der Host Port 80 an den Container weiter, der mit den Einstellungen erstellt wurde, die wir im Webserver-Image festgelegt haben, und in den unsere HTML-Webseite entsprechend den Anweisungen im Dockerfile kopiert wurde.
Wir können über die Befehlszeile mit diesem neu erstellten Container interagieren. Ich öffne beispielsweise ein neues PowerShell-Fenster und gebe den Befehl „docker exec -ti“ ein, um festzulegen, dass wir interaktiv eine Verbindung zu diesem Container herstellen.
Dann gebe ich den Namen des Containers, „container1“, und dann „powershell“ an. Dieser Docker-Befehl öffnet PowerShell im soeben erstellten container1 und gibt eine Eingabeaufforderung aus.
Wenn wir in diesem Fall „hostname“ eingeben, sehen wir, dass diesem Container ein Computername zugewiesen wurde. Wenn Sie einen Befehl wie "ipconfig" eingeben, wird angezeigt, dass diesem Container auch eine IP-Adresse zugewiesen wurde, die Network Address Translation für die Kommunikation mit dem Host und darüber hinaus verwendet.
Ich nehme eine kleine Änderung an der zuvor erstellten HTML-Webseite vor. Ich bearbeite sie in Notepad und ändere diese Überschrift hier in „container2“ statt „container1“. Ich speichere diese Datei. Und zurück in PowerShell verwende ich die gleichen zwei Befehlszeilen, die wir zuvor zum Erstellen und Ausführen unseres ersten Containers verwendet haben.
Die Zeile bleibt „Docker build“ unverändert. Beachten Sie, dass, wenn ich die Eingabetaste drücke, dies mehr oder weniger sofort ausgeführt wird. Der Grund dafür ist, dass wir das Server Core-Image bereits heruntergeladen haben, auf dem die IIS-Rolle aus der Microsoft-Containerregistrierung installiert ist.
Die zweite Zeile, „docker run“, bearbeiten wir nur, um einen neuen Container namens „container2“ zu erstellen, und wir lassen diesen Container auf „port 8080“ statt auf „port 80“ laufen, den wir „container1“ zugeordnet hatten.
Nun drücken wir die Eingabetaste. Wenn dies beendet ist, gehe ich im Browser zurück zu „localhost“, aber diesmal gebe ich „port 8080“ an. Wir können sehen, dass die Webseite, die Port 8080 überwacht, von "Container #2" gehostet wird, den wir gerade erstellt haben. Derjenige, der an Port 80 lauscht, wird standardmäßig für HTTP von "Container #1" gehostet.
Dasselbe können wir auch in PowerShell sehen, indem wir „docker ps“ ausführen. Container #1 lauscht an Port 80, während "Container #2" Port 8080 überwacht. Container #1 und "Container #2" haben ihren eigenen Hostnamen, ihre eigenen IP-Adressen und hosten ihre eigenen Websites.
Änderungen, die in „container1“ vorgenommen werden, haben keine Auswirkungen auf „container2“. Beachten Sie, dass wir all dies tun konnten, ohne jemals die Rolle "IIS" oder "Hyper V" auf dem Hostserver zu installieren.
Weder mussten wir Ressourcen wie RAM, CPU oder virtuelle Festplatten zuweisen noch ein Netzwerk konfigurieren. Sobald das Basisvorlagen-Image lokal ist, dauerte die Erstellung des Containers zwischen zwei und drei Sekunden.
Abschließend möchte ich kurz darüber sprechen, was Sie in einem Container ausführen können. Unter Windows wurden Container zum ersten Mal unter Windows Server 2016 und Windows 10 unterstützt. Im Idealfall ist die gehostete Anwendung also mit diesen und neueren Betriebssystemen kompatibel.
Wenn eine Anwendung eine grafische Benutzeroberfläche oder Treiber benötigt, kann sie nicht in einem Container bereitgestellt werden. Sie können einen Container jedoch verwenden, um Application Frameworks wie "Asp.net" oder "Apache", Programmiersprachen wie "Python" und sogar Datenbanken in Form von Diensten wie sqlserver-express, "mongodb" oder "mysql" zu hosten.
Derzeit wird es nicht unterstützt, Windows-Infrastrukturrollen wie "Domain Controller", "DNS" oder "DHCP" auf Containern zu hosten, aber wer weiß, was die Zukunft bringt.
Das war also ein kurzer Überblick über Folgendes: Was sind Container, wie werden sie auf einem Windows Server-System ausgeführt und wofür können Sie sie verwenden? Ich hoffe, dass diese Informationen für Sie nützlich sind, und danke Ihnen für Ihr Interesse.