Aprile 2017

Volume 32 Numero 4

Il presente articolo è stato tradotto automaticamente.

Contenitori - Modernizzazione delle app .NET tradizionali con Docker

Da Elton Stoneman

Microsoft .NET Framework è stata una piattaforma di applicazioni ha esito positivo per 15 anni, con innumerevoli applicazioni aziendali critiche in esecuzione su versioni precedenti di Framework e le versioni precedenti di Windows Server. Queste applicazioni tradizionali offrono ancora il valore di business ideale, ma è probabile che sia difficile da gestire, aggiornare, estendere e gestire. Allo stesso modo, essi non possono giustificare gli investimenti necessari per una riscrittura completa. Con Docker, una piattaforma per l'esecuzione di applicazioni in contenitori leggeri e Windows Server 2016, è possibile assegnare le applicazioni tradizionali un nuovo lease sulla vita: aggiunta di funzionalità, protezione e le prestazioni e lo spostamento verso la distribuzione continua, senza un progetto di ricompilazione lunga e costosa.

In questo articolo sarà richiedere un'app Web Form ASP.NET monolitica che si connette a un database di SQL Server e modernizzare, usufruendo dei vantaggi della piattaforma di Docker. Per iniziare, lo spostamento dell'intera applicazione è a Docker, senza alcuna modifica del codice, ed eseguire il sito Web e il database in contenitori leggeri. Quindi verrà illustrato un approccio basato su funzionalità per estendere l'app, migliorando le prestazioni e offrendo agli utenti self-service analitica. Con la piattaforma Docker verrà illustrato come eseguire l'iterazione con le nuove versioni dell'app, l'aggiornamento dei componenti in modo rapido e sicuro e distribuire la soluzione completa a Microsoft Azure.

Dove viene inserito Docker soluzioni .NET

Docker è per le applicazioni server, siti Web, API, soluzioni di messaggistica e altri componenti che vengono eseguiti in background. Poiché non esiste alcuna integrazione dell'interfaccia utente tra la piattaforma di Docker e l'host di Windows non è possibile eseguire le applicazioni desktop in Docker. Che le regole in esecuzione di applicazioni Windows Form o Windows Presentation Foundation (WPF) in contenitori (anche se è possibile utilizzare Docker per assemblare e distribuire le applicazioni desktop), ma le applicazioni di console Windows Communication Foundation (WCF), .NET e tutte le versioni di ASP.NET sono ottimi candidati.

Per assemblare un'applicazione da eseguire in Docker, scrivere un piccolo script chiamato un Dockerfile che consente di automatizzare tutti i passaggi per la distribuzione dell'applicazione. In genere questo include i comandi di Windows PowerShell per la configurazione e istruzioni per copiare il contenuto dell'applicazione e impostare le eventuali dipendenze. È possibile decomprimere archivi compressi o installare troppo MSI, ma il processo di packaging è completamente automatizzato, pertanto non è possibile eseguire un processo di installazione che dispone di un utente dell'interfaccia utente di Windows e delle esigenze di input.

Quando si sta cercando un'architettura della soluzione per individuare le parti possono eseguire in contenitori Docker, tenere in considerazione qualsiasi componente che può essere installato ed eseguito senza interfaccia utente di Windows è un buon candidato. Questo articolo è incentrato sulle applicazioni .NET Framework, ma è possibile eseguire alcuna operazione in un contenitore di Windows che esegue Windows Server, incluse le applicazioni .NET Core, Java, Node. js e Go.

Migrazione di applicazioni .NET ai contenitori

Come esegue la migrazione in Docker dipende dalla modalità attualmente in esecuzione l'applicazione. Se si dispone di un'applicazione completamente configurata in esecuzione in una macchina virtuale Hyper-V, lo strumento Image2Docker open source può generare automaticamente un Dockerfile dal disco della macchina virtuale. Se si dispone di un processo di compilazione che pubblica un file MSI o un pacchetto WebDeploy, è facile scrivere il proprio Dockerfile usando una delle immagini di base di Microsoft sull'Hub Docker.

Ecco un Dockerfile completo che consente di generare script di creazione del pacchetto di un'applicazione Web Form ASP.NET in un'immagine Docker:

