GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Erkunden von ASP.NET Core mit Docker in Linux- und Windows-Containern

Im Mai letzten Jahres steckte die Arbeit mit ASP.NET und Docker noch in den Kinderschuhen. Aber coole Sachen waren im Gange. Ich habe einen Blogbeitrag geschrieben, der zeigt, wie man eine ASP.NET 5-App (damals 5, jetzt Core 1.0) in Docker veröffentlicht. Später im Dezember 2015 machten neue Tools wie Docker Toolbox und Kitematic die Dinge noch einfacher. Im Mai 2016 hat Docker für Windows Beta den Ball weiter gut vorangebracht.

Ich wollte hier im Oktober 2016 sehen, wie die Dinge mit ASP.NET Core, Docker und Windows aussehen.

Ich habe diese Dinge installiert:

  • Visual Studio-Community 2015
    • Visual Studio 2015 Update 3
  • ASP.NET Core mit .NET Core
    • .NET Core 1.0.1 – VS 2015 Tooling Preview 2
  • Docker für Windows (Ich habe den Beta-Kanal verwendet)
  • Visual Studio-Tools für Docker

Docker für Windows ist wirklich nett, da es die Einrichtung von Hyper-V für Sie automatisiert und das Docker-Host-Betriebssystem erstellt und alles zum Laufen bringt. Dies ist eine große Zeitersparnis.

Da ist mein Linux-Host, über den ich nicht wirklich nachdenken muss. Ich mache alles von der Befehlszeile oder von Visual Studio aus.

Ich sage Datei | Neues Projekt und erstellen Sie eine neue ASP.NET Core-Anwendung, die auf .NET Core ausgeführt wird.

Dann klicke ich mit der rechten Maustaste und Hinzufügen | Docker-Unterstützung . Dieses Menü stammt aus der Visual Studio Tools for Docker-Erweiterung. Dadurch werden ein einfaches Dockerfile und einige docker-compose-Dateien hinzugefügt. Ich bin sofort einsatzbereit, um meine ASP.NET Core-App in einem Docker-Linux-Container bereitzustellen.

ASP.NET Core in einem Docker-Linux-Container

Ausgehend von meiner ASP.NET Core-App stelle ich sicher, dass mein Basis-Image (das ist das FROM in der Docker-Datei) das Basis-ASP.NET Core-Image für Linux ist.

FROM microsoft/aspnetcore:1.0.1
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
EXPOSE 80
COPY $source .

Da Docker meine Anwendung noch nicht erstellen soll, veröffentliche ich sie als Nächstes lokal. Lesen Sie unbedingt Steve Laskers Blogbeitrag „Building Optimized Docker Images with ASP.NET Core“, um zu erfahren, wie Sie einen Docker-Container Ihre App erstellen und den anderen ausführen lassen. Dies optimiert die Serverdichte und Ressourcen.

Ich veröffentliche, erstelle dann die Images und führe sie aus.

>dotnet publish

>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonlinux

>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonlinux latest dab2bff7e4a6 28 seconds ago 276.2 MB
microsoft/aspnetcore 1.0.1 2e781d03cb22 44 hours ago 266.7 MB

>docker run -it -d -p 85:80 aspnetcoreonlinux
1cfcc8e8e7d4e6257995f8b64505ce25ae80e05fe1962d4312b2e2fe33420413

>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cfcc8e8e7d4 aspnetcoreonlinux "dotnet WebApplicatio" 2 seconds ago Up 1 seconds 0.0.0.0:85->80/tcp clever_archimedes

Und meine ASP.NET Core-App wird in Docker ausgeführt. Ich führe also Windows aus, führe Hyper-V aus und führe einen Linux-Host aus, der Docker-Container hostet.

Was kann ich sonst noch tun?

ASP.NET Core in einem Docker-Windows-Container mit Windows Nano Server

Es gibt Windows Server , gibt es Windows Server Core das unter anderem die Benutzeroberfläche entfernt, und es gibt Windows Nano Server wodurch Windows auf Hunderte von Megabyte statt auf viele Gigs heruntergefahren wird. Das bedeutet, dass es eine große Auswahl gibt, je nachdem, was Sie für Funktionalität und Serverdichte benötigen. Versenden Sie so wenig wie möglich.

