GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Membangun, Menjalankan, dan Menguji .NET Core dan ASP.NET Core 2.1 di Docker pada Raspberry Pi (ARM32)

Saya suka saya beberapa Raspberry Pi. Mereka adalah mesin pembelajaran kecil yang hebat dan sangat menyenangkan untuk dimainkan anak-anak. Bahkan jika anak-anak itu sudah dewasa dan mereka membangun 6 node Kubernetes Raspberry Pi Cluster.

Open source .NET Core pada dasarnya berjalan di mana saja - Windows, Mac, dan selusin Linux. Namun, ada SDK (yang mengkompilasi dan membangun) dan Runtime (yang menjalankan aplikasi Anda yang sebenarnya). Di masa lalu, .NET Core SDK (lebih jelasnya, kemampuan untuk "membangun dotnet") tidak didukung pada chip ARMv7/ARMv8 seperti Raspberry Pi. Sekarang.

.NET Core sekarang didukung di distro Linux ARM32, seperti Raspbian dan Ubuntu !

Catatan: .NET Core 2.1 didukung pada Raspberry Pi 2+. Ini tidak didukung pada Pi Zero atau perangkat lain yang menggunakan chip ARMv6. .NET Core membutuhkan chip ARMv7 atau ARMv8, seperti ARM Cortex-A53. Orang-orang di tim Azure IoT Edge menggunakan gambar .NET Core Bionic ARM32 Docker untuk mendukung pengembang menulis C# dengan perangkat Edge.

Ada dua cara untuk menjalankan .NET Core di Raspberry Pi.

Satu, gunakan Pekerja Buruh . Ini benar-benar cara tercepat dan termudah untuk mengaktifkan dan menjalankan .NET Core di Pi. Kedengarannya gila tetapi Raspberry Pis adalah sistem yang mampu menampung Docker kecil yang brilian. Anda dapat melakukannya dalam hitungan menit, sungguh. Anda dapat menginstal Docker dengan cepat di Raspberry Pi hanya dengan:

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

Setelah menginstal Docker, Anda pasti ingin masuk dan keluar. Anda mungkin ingin mencoba contoh cepat untuk memastikan .NET Core berjalan! Anda dapat menjelajahi tag Docker yang tersedia di https://hub.docker.com/r/microsoft/dotnet/tags/ dan Anda dapat membaca tentang sampel .NET Core Docker di sini https://github.com/dotnet/dotnet- buruh pelabuhan/pohon/master/sampel/dotnetapp

Sekarang saya hanya dapat menjalankan docker dan mengirimkan "dotnet --info" untuk mencari tahu tentang dotnet di Pi saya.

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

Ini sangat keren. Di sana saya menggunakan Raspberry Pi (RPi) dan saya hanya meminta dotnet:2.1-sdk dan karena mereka menggunakan file buruh pelabuhan "multiarch", Docker melakukan hal yang benar dan itu hanya berfungsi. Jika Anda ingin menggunakan .NET Core pada ARM32 dengan Docker, Anda dapat menggunakan salah satu dari tag berikut.

Catatan: Tiga tag pertama adalah multi-lengkungan dan bionik adalah Ubuntu 18.04. Peregangan nama kode adalah Debian 9. Jadi saya menggunakan 2.1-sdk dan itu bekerja pada RPi saya, tapi saya bisa lebih spesifik jika saya mau.

  • 2.1-sdk
  • 2.1-runtime
  • 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

Coba satu dalam beberapa menit seperti ini:

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

Ini dia download gambarnya...

Di Dockerfiles .NET Core versi sebelumnya, ini akan gagal jika Anda menjalankan image x64 di ARM:

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

Prosesor yang berbeda! Tetapi dengan multiarch per https://github.com/dotnet/announcements/issues/14 Kendra dari Microsoft hanya berfungsi dengan 2.1.

