GNU/Linux >> Znalost Linux >  >> Panels >> Docker

Vytváření, spouštění a testování .NET Core a ASP.NET Core 2.1 v Dockeru na Raspberry Pi (ARM32)

Miluji Raspberry Pi. Jsou to skvělé malé učební stroje a děti si s nimi hrají super zábavu. I když jsou tyto děti dospělí a sestaví klastr Kubernetes Raspberry Pi s 6 uzly.

Open source .NET Core běží v podstatě všude – Windows, Mac a tucet Linuxů. Existuje však sada SDK (která kompiluje a sestavuje) a modul Runtime (který zajišťuje skutečné spuštění vaší aplikace). V minulosti nebylo .NET Core SDK (aby bylo jasné, schopnost „dotnet build“) na čipech ARMv7/ARMv8 jako Raspberry Pi podporováno. Nyní je.

.NET Core je nyní podporováno v distribucích Linuxu ARM32, jako je Raspbian a Ubuntu !

Poznámka: .NET Core 2.1 je podporováno na Raspberry Pi 2+. Není podporováno na Pi Zero nebo jiných zařízeních, která používají čip ARMv6. .NET Core vyžaduje čipy ARMv7 nebo ARMv8, jako je ARM Cortex-A53. Lidé z týmu Azure IoT Edge používají obrazy .NET Core Bionic ARM32 Docker k podpoře vývojářů při psaní C# se zařízeními Edge.

Existují dva způsoby, jak spustit .NET Core na Raspberry Pi.

Jedna, použijte Docker . Toto je doslova nejrychlejší a nejjednodušší způsob, jak zprovoznit .NET Core na Pi. Zní to šíleně, ale Raspberry Pis jsou skvělé malé systémy schopné kontejneru Docker. Můžete to udělat během několika minut, opravdu. Docker můžete nainstalovat rychle na Raspberry Pi pomocí:

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

Po instalaci Dockeru se budete chtít přihlásit a odhlásit. Možná budete chtít vyzkoušet rychlou ukázku, abyste se ujistili, že .NET Core běží! Dostupné značky Docker můžete prozkoumat na https://hub.docker.com/r/microsoft/dotnet/tags/ a o ukázkách .NET Core Docker si můžete přečíst zde https://github.com/dotnet/dotnet- docker/tree/master/samples/dotnetapp

Nyní mohu pouze spustit docker a poté zadat „dotnet --info“, abych zjistil o dotnetu na mém 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

To je super cool. Tam jsem na Raspberry Pi (RPi) a ptám se jen na dotnet:2.1-sdk a protože používají "multiarch" docker soubory, Docker dělá správnou věc a prostě to funguje. Pokud chcete používat .NET Core na ARM32 s Dockerem, můžete použít kteroukoli z následujících značek.

Poznámka: První tři značky jsou více oblouků a bionic je Ubuntu 18.04. Kódové označení stretch je Debian 9. Takže používám 2.1-sdk a funguje to na mém RPi, ale mohu být konkrétní, pokud chci.

  • 2,1-sdk
  • 2.1-běh
  • 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

Zkuste jeden za pár minut takto:

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

Zde probíhá stahování obrázků...

V předchozích verzích .NET Core's Dockerfiles by selhal, pokud byste spouštěli x64 image na ARM:

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

Různé procesory! Ale s multiarch podle https://github.com/dotnet/announcements/issues/14 Kendra od Microsoftu to prostě funguje s 2.1.

Docker má funkci multi-arch, kterou nedávno začal využívat microsoft/dotnet-nightly. V plánu je v brzké době přenést toto na oficiální repo microsoft/dotnet. Funkce více oblouků umožňuje použití jednoho štítku ve více konfiguracích strojů. Bez této funkce vyžaduje každá architektura/OS/platforma jedinečný tag. Například značka microsoft/dotnet:1.0-runtime je založena na Debianu a microsoft/dotnet:1.0-runtime-nanoserver, pokud je založena na Nano Server. S multi-arch bude existovat jedna společná značka microsoft/dotnet:1.0-runtime. Pokud tuto značku vytáhnete z prostředí kontejneru Linuxu, získáte obrázek založený na Debianu, zatímco pokud tuto značku vytáhnete z prostředí kontejneru Windows, získáte obrázek založený na Nano Server. To pomáhá zajistit jednotnost značek napříč prostředími Docker, čímž se eliminuje zmatek.