Lassen Sie mich sehen, ob ich ASP.NET Core auf Kestrel unter Windows Nano Server ausführen kann. Da Nano sehr leistungsfähig ist, könnte ich sicherlich IIS innerhalb des Containers ausführen, und dazu gibt es Dokumente.

Michael Friis von Docker hat einen großartigen Blogbeitrag zum Erstellen und Ausführen Ihres ersten Docker-Windows-Server-Containers. Mit dem neuen Docker für Windows können Sie einfach mit der rechten Maustaste darauf klicken und zwischen Linux- und Windows-Containern wechseln.

Also verwende ich jetzt Docker mit Windows-Containern. Sie wissen vielleicht nicht, dass Sie wahrscheinlich bereits Windows-Container haben! Es wurde in der Windows 10 Anniversary Edition ausgeliefert. Sie können unter Funktionen nach Containern suchen:

Ich ändere meine Docker-Datei so, dass sie das Windows Nano Server-Image verwendet. Ich kann auch die Ports steuern, auf denen ASP.NET kommuniziert, wenn ich möchte, mit einer Umgebungsvariablen und diese in Docker verfügbar machen.

FROM microsoft/dotnet:nanoserver
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .

Dann veröffentliche und baue ich...

>dotnet publish
>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonnano

Dann werde ich es ausführen und die Ports von Windows außerhalb auf den Windows-Container im Inneren abbilden!

HINWEIS: Während ich dies schreibe, gibt es einen Fehler, der sich darauf auswirkt, wie Windows 10 über „NAT“ (Network Address Translation) mit Containern kommuniziert, sodass Sie nicht einfach http://localhost:82 aufrufen können, wie Sie (und ich) möchten. Heute muss man direkt die IP des Containers treffen. Ich melde mich wieder, sobald ich mehr über diesen Fehler höre und wie er behoben wird. Es wird eines Tages in Windows Update auftauchen. Die Problemumgehung besteht darin, die IP-Adresse des Containers wie folgt vom Docker abzurufen:docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" HASH

UPDATE :
Dieser Fehler wurde im April-Update von Windows 10 behoben. Details hier Localhost-Zugriff auf Windows-Containerports

Also führe ich meine ASP.NET Core-App auf Windows Nano Server aus (um es noch einmal klarzustellen, dies wird unter Windows 10 ausgeführt und Nano Server befindet sich in einem Container!)

>docker run -it -d -p 88:82 aspnetcoreonnano
afafdbead8b04205841a81d974545f033dcc9ba7f761ff7e6cc0ec8f3ecce215

>docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" afa
172.16.240.197

Jetzt kann ich diese Seite mit 172.16.240.197:82 erreichen. Sobald der obige Fehler behoben ist, wird er wie jeder andere Container getroffen und weitergeleitet.

Das Beste an Windows-Containern ist, dass sie schnell und leichtgewichtig sind. Sobald das Image heruntergeladen und auf Ihrem Computer erstellt wurde, können Sie es mit Docker in Sekundenschnelle starten und stoppen.

ABER Sie können Windows-Container auch mit Docker wie folgt isolieren:

docker run --isolation=hyperv -it -d -p 86:82 aspnetcoreonnano

Jetzt läuft diese Instanz vollständig isoliert innerhalb von Hyper-V selbst. Sie bekommen das Beste aus allen Welten. Schnelle und bequeme Bereitstellung sowie optionale und einfache Isolierung.

ASP.NET Core in einem Docker-Windows-Container mit Windows Server Core 2016

Ich kann dann das Dockerfile ändern, um das vollständige Windows Server Core-Image zu verwenden. Dies sind 8 Gigs, also seien Sie bereit, da das Herunterladen und Extrahieren etwas dauern wird, aber es ist wirklich Windows. Sie können dies auch als Container oder als isolierten Hyper-V-Container ausführen.

Hier ändere ich einfach das FROM, um einen Windows Server Core mit .NET Core zu erhalten.

FROM microsoft/dotnet:1.0.0-preview2-windowsservercore-sdk
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .

HINWEIS: Ich habe gehört, dass die .NET Core auf Windows Server Core-Images wahrscheinlich verschwinden werden. Es ist sinnvoller, .NET Core auf Windows Nano Server oder anderen leichtgewichtigen Images auszuführen. Sie werden Server Core für schwerere Aufgaben verwenden, und Server ist nett, weil es bedeutet, dass Sie "vollständige" .NET Framework-Apps in Containern ausführen können! Wenn Sie WIRKLICH .NET Core auf Server Core haben möchten, können Sie Ihre eigene Docker-Datei erstellen und einfach ein Image erstellen, das die gewünschten Dinge enthält.