Docker memiliki fitur multi-lengkungan yang baru-baru ini mulai digunakan oleh microsoft/dotnet-nightly. Rencananya adalah segera porting ini ke repo microsoft/dotnet resmi. Fitur multi-lengkungan memungkinkan satu tag digunakan di beberapa konfigurasi mesin. Tanpa fitur ini, setiap arsitektur/OS/platform memerlukan tag unik. Misalnya, tag microsoft/dotnet:1.0-runtime didasarkan pada Debian dan microsoft/dotnet:1.0-runtime-nanoserver jika didasarkan pada Nano Server. Dengan multi-arch akan ada satu tag microsoft/dotnet:1.0-runtime yang umum. Jika Anda menarik tag itu dari lingkungan wadah Linux, Anda akan mendapatkan gambar berbasis Debian sedangkan jika Anda menarik tag itu dari lingkungan wadah Windows, Anda akan mendapatkan gambar berbasis Server Nano. Ini membantu memberikan keseragaman tag di seluruh lingkungan Docker sehingga menghilangkan kebingungan.

Dalam contoh di atas saya dapat:

  • Jalankan aplikasi yang telah dikonfigurasikan sebelumnya dalam gambar Docker seperti:
    • docker run --rm microsoft/dotnet-samples:dotnetapp
  • Jalankan perintah dotnet dalam gambar SDK seperti:
    • docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info
  • Jalankan terminal interaktif dalam gambar SDK seperti:
    • docker run --rm -it microsoft/dotnet:2.1-sdk

Sebagai contoh cepat, di sini saya akan melompat ke wadah dan membuat aplikasi konsol cepat dan menjalankannya, hanya untuk membuktikan bahwa saya bisa. Pekerjaan ini akan dibuang begitu saya keluar dari 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!

Jika Anda mencobanya sendiri, Anda akan melihat bahwa "dotnet run" tidak terlalu cepat. Itu karena melakukan restore, build, dan run. Kompilasi tidak super cepat pada perangkat kecil ini. Anda akan ingin melakukan pekerjaan sesedikit mungkin. Daripada "dotnet run" sepanjang waktu, saya akan melakukan "dotnet build" lalu "dotnet exec" yang sangat cepat.

Jika Anda melakukan Docker dan .NET Core, Saya tidak bisa cukup menekankan betapa bermanfaatnya sumber daya di https://github.com/dotnet/dotnet-docker .

Membangun Aplikasi Inti .NET dengan Docker

  • .NET Core Docker Sample - Sampel ini membuat, menguji, dan menjalankan sampel. Ini mencakup dan membangun banyak proyek.
  • Contoh ASP.NET Core Docker - Contoh ini menunjukkan penggunaan Docker dengan ASP.NET Core Web App.

Mengembangkan Aplikasi Inti .NET dalam Wadah

  • Mengembangkan Aplikasi .NET Core - Contoh ini menunjukkan cara mengembangkan, membangun, dan menguji aplikasi .NET Core dengan Docker tanpa perlu menginstal .NET Core SDK.
  • Mengembangkan Aplikasi ASP.NET Core - Contoh ini menunjukkan cara mengembangkan dan menguji aplikasi ASP.NET Core dengan Docker tanpa perlu menginstal .NET Core SDK.

Mengoptimalkan Ukuran Penampung

  • .NET Core Alpine Docker Sample - Contoh ini membuat, menguji, dan menjalankan aplikasi menggunakan Alpine.
  • .NET Core Self-Contained Sample - Contoh ini membuat dan menjalankan aplikasi sebagai aplikasi mandiri.

ARM32 / Raspberry Pi

  • .NET Core ARM32 Docker Sample - Contoh ini membuat dan menjalankan aplikasi dengan Debian pada ARM32 (berfungsi pada Raspberry Pi).
  • Contoh Docker ARM32 Core ASP.NET Core - Contoh ini membuat dan menjalankan aplikasi ASP.NET Core dengan Debian pada ARM32 (berfungsi pada Raspberry Pi).

Saya menemukan sampelnya sangat berguna ... pastikan untuk menggali sendiri Dockerfiles karena itu akan memberi Anda banyak wawasan tentang cara menyusun file Anda sendiri. Mampu melakukan Multistage Dockerfiles sangat penting ketika membangun perangkat kecil seperti RPi. Anda ingin melakukan pekerjaan sesedikit mungkin dan membiarkan Docker men-cache sebanyak mungkin lapisan dengan "kecerdasan" internalnya. Jika Anda tidak memikirkan hal ini, pada akhirnya Anda akan membuang 10x waktu untuk membuat layer gambar setiap build.

Meng-docker Situs Inti ASP.NET nyata dengan pengujian!

