GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Creazione, esecuzione e test di .NET Core e ASP.NET Core 2.1 in Docker su un Raspberry Pi (ARM32)

Mi piace un po' di Raspberry Pi. Sono fantastiche piccole macchine per l'apprendimento e sono super divertenti con cui i bambini possono giocare. Anche se quei ragazzi sono adulti e costruiscono un cluster Kubernetes Raspberry Pi a 6 nodi.

.NET Core open source funziona praticamente ovunque:Windows, Mac e una dozzina di Linux. Tuttavia, esiste un SDK (che compila e compila) e un Runtime (che esegue l'effettiva esecuzione della tua app). In passato, l'SDK .NET Core (per essere chiari, la possibilità di "costruire dotnet") non era supportato sui chip ARMv7/ARMv8 come il Raspberry Pi. Adesso lo è.

.NET Core è ora supportato su distribuzioni Linux ARM32, come Raspbian e Ubuntu !

Nota: .NET Core 2.1 è supportato su Raspberry Pi 2+. Non è supportato su Pi Zero o altri dispositivi che utilizzano un chip ARMv6. .NET Core richiede chip ARMv7 o ARMv8, come ARM Cortex-A53. Gli utenti del team di Azure IoT Edge usano le immagini Docker ARM32 di .NET Core Bionic per supportare gli sviluppatori che scrivono C# con i dispositivi Edge.

Esistono due modi per eseguire .NET Core su un Raspberry Pi.

Uno, usa Docker . Questo è letteralmente il modo più semplice e veloce per far funzionare .NET Core su un Pi. Sembra pazzesco, ma Raspberry Pis sono piccoli e brillanti sistemi capaci di contenitori Docker. Puoi farlo in pochi minuti, davvero. Puoi installare Docker rapidamente su un Raspberry Pi con solo:

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

Dopo aver installato Docker, ti consigliamo di accedere e disconnetterti. Potresti provare un rapido esempio per assicurarti che .NET Core funzioni! Puoi esplorare i tag Docker disponibili su https://hub.docker.com/r/microsoft/dotnet/tags/ e puoi leggere gli esempi di .NET Core Docker qui https://github.com/dotnet/dotnet- docker/tree/master/samples/dotnetapp

Ora posso semplicemente eseguire la finestra mobile e quindi passare "dotnet --info" per scoprire dotnet sul mio 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

Questo è fantastico. Sono sul Raspberry Pi (RPi) e chiedo solo il dotnet:2.1-sdk e poiché utilizzano file docker "multiarch", Docker fa la cosa giusta e funziona e basta. Se vuoi usare .NET Core su ARM32 con Docker, puoi usare uno dei tag seguenti.

Nota: I primi tre tag sono multiarcata e bionico è Ubuntu 18.04. Il nome in codice stretch è Debian 9. Quindi sto usando 2.1-sdk e funziona sul mio RPi, ma posso essere specifico se preferisco.

  • 2.1-sdk
  • 2.1-tempo di esecuzione
  • 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

Provane uno in pochi minuti come questo:

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

Eccolo qui a scaricare le immagini...

Nelle versioni precedenti di Dockerfiles di .NET Core non avrebbe funzionato se si esegue un'immagine x64 su ARM:

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

Processori diversi! Ma con multiarch per https://github.com/dotnet/announcements/issues/14 Kendra di Microsoft funziona solo con 2.1.

Docker ha una funzionalità multi-arch che microsoft/dotnet-nightly ha recentemente iniziato a utilizzare. Il piano è di trasferirlo sul repository ufficiale microsoft/dotnet a breve. La funzione multi-arch consente di utilizzare un singolo tag su più configurazioni di macchine. Senza questa caratteristica, ogni architettura/sistema operativo/piattaforma richiede un tag univoco. Ad esempio, il tag microsoft/dotnet:1.0-runtime è basato su Debian e microsoft/dotnet:1.0-runtime-nanoserver se è basato su Nano Server. Con multi-arch ci sarà un tag microsoft/dotnet:1.0-runtime comune. Se estrai quel tag da un ambiente container Linux otterrai l'immagine basata su Debian mentre se estrai quel tag da un ambiente container Windows otterrai l'immagine basata su Nano Server. Questo aiuta a fornire l'uniformità dei tag negli ambienti Docker, eliminando così la confusione.

In questi esempi sopra posso:

  • Esegui un'app preconfigurata all'interno di un'immagine Docker come:
    • Esegui docker --rm microsoft/dotnet-samples:dotnetapp
  • Esegui comandi dotnet all'interno dell'immagine SDK come:
    • docker esegui --rm -it microsoft/dotnet:2.1-sdk dotnet --info
  • Esegui un terminale interattivo all'interno dell'immagine SDK come:
    • docker esegui --rm -it microsoft/dotnet:2.1-sdk

Come rapido esempio, qui salterò in un contenitore e aggiornerò un'app per console rapida e la eseguirò, solo per dimostrare che posso. Questo lavoro verrà buttato via quando esco dal container.

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!

Se lo provi tu stesso, noterai che "dotnet run" non è molto veloce. Questo perché esegue il ripristino, la compilazione e l'esecuzione. La compilazione non è super veloce su questi piccoli dispositivi. Avrai voglia di lavorare il meno possibile. Invece di eseguire continuamente una "esecuzione dotnet", eseguirò una "build dotnet" e poi un "exec dotnet" che è molto veloce.

Se stai facendo Docker e .NET Core, non posso sottolineare abbastanza quanto siano utili le risorse a https://github.com/dotnet/dotnet-docker .

Creazione di app .NET Core con Docker

  • Esempio Docker .NET Core:questo esempio compila, testa ed esegue l'esempio. Include e costruisce più progetti.
  • Esempio di ASP.NET Core Docker:questo esempio mostra l'uso di Docker con un'app Web ASP.NET Core.

Sviluppa app .NET Core in un contenitore

  • Sviluppare applicazioni .NET Core:questo esempio mostra come sviluppare, compilare e testare applicazioni .NET Core con Docker senza la necessità di installare .NET Core SDK.
  • Sviluppare applicazioni ASP.NET Core:questo esempio mostra come sviluppare e testare applicazioni ASP.NET Core con Docker senza la necessità di installare .NET Core SDK.

Ottimizzazione delle dimensioni del contenitore

  • Esempio di .NET Core Alpine Docker:questo esempio compila, testa ed esegue un'applicazione usando Alpine.
  • Esempio autonomo .NET Core:questo esempio compila ed esegue un'applicazione come applicazione autonoma.

ARM32 / Raspberry Pi

  • Esempio Docker ARM32 .NET Core:questo esempio compila ed esegue un'applicazione con Debian su ARM32 (funziona su Raspberry Pi).
  • Esempio Docker ARM32 ASP.NET Core:questo esempio compila ed esegue un'applicazione ASP.NET Core con Debian su ARM32 (funziona su Raspberry Pi).

Ho trovato gli esempi super utili... assicurati di scavare nei Dockerfiles stessi in quanto ti forniranno un sacco di informazioni su come strutturare i tuoi file. Essere in grado di eseguire Dockerfile multistadio è fondamentale quando si costruisce su un piccolo dispositivo come un RPi. Vuoi lavorare il meno possibile e lasciare che Docker memorizzi nella cache tutti i livelli con la sua "intelligenza" interna. Se non ci prendi in considerazione, finirai per sprecare 10 volte il tempo a creare livelli di immagini per ogni build.

Dockerizzare un vero sito ASP.NET Core con i test!

Posso prendere il mio sito di podcast e installarlo su Docker e compilarlo/testarlo/eseguirlo su un Raspberry Pi? SI.

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

Lo adoro. Ora posso "costruire la finestra mobile". sul mio Raspberry Pi. Ripristinerà, testerà e costruirà. Se i test falliscono, la build Docker fallirà.

Guarda come c'è una sezione extra lassù chiamata "testrunner" e poi dopo è "test?" Quella sezione testrunner è una no-op. Imposta un ENTRYPOINT ma non viene mai utilizzato... ancora. ENTRYPOINT è un'esecuzione implicita se è l'ultima riga nel Dockerfile. È lì, quindi posso "correre fino a esso" se voglio.

Posso semplicemente creare ed eseguire in questo modo:

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

NOTA/GOTCHA: Si noti che l'immagine "runtime" è microsoft/dotnet:2.1-aspnetcore-runtime, non microsoft/dotnet:2.1-runtime. Quello di aspnetcore pre-include i binari di cui ho bisogno per eseguire un'app ASP.NET, in questo modo posso semplicemente includere un singolo riferimento a "" nel mio csproj. Se non si utilizza l'immagine di base di aspnetcore-runtime, è necessario inserire manualmente tutti i pacchetti ASP.NET Core desiderati. L'uso dell'immagine di base potrebbe aumentare le dimensioni dei file di immagine risultanti, ma è un equilibrio tra praticità e dimensioni. Tocca a voi. Puoi includere manualmente solo i pacchetti di cui hai bisogno o inserire il metapacchetto "Microsoft.AspNetCore.App" per comodità. La mia immagine "podcast" risultante è arrivata a 205 mega, quindi non male, ma ovviamente se volevo potevo ritagliare in diversi modi.

Oppure, se voglio SOLO i risultati dei test da Docker, posso farlo! Ciò significa che posso eseguire i test nel contenitore Docker, montare un volume tra il contenitore Linux e l'host (teorico) di Windows, quindi aprire il file risultante .trx in 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

Controlla! Questi sono i risultati dei test eseguiti all'interno del contenitore Linux:

Ecco il risultato. Ora ho il mio sito Web Podcast in esecuzione in Docker su un ARM32 Raspberry Pi 3 con solo un'ora di lavoro (scrivendo il Dockerfile)!

Secondo - sei arrivato così in basso? - Puoi semplicemente installare l'SDK .NET Core 2.1 "sul metallo". No Docker, prendi il file tar.gz e configuralo. Guardando il Dockerfile RPi ARM32v7, posso installarlo sul metallo in questo modo. Nota che sto ricevendo .NET Core SDK *e* il runtime condiviso ASP.NET Core. Nella build della versione finale otterrai solo l'SDK e includerà tutto, incluso 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

Multipiattaforma per la vittoria!

Sponsor :Dai un'occhiata a JetBrains Rider:un IDE .NET multipiattaforma. Modifica, refactoring, verifica ed esegui il debug di applicazioni ASP.NET, .NET Framework, .NET Core, Xamarin o Unity. Scopri di più e scarica una versione di prova di 30 giorni!


Docker
  1. Esecuzione di PostgreSQL in Docker, una guida rapida e pratica

  2. Rilevamento che un'app .NET Core è in esecuzione in un contenitore Docker e SkippableFacts in XUnit

  3. Ottimizzazione delle dimensioni dell'immagine Docker ASP.NET Core

  4. Esecuzione di ASP.NET Core sull'hosting Linux condiviso più economico di GoDaddy:non provarlo a casa

  5. Esecuzione di un'applicazione ASP.NET Core autonoma su Ubuntu

ZEIT ora distribuisce le app Web ASP.NET Core open source con Docker

Esplorazione di ASP.NET Core con Docker in entrambi i contenitori Linux e Windows

Pubblicazione di un'app ASP.NET 5 su Docker in Linux con Visual Studio

Spostamento di un ASP.NET Core dal servizio app di Azure in Windows a Linux eseguendo prima il test in WSL e Docker

Installazione di PowerShell Core su un Raspberry Pi (con tecnologia .NET Core)

Pubblicazione di un sito Web ASP.NET Core su un host di macchine virtuali Linux economico