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

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

Siamo agli inizi, ma questa è una bella anteprima delle possibilità delle cose a venire. Uso spesso i mattoncini LEGO in modo analogo quando parlo di sistemi software. Mi piace l'idea di scelta, flessibilità e capacità di connessione. La scelta della lingua, del sistema operativo, del metodo di distribuzione e dello stile, ecc. sono tutti importanti.

È disponibile un'anteprima di un'estensione per Visual Studio 2015 (la release candidate al momento della stesura di questo articolo) che aggiunge il supporto Docker. Se hai VS2015 RC puoi ottenere l'estensione Docker qui. Puoi sicuramente gestire le cose dalla riga di comando, ma penso che mentre leggi questo post apprezzerai la comodità di questa estensione.

NOTA: Vale anche la pena sottolineare che esiste anche una riga di comando del client Windows per Docker. Puoi "choco install docker" e leggerlo qui.

La breve spiegazione di cosa è Docker

Se non hai familiarità con Docker, ecco le super basi.

  • Macchine virtuali:probabilmente sai cos'è una macchina virtuale. È l'intero sistema operativo, l'intero computer, virtualizzato. Se desideri eseguire un'app da 10 megabyte, potresti finire per inserirla in una macchina virtuale da 10 gigabyte e portarla in giro. Ciò offre grande sicurezza e isolamento poiché la tua app è tutta sola sulla propria macchina virtuale privata, ma è un po' eccessivo. Ora vuoi distribuire 100 app e hai spazio, CPU e altre cose a cui pensare. Anche le macchine virtuali si avviano lentamente e devono essere mantenute attivamente.
  • Contenitori Docker/Linux (e contenitori Windows "Docker per Windows Server"):i contenitori Docker sono sandbox in esecuzione sullo stesso kernel del sistema operativo. Sono facili da implementare e si avviano velocemente. Come effetto collaterale dell'esecuzione sullo stesso kernel, i container ti consentono di condividere la maggior parte di quei 10 gigabyte (come numero di esempio) di software di supporto tra molte app, offrendoti meno isolamento ma anche utilizzando MOLTE meno risorse. I container si avviano rapidamente e le risorse condivise sottostanti sono ciò che viene mantenuto e aggiornato.

Docker è anche un modo per impacchettare un'app e distribuirla in modo affidabile e riproducibile. Quindi puoi dire che Docker è una tecnologia, ma anche una filosofia e un processo.

Docker e Visual Studio

Dopo aver installato l'estensione Docker per Visual Studio 2015 (anteprima), vai avanti e crea un'app ASP.NET 5. Fai clic con il pulsante destro del mouse sul progetto e premi Pubblica.

Nota la sezione Contenitori Docker che è stata aggiunta? Hai ancora PAAS (Platform as a Service) e puoi anche pubblicare su macchine virtuali anche all'interno di Azure. Seleziona Docker e sarai qui:

Creeremo una nuova VM per ospitare le nostre cose Docker. Questa VM sarà l'host per i nostri container. Oggi sarà una VM Ubuntu LTS. Nota che la finestra di dialogo include tutte le impostazioni per Docker, porte, certificati, ecc. Potrei usare VM esistenti, ovviamente.

Se non disponi di una VM, la creazione iniziale richiede un po' di tempo (5-10 minuti o più), quindi torna indietro. Se ne hai già uno, o quello che hai creato è pronto, prosegui.

Prendi nota dell'opzione Dockerfile. Di solito vorrai selezionare il tuo Dockerfile creato manualmente, supponendo che tu stia facendo più di un semplice Hello World come me.

ASP.NET Dockerfile è su GitHub:https://github.com/aspnet/aspnet-docker e nel registro Docker:https://registry.hub.docker.com/u/microsoft/aspnet/

Nella finestra di compilazione vedrai un sacco di output relativo alla finestra mobile. Ecco una versione tagliata per il sapore.

