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

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

Ich liebe mich etwas Raspberry Pi. Sie sind großartige kleine Lernmaschinen, mit denen Kinder super spielen können. Selbst wenn diese Kinder Erwachsene sind und einen Kubernetes-Raspberry-Pi-Cluster mit 6 Knoten bauen.

Open Source .NET Core läuft im Grunde überall – Windows, Mac und ein Dutzend Linux-Versionen. Es gibt jedoch ein SDK (das kompiliert und erstellt) und eine Runtime (die die eigentliche Ausführung Ihrer App übernimmt). In der Vergangenheit wurde das .NET Core SDK (um es klar zu sagen, die Fähigkeit zum „dotnet build“) auf ARMv7/ARMv8-Chips wie dem Raspberry Pi nicht unterstützt. Jetzt ist es soweit.

.NET Core wird jetzt auf Linux ARM32-Distributionen wie unterstützt Raspbian und Ubuntu !

Hinweis: .NET Core 2.1 wird auf Raspberry Pi 2+ unterstützt. Es wird auf dem Pi Zero oder anderen Geräten, die einen ARMv6-Chip verwenden, nicht unterstützt. .NET Core erfordert ARMv7- oder ARMv8-Chips wie den ARM Cortex-A53. Mitarbeiter des Azure IoT Edge-Teams verwenden die .NET Core Bionic ARM32 Docker-Images, um Entwickler beim Schreiben von C# mit Edge-Geräten zu unterstützen.

Es gibt zwei Möglichkeiten, .NET Core auf einem Raspberry Pi auszuführen.

Eins, verwenden Sie Docker . Dies ist buchstäblich der schnellste und einfachste Weg, um .NET Core auf einem Pi zum Laufen zu bringen. Es klingt verrückt, aber Raspberry Pis sind brillante kleine Docker-Container-fähige Systeme. Sie können es wirklich in wenigen Minuten tun. Sie können Docker schnell auf einem Raspberry Pi installieren mit:

curl -sSL https://get.docker.com | sh
sudo usermod -aG docker pi

Nach der Installation von Docker möchten Sie sich an- und abmelden. Vielleicht möchten Sie ein kurzes Beispiel ausprobieren, um sicherzustellen, dass .NET Core ausgeführt wird! Sie können die verfügbaren Docker-Tags unter https://hub.docker.com/r/microsoft/dotnet/tags/ erkunden und hier https://github.com/dotnet/dotnet- über die .NET Core Docker-Beispiele lesen. docker/tree/master/samples/dotnetapp

Jetzt kann ich einfach Docker ausführen und dann "dotnet --info" übergeben, um mehr über dotnet auf meinem Pi zu erfahren.

pi@raspberrypi:~ $ docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info
.NET Core SDK (reflecting any global.json):
Version: 2.1.300-rc1-008673
Commit: f5e3ddbe73

Runtime Environment:
OS Name: debian
OS Version: 9
OS Platform: Linux
RID: debian.9-x86
Base Path: /usr/share/dotnet/sdk/2.1.300-rc1-008673/

Host (useful for support):
Version: 2.1.0-rc1
Commit: eb9bc92051

.NET Core SDKs installed:
2.1.300-rc1-008673 [/usr/share/dotnet/sdk]

.NET Core runtimes installed:
Microsoft.NETCore.App 2.1.0-rc1 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
https://aka.ms/dotnet-download

Das ist supercool. Da bin ich auf dem Raspberry Pi (RPi) und frage einfach nach dem dotnet:2.1-sdk und weil sie "Multiarch"-Docker-Dateien verwenden, macht Docker das Richtige und es funktioniert einfach. Wenn Sie .NET Core auf ARM32 mit Docker verwenden möchten, können Sie eines der folgenden Tags verwenden.

Hinweis: Die ersten drei Tags sind Multi-Arch und bionisch ist Ubuntu 18.04. Der Codename-Stretch ist Debian 9. Ich verwende also 2.1-sdk und es funktioniert auf meinem RPi, aber ich kann spezifisch sein, wenn ich es vorziehe.

  • 2.1-SDK
  • 2.1-Laufzeit
  • 2.1-Aspnetcore-Laufzeit
  • 2.1-sdk-stretch-arm32v7
  • 2.1-runtime-stretch-slim-arm32v7
  • 2.1-aspnetcore-runtime-stretch-slim-arm32v7
  • 2.1-sdk-bionic-arm32v7
  • 2.1-runtime-bionic-arm32v7
  • 2.1-aspnetcore-runtime-bionic-arm32v7