Dann werde ich es veröffentlichen, erstellen und erneut ausführen.

>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonnano latest 7e02d6800acf 24 minutes ago 1.113 GB
aspnetcoreonservercore latest a11d9a9ba0c2 28 minutes ago 7.751 GB

Da Container so schnell zu starten und zu stoppen sind, kann ich eine komplette Webfarm mit Redis in einem Container, SQL in einem anderen und meinem Webstack in einem dritten ausführen. Oder mix and match.

>docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
d32a981ceabb aspnetcoreonwindows "dotnet WebApplicatio" 0.0.0.0:87->82/tcp compassionate_blackwell
a179a48ca9f6 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:86->82/tcp determined_stallman
170a8afa1b8b aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:89->82/tcp agitated_northcutt
afafdbead8b0 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:88->82/tcp naughty_ramanujan
2cf45ea2f008 a7fa77b6f1d4 "dotnet WebApplicatio" 0.0.0.0:97->82/tcp sleepy_hodgkin

Schlussfolgerung

Schauen Sie sich noch einmal Michaels Artikel an, in dem er Docker Compose verwendet, um das ASP.NET Music Store-Beispiel mit SQL Express in einem Windows-Container und ASP.NET Core in einem anderen aufzurufen, sowie Steve Laskers Blog (tatsächlich ist sein ganzer Blog Gold ) zum Erstellen optimierter Docker-Images mit ASP.NET Core.

IMAGE ID            RESPOSITORY                   TAG                 SIZE
0ec4274c5571 web optimized 276.2 MB
f9f196304c95 web single 583.8 MB
f450043e0a44 microsoft/aspnetcore 1.0.1 266.7 MB
706045865622 microsoft/aspnetcore-build 1.0.1 896.6 MB

Steve weist auf eine Reihe von Techniken hin, mit denen Sie Docker und ASP.NET Core optimal nutzen können.

Das Ergebnis von all dem bedeutet (IMHO), dass Sie ASP.NET Core verwenden können:

  • ASP.NET Core unter Linux
    • innerhalb von Docker-Containern
    • in jeder Cloud
  • ASP.NET Core unter Windows, Windows Server, Server Core und Nano Server.
    • innerhalb von Docker-Windows-Containern
    • innerhalb von Docker isolierte Hyper-V-Container

Das bedeutet, dass Sie den Umfang der Funktionsunterstützung und die Größe auswählen können, um die Serverdichte und den Komfort zu optimieren. Sobald alle Tools (die Docker-Leute mit Docker für Windows und die VS-Leute mit Visual Studio-Docker-Tools) fertig sind, haben wir schöne Debugging- und Workflows von der Entwicklung bis zur Produktion.

Was haben Sie mit Docker, Containern und ASP.NET Core gemacht? Ton aus in den Kommentaren.

Sponsor: Danke an Redgate diese Woche! Entdecken Sie das weltweit vertrauenswürdigste SQL Server-Vergleichstool. Profitieren Sie von einer kostenlosen Testversion von SQL Compare, dem Branchenstandard zum Vergleichen und Bereitstellen von SQL Server-Schemas.


Docker
  1. Was ist Docker (und Linux-Container?)

  2. Optimieren der Größen von ASP.NET Core Docker-Images

  3. So schreiben Sie einen Linux-Daemon mit .Net Core

  4. Datei von Linux auf Windows Share mit C# (.NET Core) kopieren

  5. Verschlüsseln Sie eine externe Festplatte mit Lese- und Schreibzugriff sowohl unter Windows als auch unter Linux

Erstellen, Ausführen und Testen von .NET Core und ASP.NET Core 2.1 in Docker auf einem Raspberry Pi (ARM32)

Docker- und Linux-Container unter Windows, mit oder ohne virtuelle Hyper-V-Maschinen

.NET und Docker

ZEIT jetzt Bereitstellungen von Open-Source-ASP.NET-Core-Web-Apps mit Docker

Veröffentlichen einer ASP.NET 5-App in Docker unter Linux mit Visual Studio

Verschieben eines ASP.NET Core von Azure App Service unter Windows zu Linux, indem zuerst in WSL und Docker getestet wird