GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Creación, ejecución y prueba de .NET Core y ASP.NET Core 2.1 en Docker en una Raspberry Pi (ARM32)

Me encanta algo de Raspberry Pi. Son excelentes pequeñas máquinas de aprendizaje y son súper divertidos para que jueguen los niños. Incluso si esos niños son adultos y construyen un Kubernetes Raspberry Pi Cluster de 6 nodos.

.NET Core de código abierto se ejecuta básicamente en todas partes:Windows, Mac y una docena de Linux. Sin embargo, hay un SDK (que compila y crea) y un tiempo de ejecución (que ejecuta la aplicación). En el pasado, el SDK de .NET Core (para ser claros, la capacidad de "construir dotnet") no era compatible con chips ARMv7/ARMv8 como Raspberry Pi. Ahora lo es.

.NET Core ahora es compatible con distribuciones Linux ARM32, como Raspbian y Ubuntu !

Nota: .NET Core 2.1 es compatible con Raspberry Pi 2+. No es compatible con Pi Zero u otros dispositivos que usan un chip ARMv6. .NET Core requiere chips ARMv7 o ARMv8, como ARM Cortex-A53. La gente del equipo de Azure IoT Edge usa las imágenes de Docker ARM32 de .NET Core Bionic para ayudar a los desarrolladores a escribir C# con dispositivos Edge.

Hay dos formas de ejecutar .NET Core en una Raspberry Pi.

Uno, usa Docker . Esta es, literalmente, la forma más rápida y sencilla de poner en marcha .NET Core en una Pi. Suena loco, pero los Raspberry Pi son pequeños y brillantes sistemas con capacidad para contenedores Docker. Puedes hacerlo en minutos, de verdad. Puede instalar Docker rápidamente en una Raspberry Pi con solo:

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

Después de instalar Docker, querrá iniciar y cerrar sesión. ¡Es posible que desee probar una muestra rápida para asegurarse de que .NET Core se ejecute! Puede explorar las etiquetas de Docker disponibles en https://hub.docker.com/r/microsoft/dotnet/tags/ y puede leer sobre las muestras de .NET Core Docker aquí https://github.com/dotnet/dotnet- ventana acoplable/árbol/maestro/muestras/dotnetapp

Ahora puedo ejecutar docker y luego pasar "dotnet --info" para obtener información sobre dotnet en mi 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

Esto es genial. Ahí estoy en Raspberry Pi (RPi) y solo pido dotnet:2.1-sdk y debido a que están usando archivos docker "multiarch", Docker hace lo correcto y simplemente funciona. Si desea usar .NET Core en ARM32 con Docker, puede usar cualquiera de las siguientes etiquetas.

Nota: Las primeras tres etiquetas son multiarco y bionic es Ubuntu 18.04. El tramo de nombre en clave es Debian 9. Así que estoy usando 2.1-sdk y está funcionando en mi RPi, pero puedo ser específico si lo prefiero.

  • 2.1 SDK
  • tiempo de ejecución 2.1
  • 2.1-aspnetcore-tiempo de ejecución
  • 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

Pruebe uno en minutos como este:

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

Aquí está descargando las imágenes...

En versiones anteriores de Dockerfiles de .NET Core fallaría si estuviera ejecutando una imagen x64 en ARM:

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

¡Diferentes procesadores! Pero con multiarch por https://github.com/dotnet/announcements/issues/14 Kendra de Microsoft solo funciona con 2.1.

Docker tiene una característica de múltiples arquitecturas que microsoft/dotnet-nightly comenzó a utilizar recientemente. El plan es portar esto al repositorio oficial de microsoft/dotnet en breve. La función de varias arquitecturas permite utilizar una sola etiqueta en varias configuraciones de máquinas. Sin esta característica, cada arquitectura/SO/plataforma requiere una etiqueta única. Por ejemplo, la etiqueta microsoft/dotnet:1.0-runtime se basa en Debian y microsoft/dotnet:1.0-runtime-nanoserver si se basa en Nano Server. Con varias arquitecturas, habrá una etiqueta común microsoft/dotnet:1.0-runtime. Si extrae esa etiqueta de un entorno de contenedor de Linux, obtendrá la imagen basada en Debian, mientras que si extrae esa etiqueta de un entorno de contenedor de Windows, obtendrá la imagen basada en Nano Server. Esto ayuda a proporcionar uniformidad de etiquetas en todos los entornos de Docker, eliminando así la confusión.