Probieren Sie es in wenigen Minuten so aus:

docker run --rm microsoft/dotnet-samples:dotnetapp

Hier werden die Bilder heruntergeladen...

In früheren Versionen der Dockerfiles von .NET Core schlug dies fehl, wenn Sie ein x64-Image auf ARM ausführten:

standard_init_linux.go:190: exec user process caused "exec format error"

Unterschiedliche Prozessoren! Aber mit Multiarch per https://github.com/dotnet/announcements/issues/14 Kendra von Microsoft funktioniert es nur mit 2.1.

Docker verfügt über eine Multi-Arch-Funktion, die Microsoft/dotnet-nightly seit kurzem verwendet. Es ist geplant, dies in Kürze auf das offizielle Microsoft/Dotnet-Repo zu portieren. Die Multi-Arch-Funktion ermöglicht die Verwendung eines einzelnen Tags über mehrere Maschinenkonfigurationen hinweg. Ohne diese Funktion benötigt jede Architektur/jedes Betriebssystem/jede Plattform ein eindeutiges Tag. Beispielsweise basiert das microsoft/dotnet:1.0-runtime-Tag auf Debian und microsoft/dotnet:1.0-runtime-nanoserver, wenn es auf Nano Server basiert. Bei Multi-Arch gibt es ein gemeinsames microsoft/dotnet:1.0-runtime-Tag. Wenn Sie dieses Tag aus einer Linux-Containerumgebung abrufen, erhalten Sie das Debian-basierte Image, während Sie das Nano Server-basierte Image erhalten, wenn Sie dieses Tag aus einer Windows-Containerumgebung abrufen. Dies trägt dazu bei, Tag-Einheitlichkeit in Docker-Umgebungen zu gewährleisten, wodurch Verwirrung vermieden wird.

In diesen Beispielen oben kann ich:

  • Führen Sie eine vorkonfigurierte App in einem Docker-Image aus wie:
    • docker run --rm microsoft/dotnet-samples:dotnetapp
  • Führen Sie dotnet-Befehle im SDK-Image aus wie:
    • docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info
  • Führen Sie ein interaktives Terminal innerhalb des SDK-Images aus wie:
    • docker run --rm -it microsoft/dotnet:2.1-sdk

Als kurzes Beispiel springe ich hier in einen Container und erstelle eine schnelle Konsolen-App und führe sie aus, nur um zu beweisen, dass ich es kann. Diese Arbeit wird verworfen, wenn ich den Container verlasse.

pi@raspberrypi:~ $ docker run --rm -it microsoft/dotnet:2.1-sdk
root@063f3c50c88a:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@063f3c50c88a:/# cd ~
root@063f3c50c88a:~# mkdir mytest
root@063f3c50c88a:~# cd mytest/
root@063f3c50c88a:~/mytest# dotnet new console
The template "Console Application" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on /root/mytest/mytest.csproj...
Restoring packages for /root/mytest/mytest.csproj...
Installing Microsoft.NETCore.DotNetAppHost 2.1.0-rc1.
Installing Microsoft.NETCore.DotNetHostResolver 2.1.0-rc1.
Installing NETStandard.Library 2.0.3.
Installing Microsoft.NETCore.DotNetHostPolicy 2.1.0-rc1.
Installing Microsoft.NETCore.App 2.1.0-rc1.
Installing Microsoft.NETCore.Platforms 2.1.0-rc1.
Installing Microsoft.NETCore.Targets 2.1.0-rc1.
Generating MSBuild file /root/mytest/obj/mytest.csproj.nuget.g.props.
Generating MSBuild file /root/mytest/obj/mytest.csproj.nuget.g.targets.
Restore completed in 15.8 sec for /root/mytest/mytest.csproj.

Restore succeeded.
root@063f3c50c88a:~/mytest# dotnet run
Hello World!
root@063f3c50c88a:~/mytest# dotnet exec bin/Debug/netcoreapp2.1/mytest.dll
Hello World!

Wenn Sie es selbst versuchen, werden Sie feststellen, dass "dotnet run" nicht sehr schnell ist. Das liegt daran, dass es eine Wiederherstellung, Erstellung und Ausführung durchführt. Die Kompilierung ist auf diesen winzigen Geräten nicht besonders schnell. Sie wollen so wenig Arbeit wie möglich machen. Anstelle eines ständigen „dotnet run“ führe ich einen „dotnet build“ und dann einen „dotnet exec“ durch, was sehr schnell ist.