Bisakah saya mengambil situs podcast saya dan melakukan Dockerize dan membangun/menguji/menjalankannya di Raspberry Pi? YA.

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

Suka sekali. Sekarang saya bisa "membangun buruh pelabuhan." di Raspberry Pi saya. Ini akan memulihkan, menguji, dan membangun. Jika pengujian gagal, build Docker akan gagal.

Lihat bagaimana ada bagian tambahan di sana yang disebut "testrunner" dan kemudian setelah itu adalah "test?" Bagian testrunner itu adalah larangan. Ini menetapkan ENTRYPOINT tetapi tidak pernah digunakan...belum. ENTRYPOINT adalah menjalankan implisit jika itu adalah baris terakhir di Dockerfile. Itu ada di sana sehingga saya bisa "Berlari ke sana" jika saya mau.

Saya hanya bisa membangun dan menjalankan seperti ini:

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

CATATAN/GOTCHA: Perhatikan bahwa gambar "runtime" adalah microsoft/dotnet:2.1-aspnetcore-runtime, bukan microsoft/dotnet:2.1-runtime. Aspnetcore itu sudah termasuk binari yang saya perlukan untuk menjalankan aplikasi ASP.NET, dengan begitu saya bisa memasukkan satu referensi ke "" di csproj saya. Jika tidak menggunakan gambar dasar aspnetcore-runtime, saya harus secara manual menarik semua paket ASP.NET Core yang saya inginkan. Menggunakan gambar dasar mungkin membuat file gambar yang dihasilkan lebih besar, tetapi ini adalah keseimbangan antara kenyamanan dan ukuran. Terserah kamu. Anda dapat secara manual memasukkan hanya paket yang Anda butuhkan, atau menarik paket meta "Microsoft.AspNetCore.App" untuk kenyamanan. Hasil gambar "podcast" saya mencapai 205 MB, jadi tidak terlalu buruk, tetapi tentu saja jika saya mau, saya dapat memangkas dengan beberapa cara.

Atau, jika saya HANYA ingin hasil tes dari Docker, saya bisa melakukan ini! Itu berarti saya dapat menjalankan tes di wadah Docker, memasang volume antara wadah Linux dan host Window (teoretis), dan kemudian membuka file .trx yang dihasilkan di 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

Saksikan berikut ini! Ini adalah hasil pengujian dari pengujian yang dijalankan di dalam Linux Container:

Berikut hasilnya. Saya sekarang menjalankan situs web Podcast saya di Docker pada ARM32 Raspberry Pi 3 hanya dengan kerja satu jam (menulis Dockerfile)!

Kedua - apakah Anda berhasil sejauh ini? - Anda cukup menginstal .NET Core 2.1 SDK "pada logam." Tidak ada Docker, cukup dapatkan tar.gz dan atur. Melihat RPi ARM32v7 Dockerfile, saya dapat menginstalnya di logam seperti ini. Catatan Saya mendapatkan .NET Core SDK *dan* runtime bersama ASP.NET Core. Dalam rilis final build, Anda hanya akan mendapatkan SDK dan itu akan mencakup semuanya, termasuk 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

Lintas platform untuk menang!

Sponsor :Lihat JetBrains Rider:IDE .NET lintas platform. Edit, refactor, uji dan debug aplikasi ASP.NET, .NET Framework, .NET Core, Xamarin atau Unity. Pelajari lebih lanjut dan unduh uji coba 30 hari!


Docker
  1. Menjalankan PostgreSQL di Docker, Panduan Cepat dan Praktis

  2. Mendeteksi bahwa aplikasi .NET Core berjalan di Docker Container dan SkippableFacts di XUnit

  3. Menjalankan ASP.NET Core di Hosting Linux bersama termurah GoDaddy - Jangan Coba Ini Di Rumah

  1. Cara Menginstal Docker di Raspberry Pi

  2. Mengoptimalkan ukuran Gambar ASP.NET Core Docker

  3. Menjalankan aplikasi ASP.NET Core mandiri di Ubuntu

  1. Dasar-dasar Raspberry Pi:menginstal Raspbian dan menjalankannya

  2. Docker Bagian 4:membangun dan memublikasikan gambar buruh pelabuhan khusus

  3. Memulai dengan .NET Core dan Docker dan Microsoft Container Registry