GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Création, exécution et test de .NET Core et ASP.NET Core 2.1 dans Docker sur un Raspberry Pi (ARM32)

J'aime moi certains Raspberry Pi. Ce sont d'excellentes petites machines d'apprentissage et sont très amusantes pour les enfants. Même si ces enfants sont des adultes et qu'ils construisent un cluster Kubernetes Raspberry Pi à 6 nœuds.

Open source .NET Core fonctionne pratiquement partout - Windows, Mac et une douzaine de Linux. Cependant, il existe un SDK (qui compile et construit) et un Runtime (qui effectue l'exécution réelle de votre application). Dans le passé, le SDK .NET Core (pour être clair, la possibilité de "build dotnet") n'était pas pris en charge sur les puces ARMv7/ARMv8 comme le Raspberry Pi. C'est maintenant.

.NET Core est désormais pris en charge sur les distributions Linux ARM32, comme Raspbien et Ubuntu !

Remarque : .NET Core 2.1 est pris en charge sur Raspberry Pi 2+. Il n'est pas pris en charge sur le Pi Zero ou d'autres appareils utilisant une puce ARMv6. .NET Core nécessite des puces ARMv7 ou ARMv8, comme l'ARM Cortex-A53. Les membres de l'équipe Azure IoT Edge utilisent les images Docker .NET Core Bionic ARM32 pour aider les développeurs à écrire en C# avec des appareils Edge.

Il existe deux façons d'exécuter .NET Core sur un Raspberry Pi.

Un, utilisez Docker . C'est littéralement le moyen le plus rapide et le plus simple de faire fonctionner .NET Core sur un Pi. Cela semble fou, mais les Raspberry Pis sont de brillants petits systèmes compatibles avec les conteneurs Docker. Vous pouvez le faire en quelques minutes, vraiment. Vous pouvez installer Docker rapidement sur un Raspberry Pi avec juste :

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

Après avoir installé Docker, vous devrez vous connecter et vous déconnecter. Vous voudrez peut-être essayer un exemple rapide pour vous assurer que .NET Core s'exécute ! Vous pouvez explorer les balises Docker disponibles sur https://hub.docker.com/r/microsoft/dotnet/tags/ et vous pouvez en savoir plus sur les exemples .NET Core Docker ici https://github.com/dotnet/dotnet- docker/arbre/maître/échantillons/dotnetapp

Maintenant, je peux juste exécuter Docker puis passer "dotnet --info" pour en savoir plus sur dotnet sur mon Pi.

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

C'est super cool. Là, je suis sur le Raspberry Pi (RPi) et je demande juste le dotnet:2.1-sdk et parce qu'ils utilisent des fichiers docker "multiarch", Docker fait ce qu'il faut et ça marche. Si vous souhaitez utiliser .NET Core sur ARM32 avec Docker, vous pouvez utiliser l'une des balises suivantes.

Remarque : Les trois premières balises sont multi-arch et bionique est Ubuntu 18.04. Le tronçon de nom de code est Debian 9. J'utilise donc 2.1-sdk et cela fonctionne sur mon RPi, mais je peux être précis si je préfère.

  • 2.1-sdk
  • Exécution 2.1
  • 2.1-aspnetcore-runtime
  • 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

Essayez-en un en quelques minutes :

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

Le voici en train de télécharger les images...

Dans les versions précédentes des Dockerfiles de .NET Core, cela échouait si vous exécutiez une image x64 sur ARM :

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

Différents processeurs ! Mais avec multiarch par https://github.com/dotnet/announcements/issues/14 Kendra de Microsoft, cela fonctionne uniquement avec 2.1.

Docker a une fonctionnalité multi-arch que Microsoft/dotnet-nightly a récemment commencé à utiliser. Le plan est de le porter sous peu sur le repo officiel Microsoft/dotnet. La fonction multi-arches permet d'utiliser une seule étiquette sur plusieurs configurations de machine. Sans cette fonctionnalité, chaque architecture/système d'exploitation/plate-forme nécessite une balise unique. Par exemple, la balise microsoft/dotnet:1.0-runtime est basée sur Debian et microsoft/dotnet:1.0-runtime-nanoserver si elle est basée sur Nano Server. Avec multi-arch, il y aura une balise d'exécution microsoft/dotnet:1.0 commune. Si vous extrayez cette balise d'un environnement de conteneur Linux, vous obtiendrez l'image basée sur Debian, tandis que si vous extrayez cette balise d'un environnement de conteneur Windows, vous obtiendrez l'image basée sur Nano Server. Cela permet d'uniformiser les balises dans les environnements Docker, éliminant ainsi toute confusion.

Dans ces exemples ci-dessus, je peux :

  • Exécuter une application préconfigurée dans une image Docker comme :
    • docker exécuter --rm microsoft/dotnet-samples:dotnetapp
  • Exécutez des commandes dotnet dans l'image du SDK comme :
    • docker exécuter --rm -it microsoft/dotnet:2.1-sdk dotnet --info
  • Exécutez un terminal interactif dans l'image du SDK comme :
    • docker exécuter --rm -it microsoft/dotnet:2.1-sdk

Comme exemple rapide, ici, je vais sauter dans un conteneur et créer une application de console rapide et l'exécuter, juste pour prouver que je peux. Ce travail sera jeté lorsque je sortirai du conteneur.

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!

Si vous l'essayez vous-même, vous remarquerez que "dotnet run" n'est pas très rapide. C'est parce qu'il effectue une restauration, une construction et une exécution. La compilation n'est pas super rapide sur ces petits appareils. Vous voudrez faire le moins de travail possible. Plutôt qu'un "dotnet run" tout le temps, je ferai un "dotnet build" puis un "dotnet exec" qui est très rapide.

Si vous utilisez Docker et .NET Core, je ne saurais trop insister sur l'utilité des ressources sur https://github.com/dotnet/dotnet-docker .

Création d'applications .NET Core avec Docker

  • Échantillon Docker .NET Core :cet exemple génère, teste et exécute l'exemple. Il inclut et construit plusieurs projets.
  • Exemple Docker ASP.NET Core :cet exemple illustre l'utilisation de Docker avec une application Web ASP.NET Core.

Développer des applications .NET Core dans un conteneur

  • Développer des applications .NET Core :cet exemple montre comment développer, créer et tester des applications .NET Core avec Docker sans avoir à installer le SDK .NET Core.
  • Développer des applications ASP.NET Core :cet exemple montre comment développer et tester des applications ASP.NET Core avec Docker sans avoir à installer le SDK .NET Core.

Optimisation de la taille du conteneur

  • .NET Core Alpine Docker Sample - Cet exemple crée, teste et exécute une application à l'aide d'Alpine.
  • Exemple autonome .NET Core :cet exemple crée et exécute une application en tant qu'application autonome.

ARM32/Raspberry Pi

  • .NET Core ARM32 Docker Sample - Cet exemple crée et exécute une application avec Debian sur ARM32 (fonctionne sur Raspberry Pi).
  • Exemple Docker ASP.NET Core ARM32 :cet exemple crée et exécute une application ASP.NET Core avec Debian sur ARM32 (fonctionne sur Raspberry Pi).

J'ai trouvé les exemples super utiles... assurez-vous de creuser dans les Dockerfiles eux-mêmes car cela vous donnera une tonne d'informations sur la façon de structurer vos propres fichiers. Être capable de faire des Dockerfiles multi-étapes est crucial lors de la construction sur un petit appareil comme un RPi. Vous voulez faire le moins de travail possible et laisser Docker mettre en cache autant de couches avec ses "intelligences" internes. Si vous n'y réfléchissez pas, vous finirez par perdre 10 fois plus de temps à créer des calques d'image à chaque génération.

Dockeriser un véritable site ASP.NET Core avec des tests !

Puis-je prendre mon site de podcast et le dockeriser et le construire/tester/exécuter sur un Raspberry Pi ? OUI.

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"]

Aimer. Maintenant, je peux "docker build". sur mon Raspberry Pi. Il restaurera, testera et construira. Si les tests échouent, la construction de Docker échouera.

Voyez comment il y a une section supplémentaire appelée "testrunner" et ensuite "test?" Cette section testrunner est un non-op. Il définit un ENTRYPOINT mais il n'est jamais utilisé... pour le moment. L'ENTRYPOINT est une exécution implicite s'il s'agit de la dernière ligne du Dockerfile. C'est là pour que je puisse "Courir dessus" si je veux.

Je peux simplement construire et exécuter comme ceci :

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

REMARQUE/GOTCHA : Notez que l'image "d'exécution" est microsoft/dotnet:2.1-aspnetcore-runtime, et non microsoft/dotnet:2.1-runtime. Cet aspnetcore pré-inclut les fichiers binaires dont j'ai besoin pour exécuter une application ASP.NET, de cette façon je peux simplement inclure une seule référence à "" dans mon csproj. Si je n'utilisais pas l'image de base aspnetcore-runtime, je devrais extraire manuellement tous les packages ASP.NET Core que je veux. L'utilisation de l'image de base peut agrandir les fichiers image résultants, mais il s'agit d'un équilibre entre commodité et taille. C'est à vous. Vous pouvez inclure manuellement uniquement les packages dont vous avez besoin ou extraire le méta-package « Microsoft.AspNetCore.App » pour plus de commodité. Mon image "podcast" résultante a fini par faire 205 mo, donc pas si mal, mais bien sûr, si je le voulais, je pourrais couper de plusieurs façons.

Ou, si je veux JUSTE les résultats des tests de Docker, je peux le faire ! Cela signifie que je peux exécuter les tests dans le conteneur Docker, monter un volume entre le conteneur Linux et l'hôte Windows (théorique), puis ouvrir le fichier résultant .trx dans Visual Studio !

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

Vérifiez-le! Voici les résultats des tests exécutés dans le conteneur Linux :

Voici le résultat. J'ai maintenant mon site Web Podcast en cours d'exécution dans Docker sur un ARM32 Raspberry Pi 3 avec seulement une heure de travail (écriture du Dockerfile) !

Deuxième - avez-vous fait jusqu'ici? - Vous pouvez simplement installer le SDK .NET Core 2.1 "sur le métal". Pas de Docker, récupérez simplement le fichier tar.gz et configurez-le. En regardant le Dockerfile RPi ARM32v7, je peux l'installer sur le métal comme celui-ci. Notez que je reçois le SDK .NET Core * et * le runtime partagé ASP.NET Core. Dans la version finale, vous obtiendrez simplement le SDK et il inclura tout, y compris 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

Multiplateforme pour la victoire !

Parrain :Découvrez JetBrains Rider :un IDE .NET multiplateforme. Modifiez, refactorisez, testez et déboguez des applications ASP.NET, .NET Framework, .NET Core, Xamarin ou Unity. En savoir plus et télécharger une version d'essai de 30 jours !


Docker
  1. Exécuter PostgreSQL dans Docker, un guide rapide et pratique

  2. Détecter qu'une application .NET Core est en cours d'exécution dans un conteneur Docker et SkippableFacts dans XUnit

  3. Optimisation des tailles d'image Docker ASP.NET Core

  4. Exécuter ASP.NET Core sur l'hébergement Linux partagé le moins cher de GoDaddy - N'essayez pas ceci à la maison

  5. Exécution d'une application ASP.NET Core autonome sur Ubuntu

ZEIT déploie désormais des applications Web open source ASP.NET Core avec Docker

Explorer ASP.NET Core avec Docker dans les conteneurs Linux et Windows

Publication d'une application ASP.NET 5 sur Docker sous Linux avec Visual Studio

Déplacement d'un ASP.NET Core d'Azure App Service sur Windows vers Linux en testant d'abord dans WSL et Docker

Installation de PowerShell Core sur un Raspberry Pi (alimenté par .NET Core)

Publication d'un site Web ASP.NET Core sur un hôte de machine virtuelle Linux bon marché