Wenn Sie Docker und .NET Core machen, kann ich nicht genug betonen, wie nützlich die Ressourcen drüben bei sind https://github.com/dotnet/dotnet-docker .

Erstellen von .NET Core-Apps mit Docker

  • .NET Core Docker-Beispiel – Dieses Beispiel erstellt, testet und führt das Beispiel aus. Es enthält und erstellt mehrere Projekte.
  • ASP.NET Core Docker-Beispiel – Dieses Beispiel veranschaulicht die Verwendung von Docker mit einer ASP.NET Core-Web-App.

Entwicklung von .NET Core-Apps in einem Container

  • Entwicklung von .NET Core-Anwendungen – Dieses Beispiel zeigt, wie .NET Core-Anwendungen mit Docker entwickelt, erstellt und getestet werden, ohne dass das .NET Core SDK installiert werden muss.
  • ASP.NET Core-Anwendungen entwickeln – Dieses Beispiel zeigt, wie ASP.NET Core-Anwendungen mit Docker entwickelt und getestet werden, ohne dass das .NET Core SDK installiert werden muss.

Optimierung der Containergröße

  • .NET Core Alpine Docker-Beispiel – Dieses Beispiel erstellt, testet und führt eine Anwendung mit Alpine aus.
  • Eigenständiges .NET Core-Beispiel – Dieses Beispiel erstellt und führt eine Anwendung als eigenständige Anwendung aus.

ARM32 / Raspberry Pi

  • .NET Core ARM32 Docker-Beispiel – Dieses Beispiel erstellt und führt eine Anwendung mit Debian auf ARM32 aus (funktioniert auf Raspberry Pi).
  • ASP.NET Core ARM32 Docker-Beispiel – Dieses Beispiel erstellt und führt eine ASP.NET Core-Anwendung mit Debian auf ARM32 aus (funktioniert auf Raspberry Pi).

Ich fand die Beispiele sehr nützlich ... graben Sie sich unbedingt in die Dockerfiles selbst ein, da Sie eine Menge Einblicke in die Strukturierung Ihrer eigenen Dateien erhalten. Die Fähigkeit, mehrstufige Dockerfiles zu erstellen, ist entscheidend, wenn Sie auf einem kleinen Gerät wie einem RPi bauen. Sie möchten so wenig Arbeit wie möglich erledigen und Docker so viele Ebenen mit seinen internen „Smarts“ zwischenspeichern lassen. Wenn Sie sich darüber keine Gedanken machen, verschwenden Sie bei jedem Build die zehnfache Zeit mit dem Erstellen von Bildebenen.

Dockern einer echten ASP.NET Core Site mit Tests!

