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

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

Nel maggio dello scorso anno fare cose con ASP.NET e Docker era agli inizi. Ma erano in corso cose interessanti. Ho scritto un post sul blog che mostra come pubblicare un'app ASP.NET 5 (5 all'epoca, ora Core 1.0) su Docker. Più tardi, a dicembre del 2015, nuovi strumenti come Docker Toolbox e Kitematic hanno reso le cose ancora più semplici. Nel maggio del 2016 Docker per Windows Beta ha continuato a far muovere bene la palla in avanti.

Volevo vedere come stanno andando le cose con ASP.NET Core, Docker e Windows qui nell'ottobre del 2016.

Ho installato queste cose:

  • Comunità di Visual Studio 2015
    • Visual Studio 2015 Aggiornamento 3
  • ASP.NET Core con .NET Core
    • .NET Core 1.0.1 - Anteprima strumenti VS 2015 2
  • Docker per Windows (Ho usato il canale Beta)
  • Strumenti di Visual Studio per Docker

Docker per Windows è davvero bello in quanto automatizza la configurazione di Hyper-V per te e crea il sistema operativo host Docker e fa funzionare tutto. Questo è un grande risparmio di tempo.

C'è il mio host Linux a cui non devo pensare. Farò tutto dalla riga di comando o da Visual Studio.

Dirò File | Nuovo progetto e crea una nuova applicazione ASP.NET Core in esecuzione su .NET Core.

Quindi faccio clic con il pulsante destro del mouse e Aggiungi | Supporto Docker . Questo menu proviene dall'estensione Visual Studio Tools per Docker. Questo aggiunge un Dockerfile di base e alcuni file di composizione Docker. Immediatamente, sono pronto per distribuire la mia app ASP.NET Core in un contenitore Docker Linux.

ASP.NET Core in un contenitore Linux Docker

A partire dalla mia app ASP.NET Core, mi assicurerò che la mia immagine di base (che è il FROM nel Dockerfile) sia l'immagine di base ASP.NET Core per Linux.

FROM microsoft/aspnetcore:1.0.1
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
EXPOSE 80
COPY $source .

Successivamente, poiché non voglio che Docker esegua ancora la creazione della mia applicazione, la pubblicherò localmente. Assicurati di leggere il post del blog di Steve Lasker "Building Optimized Docker Images with ASP.NET Core" per imparare come fare in modo che un contenitore Docker crei la tua app e l'altro la esegua. Ciò ottimizza la densità e le risorse del server.

Pubblicherò, quindi creerò le immagini e lo eseguirò.

>dotnet publish

>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonlinux

>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonlinux latest dab2bff7e4a6 28 seconds ago 276.2 MB
microsoft/aspnetcore 1.0.1 2e781d03cb22 44 hours ago 266.7 MB

>docker run -it -d -p 85:80 aspnetcoreonlinux
1cfcc8e8e7d4e6257995f8b64505ce25ae80e05fe1962d4312b2e2fe33420413

>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cfcc8e8e7d4 aspnetcoreonlinux "dotnet WebApplicatio" 2 seconds ago Up 1 seconds 0.0.0.0:85->80/tcp clever_archimedes

E c'è la mia app ASP.NET Core in esecuzione in Docker. Quindi eseguo Windows, eseguo Hyper-V, eseguo un host Linux che ospita contenitori Docker.

Cos'altro posso fare?

ASP.NET Core in un contenitore Windows Docker che esegue Windows Nano Server

C'è Windows Server , c'è Windows Server Core che rimuove l'interfaccia utente tra le altre cose e c'è Windows Nano Server che fa scendere Windows a centinaia di mega invece di molti concerti. Ciò significa che ci sono molte ottime scelte a seconda di ciò di cui hai bisogno per funzionalità e densità del server. Spedisci il meno possibile.