En estos ejemplos anteriores puedo:

  • Ejecute una aplicación preconfigurada dentro de una imagen de Docker como:
    • ejecutar docker --rm microsoft/dotnet-samples:dotnetapp
  • Ejecute comandos dotnet dentro de la imagen SDK como:
    • ejecutar docker --rm -it microsoft/dotnet:2.1-sdk dotnet --info
  • Ejecute un terminal interactivo dentro de la imagen SDK como:
    • ejecutar docker --rm -it microsoft/dotnet:2.1-sdk

Como ejemplo rápido, aquí saltaré a un contenedor y crearé una nueva aplicación de consola rápida y la ejecutaré, solo para demostrar que puedo. Este trabajo se desechará cuando salga del contenedor.

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 lo prueba usted mismo, notará que "dotnet run" no es muy rápido. Eso es porque hace una restauración, compilación y ejecución. La compilación no es súper rápida en estos pequeños dispositivos. Querrás hacer el menor trabajo posible. En lugar de una "ejecución de dotnet" todo el tiempo, haré una "compilación de dotnet" y luego una "ejecución de dotnet", que es muy rápida.

Si está haciendo Docker y .NET Core, no puedo enfatizar lo suficiente lo útiles que son los recursos en https://github.com/dotnet/dotnet-docker .

Creación de aplicaciones .NET Core con Docker

  • Ejemplo de Docker de .NET Core:este ejemplo compila, prueba y ejecuta el ejemplo. Incluye y construye múltiples proyectos.
  • Ejemplo de ASP.NET Core Docker:este ejemplo demuestra el uso de Docker con una aplicación web ASP.NET Core.

Desarrolle aplicaciones .NET Core en un contenedor

  • Desarrolle aplicaciones .NET Core:este ejemplo muestra cómo desarrollar, compilar y probar aplicaciones .NET Core con Docker sin necesidad de instalar el SDK de .NET Core.
  • Desarrolle aplicaciones ASP.NET Core:este ejemplo muestra cómo desarrollar y probar aplicaciones ASP.NET Core con Docker sin necesidad de instalar el SDK de .NET Core.

Optimización del tamaño del contenedor

  • Ejemplo de Alpine Docker de .NET Core:este ejemplo crea, prueba y ejecuta una aplicación mediante Alpine.
  • Ejemplo autónomo de .NET Core:este ejemplo compila y ejecuta una aplicación como una aplicación autónoma.

ARM32 / Frambuesa Pi

  • Ejemplo de .NET Core ARM32 Docker:este ejemplo compila y ejecuta una aplicación con Debian en ARM32 (funciona en Raspberry Pi).
  • Ejemplo de ASP.NET Core ARM32 Docker:este ejemplo compila y ejecuta una aplicación ASP.NET Core con Debian en ARM32 (funciona en Raspberry Pi).

Encontré que las muestras son muy útiles... asegúrese de profundizar en los propios Dockerfiles, ya que le dará mucha información sobre cómo estructurar sus propios archivos. Ser capaz de hacer Dockerfiles multietapa es crucial cuando se construye en un dispositivo pequeño como un RPi. Desea hacer el menor trabajo posible y dejar que Docker almacene en caché tantas capas con su "inteligencia" interna. Si no piensa en esto, terminará desperdiciando 10 veces más tiempo creando capas de imágenes en cada compilación.

¡Dockerización de un sitio ASP.NET Core real con pruebas!

¿Puedo tomar mi sitio de podcasts, dockerizarlo y compilarlo/probarlo/ejecutarlo en una Raspberry Pi? SÍ.

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