Kann ich meine Podcast-Site nehmen und sie docken und auf einem Raspberry Pi erstellen/testen/ausführen? JA.

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY hanselminutes.core/*.csproj ./hanselminutes.core/
COPY hanselminutes.core.tests/*.csproj ./hanselminutes.core.tests/
RUN dotnet restore

# copy everything else and build app
COPY . .
WORKDIR /app/hanselminutes.core
RUN dotnet build


FROM build AS testrunner
WORKDIR /app/hanselminutes.core.tests
ENTRYPOINT ["dotnet", "test", "--logger:trx"]


FROM build AS test
WORKDIR /app/hanselminutes.core.tests
RUN dotnet test


FROM build AS publish
WORKDIR /app/hanselminutes.core
RUN dotnet publish -c Release -o out


FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime
WORKDIR /app
COPY --from=publish /app/hanselminutes.core/out ./
ENTRYPOINT ["dotnet", "hanselminutes.core.dll"]

Liebe es. Jetzt kann ich "docker build" ausführen. auf meinem Raspberry Pi. Es wird wiederhergestellt, getestet und erstellt. Wenn die Tests fehlschlagen, schlägt der Docker-Build fehl.

Sehen Sie, wie dort oben ein zusätzlicher Abschnitt mit dem Namen "Testrunner" und danach "Test?" Dieser Testrunner-Abschnitt ist ein no-op. Es setzt einen EINTRITTSPUNKT, wird aber nie verwendet ... noch nicht. Der ENTRYPOINT ist ein impliziter Lauf wenn es die letzte Zeile im Dockerfile ist. Das ist da, damit ich "hinlaufen" kann, wenn ich will.

Ich kann einfach so bauen und ausführen:

docker build -t podcast .
docker run --rm -it -p 8000:80 podcast

HINWEIS/GOTCHA: Beachten Sie, dass das „Runtime“-Image „microsoft/dotnet:2.1-aspnetcore-runtime“ und nicht „microsoft/dotnet:2.1-runtime“ ist. Dieser Aspnetcore enthält die Binärdateien, die ich zum Ausführen einer ASP.NET-App benötige, auf diese Weise kann ich nur einen einzelnen Verweis auf „" in meinem csproj. Wenn ich das aspnetcore-runtime-Basisimage nicht verwendet hätte, müsste ich alle gewünschten ASP.NET Core-Pakete manuell abrufen. Durch die Verwendung des Basisimages werden die resultierenden Imagedateien möglicherweise größer, aber es ist ein Gleichgewicht zwischen Komfort und Größe. Es liegt an dir. Sie können nur die benötigten Pakete manuell hinzufügen oder das Metapaket „Microsoft.AspNetCore.App“ zur Vereinfachung abrufen. Mein resultierendes „Podcast“-Bild hatte eine Größe von 205 MB, also nicht schlecht, aber wenn ich wollte, könnte ich es natürlich auf verschiedene Weise zuschneiden.

Oder, wenn ich NUR Testergebnisse von Docker will, kann ich das tun! Das bedeutet, dass ich die Tests im Docker-Container ausführen, ein Volume zwischen dem Linux-Container und dem (theoretischen) Windows-Host bereitstellen und dann die resultierende .trx-Datei in Visual Studio öffnen kann!

docker build --pull --target testrunner -t podcast:test .
docker run --rm -v D:\github\hanselminutes-core\TestResults:/app/hanselminutes.core.tests/TestResults podcast:test

Hör zu! Dies sind die Testergebnisse der Tests, die im Linux-Container ausgeführt wurden:

Hier ist das Ergebnis. Ich habe jetzt meine Podcast-Website in Docker auf einem ARM32 Raspberry Pi 3 mit nur einer Stunde Arbeit (Schreiben des Dockerfiles) zum Laufen gebracht!

Zweite - Hast du es so weit nach unten geschafft? - Sie können das .NET Core 2.1 SDK einfach „on the metal“ installieren. Kein Docker, holen Sie sich einfach das tar.gz und richten Sie es ein. Wenn ich mir das RPi ARM32v7 Dockerfile ansehe, kann ich es so auf dem Metall installieren. Hinweis:Ich erhalte das .NET Core SDK *und* die gemeinsam genutzte ASP.NET Core-Laufzeit. Im endgültigen Release-Build erhalten Sie nur das SDK und es enthält alles, einschließlich ASP.NET.

$ sudo apt-get -y update
$ sudo apt-get -y install libunwind8 gettext
$ wget https://dotnetcli.blob.core.windows.net/dotnet/Sdk/2.1.300-rc1-008673/dotnet-sdk-2.1.300-rc1-008673-linux-arm.tar.gz
$ wget https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/2.1.0-rc1-final/aspnetcore-runtime-2.1.0-rc1-final-linux-arm.tar.gz
$ sudo mkdir /opt/dotnet
$ sudo tar -xvf dotnet-sdk-2.1.300-rc1-008673-linux-arm.tar.gz -C /opt/dotnet/
$ sudo tar -xvf aspnetcore-runtime-2.1.0-rc1-final-linux-arm.tar.gz -C /opt/dotnet/
$ sudo ln -s /opt/dotnet/dotnet /usr/local/bin
$ dotnet --info

Plattformübergreifend für den Sieg!

Sponsor :Sehen Sie sich JetBrains Rider an:eine plattformübergreifende .NET-IDE. Bearbeiten, Refactoring, Testen und Debuggen von ASP.NET-, .NET Framework-, .NET Core-, Xamarin- oder Unity-Anwendungen. Erfahren Sie mehr und laden Sie eine 30-Tage-Testversion herunter!


Docker
  1. PostgreSQL in Docker ausführen, eine schnelle und praktische Anleitung

  2. Erkennen, dass eine .NET Core-App in einem Docker-Container ausgeführt wird, und SkipableFacts in XUnit

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

  4. ASP.NET Core auf GoDaddys billigstem gemeinsam genutztem Linux-Hosting ausführen – nicht zu Hause ausprobieren

  5. Ausführen einer eigenständigen ASP.NET Core-Anwendung auf Ubuntu

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

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

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

Installieren von PowerShell Core auf einem Raspberry Pi (powered by .NET Core)

Veröffentlichen einer ASP.NET Core-Website auf einem günstigen Linux-VM-Host