V těchto příkladech výše mohu:

  • Spusťte předkonfigurovanou aplikaci v obrazu Dockeru, například:
    • docker spustí --rm microsoft/dotnet-samples:dotnetapp
  • Spouštějte příkazy dotnet v rámci obrazu SDK jako:
    • docker spustit --rm -it microsoft/dotnet:2.1-sdk dotnet --info
  • Spusťte interaktivní terminál v rámci obrazu SDK, například:
    • docker spustit --rm -it microsoft/dotnet:2.1-sdk

Jako rychlý příklad zde skočím do kontejneru a vytvořím rychlou konzolovou aplikaci a spustím ji, abych dokázal, že to dokážu. Tato práce bude zahozena, když opustím kontejner.

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!

Pokud to zkusíte sami, zjistíte, že „dotnet run“ není příliš rychlý. To proto, že provádí obnovu, sestavení a spuštění. Kompilace není na těchto malých zařízeních extrémně rychlá. Budete chtít udělat co nejméně práce. Spíše než "dotnet run" po celou dobu udělám "dotnet build" a pak "dotnet exec", což je velmi rychlé.

Pokud děláte Docker a .NET Core, nemohu dostatečně zdůraznit, jak užitečné jsou zdroje na https://github.com/dotnet/dotnet-docker .

Vytváření aplikací .NET Core pomocí Dockeru

  • Ukázka .NET Core Docker – Tato ukázka vytváří, testuje a spouští ukázku. Zahrnuje a staví více projektů.
  • Ukázka ASP.NET Core Docker – Tato ukázka ukazuje použití Dockeru s webovou aplikací ASP.NET Core.

Vývoj aplikací .NET Core v kontejneru

  • Vývoj aplikací .NET Core – Tato ukázka ukazuje, jak vyvíjet, sestavovat a testovat aplikace .NET Core pomocí Dockeru bez nutnosti instalace sady .NET Core SDK.
  • Vývoj aplikací ASP.NET Core – Tato ukázka ukazuje, jak vyvíjet a testovat aplikace ASP.NET Core pomocí Dockeru bez nutnosti instalace sady .NET Core SDK.

Optimalizace velikosti kontejneru

  • Ukázka .NET Core Alpine Docker – Tato ukázka vytváří, testuje a spouští aplikaci pomocí Alpine.
  • Samostatná ukázka .NET Core – Tato ukázka vytváří a spouští aplikaci jako samostatnou aplikaci.

ARM32 / Raspberry Pi

  • Ukázka .NET Core ARM32 Docker – Tato ukázka vytváří a spouští aplikaci s Debianem na ARM32 (funguje na Raspberry Pi).
  • Ukázka ASP.NET Core ARM32 Docker – Tato ukázka vytváří a spouští aplikaci ASP.NET Core s Debianem na ARM32 (funguje na Raspberry Pi).

Zjistil jsem, že ukázky jsou velmi užitečné...nezapomeňte se ponořit do samotných souborů Dockerfiles, protože vám poskytnou spoustu informací o tom, jak strukturovat své vlastní soubory. Schopnost vytvářet vícefázové dockerfily je zásadní při stavbě na malém zařízení, jako je RPi. Chcete udělat co nejméně práce a nechat Docker ukládat do mezipaměti co nejvíce vrstev pomocí svých interních „chytrostí“. Pokud o tom nebudete přemýšlet, ztratíte 10x více času vytvářením obrazových vrstev při každém sestavení.

Ukotvení skutečného webu ASP.NET Core pomocí testů!

Mohu vzít svůj podcastový web a dockerizovat jej a vytvořit/testovat/spustit jej na Raspberry Pi? ANO.

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