Fammi vedere se riesco a far funzionare ASP.NET Core su Kestrel in Windows Nano Server. Certamente, poiché Nano è molto capace, potrei eseguire IIS all'interno del contenitore e ci sono documenti su questo.

Michael Friis di Docker ha pubblicato un ottimo post sul blog sulla creazione e l'esecuzione del primo contenitore Docker Windows Server. Con il nuovo Docker per Windows puoi semplicemente fare clic con il pulsante destro del mouse e passare da Linux a Windows Containers.

Quindi ora sto usando Docker con Windows Containers. Potresti non sapere che probabilmente hai già Windows Containers! È stato spedito all'interno di Windows 10 Anniversary Edition. Puoi controllare i contenitori in Funzionalità:

Modificherò il mio Dockerfile per utilizzare l'immagine di Windows Nano Server. Posso anche controllare le porte su cui parla ASP.NET se mi piace con una variabile di ambiente ed esporla all'interno di Docker.

FROM microsoft/dotnet:nanoserver
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .

Poi pubblicherò e costruirò...

>dotnet publish
>docker build bin\Debug\netcoreapp1.0\publish -t aspnetcoreonnano

Quindi lo eseguirò, mappando le porte da Windows all'esterno al contenitore di Windows all'interno!

NOTA: C'è un bug al momento della stesura di questo articolo che influisce sul modo in cui Windows 10 comunica ai contenitori tramite "NAT" (Network Address Translation) in modo tale che non puoi facilmente andare a http://localhost:82 come tu (e io) vogliamo. Oggi devi colpire direttamente l'IP del container. Ti riferirò una volta che avrò sentito di più su questo bug e su come viene risolto. Verrà visualizzato in Windows Update un giorno. La soluzione alternativa è ottenere l'indirizzo IP del contenitore dalla finestra mobile in questo modo:docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" HASH

UPDATE :
Questo bug è stato corretto nell'aggiornamento di aprile di Windows 10. Dettagli qui Accesso dell'host locale alle porte del contenitore di Windows

Quindi eseguirò la mia app ASP.NET Core su Windows Nano Server (di nuovo, per essere chiari, è in esecuzione su Windows 10 e Nano Server è all'interno di un contenitore!)

>docker run -it -d -p 88:82 aspnetcoreonnano
afafdbead8b04205841a81d974545f033dcc9ba7f761ff7e6cc0ec8f3ecce215

>docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" afa
172.16.240.197

Ora posso raggiungere quel sito con 172.16.240.197:82. Una volta risolto il bug di cui sopra, verrà colpito e instradato come qualsiasi contenitore.

La parte migliore dei contenitori di Windows è che sono veloci e leggeri. Una volta che l'immagine è stata scaricata e costruita sul tuo computer, le avvierai e le fermerai in pochi secondi con Docker.

MA puoi anche isolare i contenitori di Windows usando Docker in questo modo:

docker run --isolation=hyperv -it -d -p 86:82 aspnetcoreonnano

Quindi ora questa istanza viene eseguita completamente isolata all'interno di Hyper-V stesso. Ottieni il meglio di tutti i mondi. Implementazione rapida e conveniente più isolamento opzionale e facile.

ASP.NET Core in un contenitore Windows Docker che esegue Windows Server Core 2016

Posso quindi modificare il Dockerfile per utilizzare l'immagine completa di Windows Server Core. Si tratta di 8 giga, quindi sii pronto perché ci vorrà un po' per scaricarlo ed estrarlo, ma è davvero Windows. Puoi anche scegliere di eseguirlo come contenitore o come contenitore Hyper-V isolato.

Qui cambio semplicemente FROM per ottenere un Windows Server Core con .NET Core incluso.

FROM microsoft/dotnet:1.0.0-preview2-windowsservercore-sdk
ENTRYPOINT ["dotnet", "WebApplication4.dll"]
ARG source=.
WORKDIR /app
ENV ASPNETCORE_URLS http://+:82
EXPOSE 82
COPY $source .

NOTA: Ho sentito che è probabile che le immagini di .NET Core su Windows Server Core spariranno. Ha più senso che .NET Core venga eseguito su Windows Nano Server o altre immagini leggere. Utilizzerai Server Core per cose più pesanti e Server è bello perché significa che puoi eseguire app .NET Framework "complete" in contenitori! Se vuoi VERAMENTE avere .NET Core su Server Core, puoi creare il tuo Dockerfile e creare facilmente un'immagine che abbia le cose che desideri.

Quindi pubblicherò, creerò ed eseguirò di nuovo.

>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetcoreonnano latest 7e02d6800acf 24 minutes ago 1.113 GB
aspnetcoreonservercore latest a11d9a9ba0c2 28 minutes ago 7.751 GB

Poiché i container sono così veloci da avviare e arrestare, posso avere una web farm completa in esecuzione con Redis in un container, SQL in un altro e il mio stack web in un terzo. Oppure mescola e abbina.

>docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
d32a981ceabb aspnetcoreonwindows "dotnet WebApplicatio" 0.0.0.0:87->82/tcp compassionate_blackwell
a179a48ca9f6 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:86->82/tcp determined_stallman
170a8afa1b8b aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:89->82/tcp agitated_northcutt
afafdbead8b0 aspnetcoreonnano "dotnet WebApplicatio" 0.0.0.0:88->82/tcp naughty_ramanujan
2cf45ea2f008 a7fa77b6f1d4 "dotnet WebApplicatio" 0.0.0.0:97->82/tcp sleepy_hodgkin

Conclusione

Ancora una volta, dai un'occhiata all'articolo di Michael in cui usa Docker Compose per visualizzare l'esempio di ASP.NET Music Store con SQL Express in un contenitore di Windows e ASP.NET Core in un altro, nonché il blog di Steve Lasker (infatti il ​​suo intero blog è d'oro ) sulla creazione di immagini Docker ottimizzate con ASP.NET Core.