VERBOSE: Replacing tokens in Dockerfile: C:\Users\Scott\AppData\Local\Temp\PublishTemp\approot\src\WebApplication6\Properties\PublishProfiles\Dockerfile
VERBOSE: Package output path: C:\Users\Scott\AppData\Local\Temp\PublishTemp
VERBOSE: DockerHost: tcp://hanseldocker.cloudapp.net:2376
VERBOSE: DockerImageName: webapplication6
VERBOSE: DockerPublishHostPort: 80
VERBOSE: DockerPublishContainerPort: 80
VERBOSE: DockerAuthOptions: --tls
VERBOSE: DockerAppType: Web
VERBOSE: DockerBuildOnly: False
VERBOSE: DockerRemoveConflictingContainers: True
VERBOSE: LaunchSiteAfterPublish: True
VERBOSE: SiteUrlToLaunchAfterPublish:
VERBOSE: Querying for conflicting containers which has the same port mapped to the host...
Executing command [docker --tls -H tcp://hanseldocker.cloudapp.net:2376 ps -a | select-string -pattern ":80->" | foreach { Write-Output $_.ToString().split()[0] }]
VERBOSE: Building Docker image: webapplication6
Executing command [docker --tls -H tcp://hanseldocker.cloudapp.net:2376 build -t webapplication6 -f "C:\Users\Scott\AppData\Local\Temp\PublishTemp\approot\src\WebApplication6\Properties\PublishProfiles\Dockerfile" "C:\Users\Scott\AppData\Local\Temp\PublishTemp"]
VERBOSE: time="2015-05-27T10:59:06-07:00" level=warning msg="SECURITY WARNING: You are building a Docker image from Windows against a Linux Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories."
VERBOSE: Sending build context to Docker daemon 28.01 MB
VERBOSE: Step 0 : FROM microsoft/aspnet:vs-1.0.0-beta4
VERBOSE: vs-1.0.0-beta4: Pulling from microsoft/aspnet
VERBOSE: e5c30fef7918: Pulling fs layer
VERBOSE: e5c30fef7918: Pull complete
VERBOSE: e5c30fef7918: Already exists
VERBOSE: Digest: sha256:27fbe2377b5d4e66c4aaf3c984ef03d22afbfee3d4e78e10ff38cac7ff162d2e
VERBOSE: Status: Downloaded newer image for microsoft/aspnet:vs-1.0.0-beta4
VERBOSE: ---> e5c30fef7918
VERBOSE: Step 1 : ADD . /app
VERBOSE: ---> cf1f788321b3
VERBOSE: Removing intermediate container dd345cdcc5d9
VERBOSE: Step 2 : WORKDIR /app/approot/src/WebApplication6
VERBOSE: ---> Running in f22027140233
VERBOSE: ---> 7eabc0da4645
VERBOSE: Removing intermediate container f22027140233
VERBOSE: Step 3 : ENTRYPOINT dnx . Kestrel --server.urls http://localhost:80
VERBOSE: ---> Running in 4810324d32a5
VERBOSE: ---> e0a7ad38eb34
VERBOSE: Removing intermediate container 4810324d32a5
VERBOSE: Successfully built e0a7ad38eb34
The Docker image "webapplication6" was created successfully.
VERBOSE: Starting Docker container: webapplication6
Executing command [docker --tls -H tcp://hanseldocker.cloudapp.net:2376 run -t -d -p 80:80 webapplication6]
Docker container started with ID: 6d4820044df200e87f08cb5becbec879d1b58fcab73145ca3aa99a424c162054
To see standard output from your application, open a command line window and execute the following command:
docker --tls -H tcp://hanseldocker.cloudapp.net:2376 logs --follow 6d4820044df200e87f08cb5becbec879d1b58fcab73145ca3aa99a424c162054
VERBOSE: received -1-byte response of content type text/html; charset=utf-8
Executing command [Start-Process -FilePath "http://hanseldocker.cloudapp.net/"]
Publish completed successfully.

Le parti interessanti sono le chiamate a dnx (l'host di esecuzione .NET), l'avviso che ho avviato su Windows e sto andando su Linux, nonché il fatto che stiamo usando l'immagine docker "microsoft/aspnet".

Nel mio esempio, avevo VS e l'estensione creava i miei certificati. Se voglio connettermi a questa istanza dalla riga di comando di Windows Docker, devo passare quei certificati o impostare un env var. Qui sto eseguendo "ps" per vedere i contenitori Docker remoti in questa macchina virtuale Linux di Azure. Il client Docker cerca in %USERPROFILE%\.docker i certificati, quindi devi solo impostare DOCKER_HOST o passarlo in questo modo.

C:\>docker --tls -H=tcp://hanseldocker.cloudapp.net:2376 ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d4820044df2 webapplication6:latest "dnx . Kestrel --ser 58 minutes ago Up 58 minutes 0.0.0.0:80->80/tcp silly_poincare

Ha funzionato alla grande. Assicurati anche di esplorare la cartella PublishProfiles che viene creata nel progetto di Visual Studio in "Proprietà". Uno script PowerShell e uno script Shell vengono creati in quella cartella che puoi usare per pubblicare la tua app dalla riga di comando. Ad esempio:

.\hanseldocker-Docker-publish.ps1 -packOutput $env:USERPROFILE\AppData\Local\Temp\PublishTemp -pubxmlFile .\hanseldocker-Docker.pubxml

o da Linux:

cd ProjectFolder (like WebApplication/src/WebApplication)
source dnvm.sh
dnu restore --no-cache
mkdir ~/Temp
dnu publish . --out ~/Temp/ --wwwroot-out "wwwroot" --quiet
cd Properties/PublishProfiles
chmod +x ./Docker-publish.sh
./Docker-publish.sh ./Docker.pubxml ~/Temp/

Non vedo l'ora di un futuro pieno di scelte multipiattaforma e multi-strumenti. Infine, c'è una fantastica serie di video in 7 parti qui chiamata "Docker for .NET Developers" che dovresti dare un'occhiata su Channel 9.

Sponsor: Grazie mille ad Atalasoft per aver sponsorizzato il blog e il feed di questa settimana! Se la tua azienda lavora con i documenti, dai un'occhiata agli strumenti di sviluppo di Atalasoft per la visualizzazione, l'acquisizione e la trasformazione del Web e dei dispositivi mobili. Hanno anche prove gratuite e uno straordinario team di supporto.


Docker
  1. Introduzione a Visual Studio Code (VSC) su Linux

  2. Come installare Nextcloud con Docker sul tuo server Linux

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

  4. Visual Basic .Net su Linux

  5. Visual Basic è supportato da .NET Core in Linux?

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

Supporto ufficiale per il debug remoto di un'app Linux .NET Core in WSL2 da Visual Studio su Windows

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

Debug remoto di un'app Linux .NET Core in WSL2 da Visual Studio in Windows

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