Miluji to. Nyní mohu „sestavit docker“. na mém Raspberry Pi. Bude obnovovat, testovat a stavět. Pokud testy selžou, sestavení Dockeru selže.

Podívejte se, jak je tam nahoře další sekce nazvaná "testrunner" a za ní je "test?" Tato sekce testovacích běžců je neoperovaná. Nastavuje VSTUPNÍ BOD, ale nikdy se nepoužije...zatím. ENTRYPOINT je implicitní spuštění pokud je posledním řádkem v Dockerfile. To je tam, takže když budu chtít, můžu se na to „rozběhnout“.

Mohu jen stavět a provozovat takto:

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

POZNÁMKA / GOTCHA: Všimněte si, že "runtime" image je microsoft/dotnet:2.1-aspnetcore-runtime, nikoli microsoft/dotnet:2.1-runtime. Ten aspnetcore předem obsahuje binární soubory, které potřebuji pro spuštění aplikace ASP.NET, takže mohu zahrnout pouze jeden odkaz na "" v mém csproj. Pokud bych nepoužil základní bitovou kopii aspnetcore-runtime, musel bych ručně stáhnout všechny balíčky ASP.NET Core, které chci. Použití základního obrazu může výsledné obrazové soubory zvětšit, ale jde o rovnováhu mezi pohodlím a velikostí. Je to na tobě. Můžete ručně zahrnout pouze balíčky, které potřebujete, nebo si pro pohodlí stáhnout metabalík „Microsoft.AspNetCore.App“. Můj výsledný "podcast" obrázek skončil 205megs, takže to není špatné, ale samozřejmě, kdybych chtěl, mohl bych to oříznout mnoha způsoby.

Nebo, pokud chci POUZE výsledky testů od Dockeru, mohu to udělat! To znamená, že mohu spustit testy v kontejneru Docker, připojit svazek mezi kontejner Linux a (teoreticky) hostitele Windows a poté otevřít výsledný soubor .trx ve Visual Studiu!

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

Koukni na to! Toto jsou výsledky testů z testů, které proběhly v Linuxovém kontejneru:

Tady je výsledek. Nyní mám svůj web Podcast spuštěný v Dockeru na ARM32 Raspberry Pi 3 s pouhou hodinou práce (sepsáním souboru Dockerfile)!

Druhý - dostali jste se tak daleko? - Stačí nainstalovat .NET Core 2.1 SDK "na kov." Žádný Docker, stačí získat tar.gz a nastavit jej. Když se podívám na RPi ARM32v7 Dockerfile, mohu jej takto nainstalovat na kov. Poznámka Získávám sadu .NET Core SDK *a* sdílené runtime ASP.NET Core. V konečné verzi sestavení získáte pouze SDK a bude zahrnovat vše, včetně 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

Vyhrajte napříč platformami!

Sponzor :Podívejte se na JetBrains Rider:multiplatformní .NET IDE. Upravujte, refaktorujte, testujte a ladte aplikace ASP.NET, .NET Framework, .NET Core, Xamarin nebo Unity. Zjistěte více a stáhněte si 30denní zkušební verzi!


Docker
  1. Spuštění PostgreSQL v Dockeru, Rychlý a praktický průvodce

  2. Zjištění, že aplikace .NET Core běží v kontejneru Docker a SkippableFacts v XUnit

  3. Spuštění ASP.NET Core na nejlevnějším sdíleném Linux Hostingu GoDaddys – nezkoušejte to doma

  1. Jak nainstalovat Docker na Raspberry Pi

  2. Optimalizace velikostí obrazu ASP.NET Core Docker

  3. Spuštění samostatné aplikace ASP.NET Core na Ubuntu

  1. Základy Raspberry Pi:instalace Raspbianu a jeho uvedení do provozu

  2. Docker Část 4:Vytváření a publikování vlastních obrázků dockeru

  3. Začínáme s .NET Core a Dockerem a Microsoft Container Registry