FROM microsoft/aspnet:windowsservercore-10.0.14393.693
SHELL ["powershell"]
RUN Remove-Website -Name 'Default Web Site'; \
    New-Item -Path 'C:\web-app' -Type Directory; \
    New-Website -Name 'web-app' -PhysicalPath 'C:\web-app' -Port 80 -Force
EXPOSE 80
RUN Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters' \
    -Name ServerPriorityTimeLimit -Value 0 -Type DWord
COPY ProductLaunch.Web /web-app

Nove righe di script sono tutti che sono necessarie e non sono presenti modifiche dell'applicazione. Potrebbe trattarsi di un'applicazione ASP.NET 2.0, attualmente in esecuzione su Windows Server 2003, con questo Dockerfile possibile sviluppare, in un'immagine che aggiorna immediatamente l'app a Windows Server 2016 e .NET Framework 4.5. Esaminerò ognuna di queste istruzioni:

  • DA microsoft/aspnet indica Docker l'immagine da utilizzare come punto di partenza. In questo caso, è un'immagine di Microsoft IIS e ASP.NET installato in una versione specifica di Windows Server Core.
  • SHELL ["powershell"] diventa una shell diverso per il resto del Dockerfile, pertanto è possibile eseguire i cmdlet di PowerShell.
  • ESEGUIRE Remove-sito Web Usa PowerShell per configurare IIS, rimuovendo il sito Web predefinito e crearne uno nuovo con un percorso noto per l'applicazione.
  • ESPORRE 80 verrà visualizzata la porta 80 in modo esplicito per consentire il traffico di rete nel contenitore come contenitori Docker siano bloccati per impostazione predefinita.
  • ESEGUIRE Set-ItemProperty consente di disattivare la cache DNS di Windows all'interno dell'immagine, pertanto tutte le richieste DNS vengono servite da Docker.
  • COPIARE il progetto di sito Web pubblicato ProductLaunch.Webcopies dalla directory ProductLaunch.Web nell'host nell'immagine.

Dockerfile è simile a una Guida alla distribuzione per l'applicazione Web, ma anziché da un documento di risorse umano imprecisi, è uno script preciso e utilizzabile. Per produrre l'app in pacchetto esecuzione di docker compilazione comando dalla directory contenente il file Docker e il sito Web pubblicato:

docker build --tag sixeyed/msdn-web-app:v1 .

Questo comando crea un'immagine Docker con il nome sixeyed/msdn-web-app e il tag v1. Il nome contiene account dell'utente per l'Hub (sixeyed), quindi, posso condividere l'immagine da accesso con le credenziali e inserendolo all'Hub. I tag sono utili per le immagini di controllo delle versioni, pertanto quando crea una nuova versione dell'applicazione, il pacchetto il nome dell'immagine rimarrà invariata, ma il tag sarà v2.

È ora possibile eseguire un contenitore dall'immagine che verrà avviata l'applicazione, ma l'applicazione di esempio ha una dipendenza su SQL Server, quindi è necessario per avviare il sito Web in esecuzione SQL Server.

Estrazione delle dipendenze hub Docker

Docker dispone di uno stack di rete che consente ai contenitori di raggiungere tra loro in una rete virtuale e consente inoltre di contenitori di raggiungere l'host esterni in esecuzione nella rete fisica. Impossibile utilizzare se avessimo un'istanza di SQL Server in esecuzione in un computer nella rete, l'applicazione ASP.NET nel contenitore, ovvero solo è necessario specificare il nome del server nella stringa di connessione. È possibile eseguire SQL Server in un contenitore e l'app Web sarà in grado di raggiungere con il nome del contenitore nella stringa di connessione.

SQL Server Express è disponibile nell'Hub Docker in un'immagine gestita da Microsoft. Per avviare un contenitore di database di tale immagine, eseguire:

docker run --detach `
 --publish 1433:1433 `
 --env sa_password=MSDNm4g4z!n3 `
 --env ACCEPT_EULA=Y `
 --name sql-server `
 microsoft/mssql-server-windows-express

Verrà avviato un contenitore in background con il flag di scollegamento e pubblicato la porta 1433, in modo che la connessione all'istanza di SQL nel contenitore dall'esterno, ad esempio tramite SQL Server Management Studio sull'host. Le opzioni env sono coppie chiave-valore, le superfici di Docker all'interno del contenitore come variabili di ambiente di sistema. Immagine di SQL Server utilizza questi valori per verificare che il contratto di licenza è stato accettato e impostare la password per l'utente sa.

Per eseguire un contenitore, Docker deve avere una copia dell'immagine in locale. Distribuzione si basa nella piattaforma di Docker, pertanto se non si dispone dell'immagine di SQL Server Express locale quando si esegue questo comando, Docker questo verrà scaricato dall'Hub. Sono presenti più della metà un immagini milioni Docker hub, che sono stati scaricati più di 9 miliardi di volte. Docker avviato nel mondo Linux e la maggior parte di queste immagini sono applicazioni Linux, ma sono presenti un numero crescente di applicazioni di Windows di qualità elevata è possibile scaricare e inserirlo direttamente la soluzione.

SQL Server è in esecuzione in un contenitore Docker ora e l'applicazione Web utilizza sql server come il nome host nella stringa di connessione in modo che si connetterà al database in esecuzione in Docker. Posso avviare l'applicazione Web Form in background e la porta 80 per rendere accessibile il sito Web di pubblicazione:

docker run --detach `
 --publish 80:80 `
 sixeyed/msdn-web-app:v1

Se un computer esterno invia una richiesta sulla porta 80 per l'host, Docker riceve la richiesta e lo inoltra in modo trasparente all'applicazione ASP.NET in esecuzione nel contenitore. Se si lavora nell'host, è necessario utilizzare "docker controllare" per ottenere IP il contenitore avvio microsito indirizzo e passare al contenitore per visualizzare il sito, che è un prodotto semplice. È possibile visualizzare i dati acquisire pagina dal sito in esecuzione in Docker in figura 1.

Una pagina di iscrizione per un sito in esecuzione in Docker
Figura 1 pagina per un sito in esecuzione in Docker

Eseguire "docker ps" e si verrà visualizzato un elenco di tutti i contenitori in esecuzione. Uno è un database e uno è un'applicazione Web, ma gestirli entrambi nello stesso modo, ovvero "top docker" Mostra i processi in esecuzione nel contenitore; Mostra "docker log" è il log di output dell'App; e "docker controllare" Mostra una serie di altre informazioni sul contenitore e quali porte siano aperte. La coerenza è dei principali vantaggi della piattaforma di Docker. App vengono incluso nel pacchetto, distribuite e gestite nello stesso modo, indipendentemente da quale tecnologia usare.

Suddivisione di funzionalità da applicazioni monolitiche

Ora che l'applicazione è in esecuzione su una piattaforma moderna, è possibile iniziare a rinnovare l'applicazione stessa. Suddivisione di un'applicazione monolitica nei servizi più piccoli può essere un progetto importante del lavoro, ma è possibile adottare un approccio più mirato lavorando su funzionalità principali, ad esempio quelli che cambiano regolarmente, pertanto è possibile distribuire gli aggiornamenti a una funzionalità modificata senza l'intera applicazione di test di regressione. Funzionalità con requisiti non funzionali che possono trarre vantaggio da una progettazione diversa senza una completa riprogettazione dell'applicazione può essere una buona scelta.

Se si desidera iniziare da qui risolvendo un problema di prestazioni. Nel codice esistente, l'applicazione effettua una connessione sincrona al database per salvare i dati dell'utente. Che approccio non è facilmente scalabile, ovvero un numero elevato di utenti simultanei a prendere un collo di bottiglia di SQL Server. Comunicazione asincrona con una coda di messaggi è una progettazione molto più scalabile. Per questa funzionalità, posso pubblicare un evento dall'app Web a una coda di messaggi e spostare il codice di persistenza dei dati in un nuovo componente che gestisce il messaggio di evento.

Questa progettazione è ottimale. Se si dispone di un picco di traffico per il sito Web è possibile eseguire più contenitori su più host per affrontare le richieste in ingresso. I messaggi di evento saranno conservati nella coda fino a quando non li utilizza il gestore di messaggi. Per le funzionalità che non dispongono di un contratto di servizio specifico, è possibile avere un gestore di messaggi in esecuzione in un singolo contenitore e si basano sulle garanzie della coda di messaggi che tutti gli eventi vengono gestiti alla fine. Per le funzionalità basate sul contratto di servizio è possibile scalare orizzontalmente il livello di persistenza tramite l'esecuzione di più contenitori di gestore di messaggi.

Il codice sorgente che accompagna questo articolo è presenti cartelle per la versione 1, versione 2 e 3 di versione dell'applicazione. Nella versione 2, la pagina SignUp.aspx pubblica un evento quando l'utente invia il modulo dei dettagli:

var eventMessage = new ProspectSignedUpEvent
{
  Prospect = prospect,
  SignedUpAt = DateTime.UtcNow
};
MessageQueue.Publish(eventMessage);

Anche nella versione 2 è un progetto di messaggistica condiviso che astrae i dettagli della coda dei messaggi e un'applicazione console che attende l'evento pubblicato dal sito Web e Salva i dati dell'utente nel database. Il codice di persistenza nell'applicazione console è elevato direttamente dal codice versione 1 dell'app Web, in modo che l'implementazione è lo stesso ma è stata modernizzata la progettazione della funzionalità.

La nuova versione dell'applicazione è una soluzione distribuita con molte parti di lavoro, come illustrato nella figura 2.

L'applicazione rinnovato ha molte parti di utilizzo
Figura 2 viene rinnovato ha molte parti di utilizzo

Esistono dipendenze tra i componenti e dovranno essere avviato nell'ordine corretto per il corretto funzionamento della soluzione. Questo è uno dei problemi di orchestrazione di un'applicazione in esecuzione in più contenitori, ma la piattaforma Docker riguarda che prevede di trattare le applicazioni distribuite come strutture portanti.

Compongono applicazioni orchestrazione con Docker

Docker Compose è la parte della piattaforma Docker è incentrato sulle applicazioni distribuite. Definire tutte le parti dell'applicazione come servizi in un file di testo semplice, incluse le dipendenze tra loro e i valori di configurazione che necessarie. Questo fa parte del file Docker Compose per la versione 2, che mostra solo la configurazione per l'applicazione Web:

product-launch-web:
  image: sixeyed/msdn-web-app:v2
  ports:
    - "80:80"
  depends_on:
    - sql-server
    - message-queue
  networks:
    - app-net

In questo caso, sto specificando la versione dell'immagine da utilizzare per l'applicazione Web. È possibile pubblicare la porta 80 e quindi in modo esplicito indicato che l'applicazione Web dipende da contenitori di coda di SQL Server e il messaggio. Per raggiungere questi contenitori, il contenitore Web deve essere nella stessa rete virtuale Docker, pertanto tutti i contenitori nel file Docker Compose appartengano alla stessa rete virtuale, denominata app net.

In un' posizione nel file Docker Compose definire un servizio per SQL Server, usando l'immagine di Microsoft nell'Hub Docker, e si utilizza il NAT per il servizio di Accodamento messaggi, ovvero una coda di messaggi di origine aperto ad alte prestazioni sistema di messaggistica. NAT è disponibile come un'immagine Docker hub ufficiale. Il servizio finale è per il gestore di messaggi, che è un'applicazione console .NET disponibili in un'immagine Docker, utilizzando un Dockerfile semplice.

È ora possibile eseguire l'applicazione utilizzando la riga di comando Docker Compose:

docker-compose up -d

Quindi Docker Compose avvierà contenitori per ognuno dei componenti nell'ordine corretto, con una soluzione di lavoro da un unico comando. Chiunque disponga di accesso per le immagini Docker e il file Docker Compose può eseguire l'applicazione e questo si comporta nello stesso modo, in un computer portatile Windows 10, o in un computer Windows Server 2016 che esegue nel Data Center o in Azure.

Per la versione 2, apportata una lieve modifica al codice dell'applicazione per spostare un'implementazione di funzionalità da un componente a altro. Il comportamento dell'utente finale è lo stesso, ma ora la soluzione è facilmente scalabile, in quanto il livello Web viene separato dal livello dati e la coda dei messaggi si occupa di eventuali picchi di traffico. Il nuovo progetto è facile estendere, nonché, come ho ho presentato un'architettura basata su eventi, pertanto è possibile attivare il nuovo comportamento collegando i messaggi di evento esistente.

Aggiunta di Analitica Self-Service

Per l'applicazione di esempio, se si desidera apportare una modifica di più per visualizzare quanto è possibile eseguire con la piattaforma di Docker, con il minimo sforzo. L'applicazione attualmente Usa SQL Server come database transazionale, e se si desidera aggiungere un secondo archivio di dati come un database di report. Ciò consente di mantenere reporting problemi separato da transazionale problemi e offre inoltre scelta libera dello stack tecnologico.

Nella versione 3 del codice di esempio, ho aggiunto una nuova app console .NET che attende gli stessi messaggi di evento pubblicati dall'applicazione Web. Quando entrambe le applicazioni sono in esecuzione, la coda di messaggi NAT assicura che entrambi ottenere una copia di tutti gli eventi. La nuova applicazione console riceve gli eventi e Salva i dati utente in un archivio documenti Apri origine è possibile eseguire in un contenitore Docker Windows Elasticsearch. Elasticsearch è una buona scelta poiché si adatta bene, pertanto è possibile inserirlo in cluster in più contenitori per la ridondanza, e prevede un eccellente esposti all'utente front-end disponibili chiamato Kibana.

Non ho apportate modifiche all'applicazione Web o il gestore di messaggi di SQL Server dalla versione 2, in modo che nel file Docker Compose sufficiente aggiungere nuovi servizi per Elasticsearch e Kibana e per il nuovo gestore di messaggi che scrive i documenti all'indice Elasticsearch:

index-prospect-handler:
  image: sixeyed/msdn-index-handler:v3
  depends_on:
    - elasticsearch
    - message-queue
  networks:
    - app-net

Docker Compose può inoltre eseguire aggiornamenti incrementali a un'applicazione e non verrà sostituito in esecuzione contenitori se le relative definizioni corrisponde al servizio nel file Docker Compose. Nella versione 3 dell'applicazione di esempio, sono disponibili nuovi servizi, ma non sono consentite modifiche esistente dei servizi, pertanto quando si esegue docker-comporre backup – d, Docker verrà eseguiti nuovi contenitori per Elasticsearch, Kibana e il gestore di messaggi di indice, ma lasciare gli altri in esecuzione come è, che rende per un processo di aggiornamento molto sicuro in cui è possibile aggiungere funzionalità senza disconnettere l'applicazione.

Questa applicazione preferisce convenzione alla configurazione, i nomi host per le dipendenze, analogo a Elasticsearch sono impostate come predefinite nell'app, devo verificare che i nomi di contenitore corrispondenti nel programma di installazione di Docker Compose.

Quando sono stati avviati i nuovi contenitori, è possibile usare "docker controllare" per ottenere l'indirizzo IP del contenitore Kibana e passare alla porta 5601 su tale indirizzo. Kibana dispone di un'interfaccia molto semplice e in pochi minuti è possibile sviluppare un dashboard che mostra le metriche chiave per gli utenti di registrarsi con i relativi dettagli, come illustrato nella figura 3.

Un Dashboard Kibana
Figura 3 Kibana Dashboard

Gli utenti esperti rapidamente troverà approfondita Kibana, e saranno in grado di eseguire le proprie visualizzazioni e dashboard senza la necessità di intervento IT. Senza tempi di inattività è stata aggiunta analitica self-service per l'applicazione. Il nucleo di tale funzionalità proviene dal software open source aziendale che ho preso in considerazione hub Docker nella mia soluzione. Il componente personalizzato per inserire dati nell'archivio del documento è una semplice applicazione console .NET, con circa 100 righe di codice. La piattaforma di Docker si occupa di collegamento tra i componenti.

Esecuzione Dockerized soluzioni in Azure

Un altro grande vantaggio di Docker è la portabilità. Applicazioni assemblate in immagini Docker eseguiranno identico in qualsiasi host. L'applicazione finale per questo articolo utilizza le immagini di Windows Server e SQL Server appartenente a Microsoft. l'immagine di NAT curata da Docker; e personale immagini personalizzate. Tutte le immagini vengono pubblicate nell'Hub Docker in modo da qualsiasi computer Windows 10 o Windows Server 2016 possibile estrarre le immagini ed eseguire contenitori da essi.

L'applicazione è ora pronta per il testing e distribuzione in un ambiente condiviso in Azure è semplice. Ho creato una macchina virtuale (VM) in Azure tramite Windows Server 2016 Datacenter con opzione di contenitori. Immagine di macchina virtuale viene fornito con Docker installato e configurato, che le immagini Docker di base per Windows Server Core e Nano Server è già stato scaricato. È un elemento non incluso nella macchina virtuale Docker Compose, che scaricato dalla pagina versione GitHub.

Le immagini utilizzate nel file Docker Compose sono tutti in archivi pubblici in Docker Hub. Per uno stack di software privato, non è necessario tutte le immagini disponibili pubblicamente. È comunque possibile utilizzare Hub Docker e mantenere immagini nei repository privato oppure è possibile utilizzare un'alternativa del Registro di sistema ospitato come Registro di sistema contenitore Azure. All'interno del proprio Data Center è possibile utilizzare un'opzione in locale, ad esempio attendibile del Registro di sistema Docker.

Poiché tutte le immagini siano pubbliche, sufficiente copiare il file Docker Compose su macchina virtuale di Azure ed eseguire docker-comporre backup – d. Docker verrà pull di tutte le immagini dall'Hub ed eseguire contenitori da esse nell'ordine corretto. Ogni componente utilizza convenzioni per l'accesso ad altri componenti e queste convenzioni sono integrate nel file Docker Compose, in modo che anche in un ambiente completamente nuovo, la soluzione appena viene avviata ed eseguita come previsto.

Se è lavorato sulle versioni di software aziendale, in cui impostare un nuovo ambiente è un processo manuale, rischiosa e lento, si noterà quanto vantaggio è si ricevono da Windows Server 2016 e la piattaforma di Docker. Gli elementi chiave in una soluzione di Docker, Dockerfile e il file Docker Compose, semplice e non ambiguo sostituzioni per i documenti di distribuzione manuale. Si consiglia di automazione e rendono semplice compilare, spedire ed eseguire una soluzione in modo coerente in tutti i computer.

Passaggi successivi

Se si voglia provare Docker per se stessi, il modulo PowerShell Image2Docker è un ottimo punto di partenza; Consente di possibile creare un file Docker e avviare il processo di apprendimento. Esistono alcuni corsi eccezionali, gratuite e corsi su training.docker.com, che fornisce un ambiente per l'utente. Quindi, quando si è pronti per proseguire, estrarre i laboratori di Docker su GitHub, che dispone di una vasta gamma di procedure dettagliate di contenitore di Windows.

Sono inoltre incontri Docker tutto il mondo in cui è possibile ascoltare esperti e comunicare con esperti su tutti gli aspetti relativi a Docker. La conferenza Docker big è DockerCon, che è sempre sapere come; quest'anno viene eseguito in Texas nel mese di aprile e a Copenhagen nel mese di ottobre. Last, estrazione comandanti di Docker, sono l'equivalente di Docker di MVPs Microsoft. Si sta costantemente blog, utilizzo di tweet e relativi a tutte le cose interessanti che stanno effettuando con Docker, e li è un ottimo modo per mantenere un impulso sulla tecnologia.


Elton Stonemanè in fase di sette Microsoft MVP e autore di Pluralsight che lavora in qualità di sviluppatore difensore in Docker.  Egli è stato progettazione e distribuzione di soluzioni di successo con le tecnologie Microsoft dal 2000, più di recente API e Big Data vengono proiettati in Azure e le applicazioni distribuite con Docker.

Un ringraziamento al seguente esperto tecnico che ha esaminato in questo articolo: Stato del contrassegno
Mark Heath è uno sviluppatore .NET specializzato in Azure, l'autore di NAudio e un autore di formazione per Pluralsight. Possiede un blog su markheath.net e seguirlo su Twitter: @mark_heath