Me encanta. Ahora puedo "construir ventana acoplable". en mi Raspberry Pi. Restaurará, probará y construirá. Si las pruebas fallan, la compilación de Docker fallará.

Vea cómo hay una sección adicional llamada "testrunner" y luego "test?" Esa sección de testrunner no es operativa. Establece un PUNTO DE ENTRADA pero nunca se usa... todavía. El ENTRYPOINT es una ejecución implícita si es la última línea en el Dockerfile. Eso está ahí para que pueda "correr hasta él" si quiero.

Puedo construir y ejecutar así:

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

NOTA/ENTENDIDO: Tenga en cuenta que la imagen de "tiempo de ejecución" es microsoft/dotnet:2.1-aspnetcore-runtime, no microsoft/dotnet:2.1-runtime. Ese aspnetcore uno incluye previamente los archivos binarios que necesito para ejecutar una aplicación ASP.NET, de esa manera solo puedo incluir una sola referencia a "" en mi csproj. Si no usé la imagen base de aspnetcore-runtime, necesitaría extraer manualmente todos los paquetes de ASP.NET Core que quiero. El uso de la imagen base puede hacer que los archivos de imagen resultantes sean más grandes, pero es un equilibrio entre comodidad y tamaño. Tu decides. Puede incluir manualmente solo los paquetes que necesita o extraer el metapaquete "Microsoft.AspNetCore.App" para mayor comodidad. Mi imagen de "podcast" resultante terminó en 205 megas, por lo que no está mal, pero, por supuesto, si quisiera, podría recortarla de varias maneras.

O, si SOLO quiero resultados de prueba de Docker, ¡puedo hacer esto! Eso significa que puedo ejecutar las pruebas en el contenedor de Docker, montar un volumen entre el contenedor de Linux y el host de Windows (teórico), ¡y luego abrir el archivo resultante .trx en 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

¡Échale un vistazo! Estos son los resultados de las pruebas que se ejecutaron en el contenedor de Linux:

Aquí está el resultado. ¡Ahora tengo mi sitio web de Podcast ejecutándose en Docker en un ARM32 Raspberry Pi 3 con solo una hora de trabajo (escribiendo el Dockerfile)!

Segundo - ¿Llegaste tan abajo? - Puede simplemente instalar el SDK de .NET Core 2.1 "en el metal". No Docker, solo obtenga el tar.gz y configúrelo. Mirando el RPi ARM32v7 Dockerfile, puedo instalarlo en el metal de esta manera. Tenga en cuenta que obtengo el SDK de .NET Core *y* el tiempo de ejecución compartido de ASP.NET Core. En la compilación de la versión final, solo obtendrá el SDK e incluirá todo, incluido 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

Multiplataforma para la victoria!

Patrocinador :Consulte JetBrains Rider:un IDE .NET multiplataforma. Edite, refactorice, pruebe y depure aplicaciones ASP.NET, .NET Framework, .NET Core, Xamarin o Unity. Obtenga más información y descargue una versión de prueba de 30 días.


Docker
  1. Ejecución de PostgreSQL en Docker, una guía rápida y práctica

  2. Detectar que una aplicación .NET Core se está ejecutando en un Docker Container y SkippableFacts en XUnit

  3. Optimización de los tamaños de imagen de ASP.NET Core Docker

  4. Ejecución de ASP.NET Core en el alojamiento Linux compartido más barato de GoDaddy - No intente esto en casa

  5. Ejecución de una aplicación ASP.NET Core autónoma en Ubuntu

ZEIT ahora implementa aplicaciones web ASP.NET Core de código abierto con Docker

Exploración de ASP.NET Core con Docker en contenedores de Linux y Windows

Publicación de una aplicación ASP.NET 5 en Docker en Linux con Visual Studio

Mover un ASP.NET Core de Azure App Service en Windows a Linux probando primero en WSL y Docker

Instalación de PowerShell Core en una Raspberry Pi (con tecnología de .NET Core)

Publicación de un sitio web ASP.NET Core en un host de máquina virtual Linux económico