IMAGE ID            RESPOSITORY                   TAG                 SIZE
0ec4274c5571 web optimized 276.2 MB
f9f196304c95 web single 583.8 MB
f450043e0a44 microsoft/aspnetcore 1.0.1 266.7 MB
706045865622 microsoft/aspnetcore-build 1.0.1 896.6 MB

Steve indica una serie di tecniche che ti permetteranno di ottenere il massimo da Docker e ASP.NET Core.

Il risultato di tutto ciò significa (IMHO) che puoi utilizzare ASP.NET Core:

  • ASP.NET Core su Linux
    • all'interno dei container Docker
    • in qualsiasi Cloud
  • ASP.NET Core su Windows, Windows Server, Server Core e Nano Server.
    • all'interno dei contenitori di Windows Docker
    • all'interno di contenitori Hyper-V isolati da Docker

Ciò significa che puoi scegliere il livello di supporto delle funzionalità e le dimensioni da ottimizzare per densità e convenienza del server. Una volta che tutti gli strumenti (la gente di Docker con Docker per Windows e la gente di VS con Visual Studio Docker Tools) sono stati preparati, avremo un buon debug e flussi di lavoro dallo sviluppo alla produzione.

Che cosa hai fatto con Docker, Containers e ASP.NET Core? Suona nei commenti.

Sponsor: Grazie a Redgate questa settimana! Scopri lo strumento di confronto di SQL Server più affidabile al mondo. Goditi una prova gratuita di SQL Compare, lo standard del settore per il confronto e la distribuzione di schemi di SQL Server.


Docker
  1. Che cos'è Docker (e contenitori Linux?)

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

  3. Come scrivere un demone Linux con .Net Core

  4. Copia il file da Linux a Windows Condividi con C# (.NET core)

  5. Crittografa un disco rigido esterno con accesso in lettura e scrittura su Windows e Linux

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

Docker e contenitori Linux su Windows, con o senza macchine virtuali Hyper-V

.NET e Docker

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

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