Esercitazione: Distribuire un'applicazione .NET in un contenitore Windows in Azure Service FabricTutorial: Deploy a .NET application in a Windows container to Azure Service Fabric

Questa esercitazione mostra come aggiungere un'applicazione ASP.NET esistente a contenitori e assemblarla in un pacchetto come applicazione di Service Fabric.This tutorial shows you how to containerize an existing ASP.NET application and package it as a Service Fabric application. Eseguire i contenitori in locale nel cluster di sviluppo di Service Fabric e quindi distribuire l'applicazione in Azure.Run the containers locally on the Service Fabric development cluster and then deploy the application to Azure. L'applicazione salva i dati in modo permanente nel database SQL di Azure.The application persists data in Azure SQL Database.

In questa esercitazione si apprenderà come:In this tutorial, you learn how to:

  • Aggiungere un'applicazione esistente in un contenitore con Visual StudioContainerize an existing application using Visual Studio
  • Creare un database SQL di AzureCreate an Azure SQL database
  • Creare un registro contenitori di AzureCreate an Azure container registry
  • Distribuire un'applicazione di Service Fabric in AzureDeploy a Service Fabric application to Azure

prerequisitiPrerequisites

  1. Se non si ha una sottoscrizione di Azure, creare un account gratuito.If you don't have an Azure subscription, create a free account
  2. Installare Docker CE per Windows in modo da poter eseguire i contenitori in Windows 10.Install Docker CE for Windows so that you can run containers on Windows 10.
  3. Installare il runtime di Service Fabric versione 6.2 o successiva e Service Fabric SDK versione 3.1 o versioni successive.Install Service Fabric runtime version 6.2 or later and the Service Fabric SDK version 3.1 or later.
  4. Installare Visual Studio 2017 versione 15.7 o successiva con i carichi di lavoro Sviluppo di Azure e Sviluppo ASP.NET e Web.Install Visual Studio 2017 version 15.7 or later with the Azure development and ASP.NET and web development workloads.
  5. Installare Azure PowerShellInstall Azure PowerShell

Scaricare ed eseguire Fabrikam Fiber CallCenterDownload and run Fabrikam Fiber CallCenter

Scaricare l'applicazione di esempio Fabrikam Fiber CallCenter.Download the Fabrikam Fiber CallCenter sample application. Fare clic sul collegamento download archive (Scarica archivio).Click the download archive link. Dalla directory sourceCode nel file fabrikam.zip estrarre il file sourceCode.zip e quindi estrarre la directory VS2015 nel computer in uso.From the sourceCode directory in the fabrikam.zip file, extract the sourceCode.zip file and then extract the VS2015 directory to your computer.

Verificare che l'applicazione di Fabrikam Fiber CallCenter venga compilata ed eseguita senza errori.Verify that the Fabrikam Fiber CallCenter application builds and runs without error. Avviare Visual Studio come amministratore e aprire il file FabrikamFiber.CallCenter.sln.Launch Visual Studio as an administrator and open the FabrikamFiber.CallCenter.sln file. Premere F5 per eseguire il debug dell'applicazione ed eseguirla.Press F5 to debug and run the application.

Esempio Web Fabrikam

Distribuire l'applicazione in un contenitoreContainerize the application

Fare clic con il pulsante destro del mouse sul progetto FabrikamFiber.Web > Aggiungi > Supporto per l'agente di orchestrazione del contenitore.Right-click the FabrikamFiber.Web project > Add > Container Orchestrator Support. Selezionare Service Fabric come agente di orchestrazione del contenitore e fare clic su OK.Select Service Fabric as the container orchestrator and click OK.

Fare clic su per impostare adesso Docker sui contenitori Windows.Click Yes to switch Docker to Windows containers now.

Nella soluzione viene creato un nuovo progetto di applicazione di Service Fabric FabrikamFiber.CallCenterApplication.A new project Service Fabric application project FabrikamFiber.CallCenterApplication is created in the solution. Viene aggiunto un Dockerfile al progetto FabrikamFiber.Web esistente.A Dockerfile is added to the existing FabrikamFiber.Web project. Viene anche aggiunta una directory PackageRoot al progettoFabrikamFiber.Web, che contiene il manifesto del servizio e le impostazioni per il nuovo servizio FabrikamFiber.Web.A PackageRoot directory is also added to the FabrikamFiber.Web project, which contains the service manifest and settings for the new FabrikamFiber.Web service.

Il contenitore è ora pronto per la compilazione e l'inserimento come pacchetto in un'applicazione di Service Fabric.The container is now ready to be built and packaged in a Service Fabric application. Dopo aver creato l'immagine del contenitore sul computer, è possibile eseguirne il push in qualsiasi registro contenitori e quindi estrarla in qualsiasi host per l'esecuzione.Once you have the container image built on your machine, you can push it to any container registry and pull it down to any host to run.

Creare un database SQL di AzureCreate an Azure SQL DB

Quando si esegue l'applicazione Fabrikam Fiber CallCenter nell'ambiente di produzione, i dati devono essere salvati in modo permanente in un database.When running the Fabrikam Fiber CallCenter application in production, the data needs to be persisted in a database. Al momento non c'è modo di garantire la persistenza dei dati in un contenitore, pertanto non è possibile archiviare i dati di produzione in SQL Server in un contenitore.There is currently no way to guarantee persistent data in a container, therefore you cannot store production data in SQL Server in a container.

È consigliabile usare database SQL di Azure.We recommend Azure SQL Database. Per configurare ed eseguire un database di SQL Server gestito in Azure, eseguire lo script seguente.To set up and run a managed SQL Server DB in Azure, run the following script. Modificare le variabili dello script in base alle necessità.Modify the script variables as necessary. clientIP è l'indirizzo IP del computer di sviluppo.clientIP is the IP address of your development computer. Se si è protetti da un firewall aziendale, l'indirizzo IP del computer di sviluppo potrebbe non essere l'indirizzo IP esposto a Internet.If you are behind a corporate firewall, the IP address of your development computer may not be IP address exposed to the internet. È anche possibile impostare la regola del firewall del server per il database SQL tramite il portale di Azure, che elenca l'indirizzo IP del computer in uso.You can also set the server firewall rule for the SQL database through the Azure portal, which lists the IP address of your computer.

$subscriptionID="<subscription ID>"

# Sign in to your Azure account and select your subscription.
Login-AzureRmAccount -SubscriptionId $subscriptionID 

# The data center and resource name for your resources.
$dbresourcegroupname = "fabrikam-fiber-db-group"
$location = "southcentralus"

# The logical server name: Use a random value or replace with your own value (do not capitalize).
$servername = "fab-fiber-$(Get-Random)"

# Set an admin login and password for your database.
# The login information for the server.
$adminlogin = "ServerAdmin"
$password = "Password@123"

# The IP address of your development computer that accesses the SQL DB.
$clientIP = "24.18.117.76"

# The database name.
$databasename = "call-center-db"

# Create a new resource group for your deployment and give it a name and a location.
New-AzureRmResourceGroup -Name $dbresourcegroupname -Location $location

# Create the SQL server.
New-AzureRmSqlServer -ResourceGroupName $dbresourcegroupname `
    -ServerName $servername `
    -Location $location `
    -SqlAdministratorCredentials $(New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $adminlogin, $(ConvertTo-SecureString -String $password -AsPlainText -Force))

# Create the firewall rule to allow your development computer to access the server.
New-AzureRmSqlServerFirewallRule -ResourceGroupName $dbresourcegroupname `
    -ServerName $servername `
    -FirewallRuleName "AllowClient" -StartIpAddress $clientIP -EndIpAddress $clientIP

# Creeate the database in the server.
New-AzureRmSqlDatabase  -ResourceGroupName $dbresourcegroupname `
    -ServerName $servername `
    -DatabaseName $databasename `
    -RequestedServiceObjectiveName "S0"

Write-Host "Server name is $servername"

Aggiornare il file di configurazione WebUpdate the web config

Tornare al progetto FabrikamFiber.Web e aggiornare la stringa di connessione nel file web.config in modo che punti all'istanza di SQL Server nel contenitore.Back in the FabrikamFiber.Web project, update the connection string in the web.config file, to point to the SQL Server in the container. Aggiornare la parte Server della stringa di connessione per il server creato dallo script precedente.Update the Server part of the connection string for the server created by the previous script.

<add name="FabrikamFiber-Express" connectionString="Server=tcp:fab-fiber-1300282665.database.windows.net,1433;Initial Catalog=call-center-db;Persist Security Info=False;User ID=ServerAdmin;Password=Password@123;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" providerName="System.Data.SqlClient" />
<add name="FabrikamFiber-DataWarehouse" connectionString="Server=tcp:fab-fiber-1300282665.database.windows.net,1433;Initial Catalog=call-center-db;Persist Security Info=False;User ID=ServerAdmin;Password=Password@123;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" providerName="System.Data.SqlClient" />

Nota

Per il debug locale è possibile usare un'istanza di SQL Server a scelta, a condizione che sia raggiungibile dall'host.You can use any SQL Server you prefer for local debugging, as long as it is reachable from your host. localdb, tuttavia, non supporta la comunicazione container -> host.However, localdb does not support container -> host communication. Se si vuole usare un database SQL diverso durante la creazione di una compilazione di rilascio dell'applicazione Web, aggiungere un'altra stringa di connessione al file web.release.config.If you want to use a different SQL database when building a release build of your web application, add another connection string to your web.release.config file.

Eseguire l'applicazione in un contenitore in localeRun the containerized application locally

Premere F5 per eseguire l'applicazione ed eseguirne il debug in un contenitore nel cluster di sviluppo locale di Service Fabric.Press F5 to run and debug the application in a container on the local Service Fabric development cluster. Fare clic su se viene visualizzata una finestra di messaggio che richiede di concedere al gruppo 'ServiceFabricAllowedUsers' le autorizzazioni di lettura ed esecuzione per la directory del progetto di Visual Studio.Click Yes if presented with a message box asking to grant 'ServiceFabricAllowedUsers' group read and execute permissions to your Visual Studio project directory.

Creare un registro di contenitoriCreate a container registry

Ora che l'applicazione viene eseguita in locale, iniziare a preparare la distribuzione in Azure.Now that the application runs locally, start preparing to deploy to Azure. Le immagini dei contenitori devono essere archiviate in un registro contenitori.Container images need to be stored in a container registry. Creare un registro contenitori di Azure usando lo script seguente.Create an Azure container registry using the following script. Il nome del registro contenitori è visibile per le altre sottoscrizioni di Azure, pertanto deve essere univoco.The container registry name is visible by other Azure subscriptions, so it must be unique. Prima di distribuire l'applicazione in Azure, eseguire il push dell'immagine del contenitore in questo registro.Before deploying the application to Azure, you push the container image to this registry. Quando l'applicazione viene distribuita nel cluster in Azure, l'immagine del contenitore viene recuperata tramite pull da questo registro.When the application deploys to the cluster in Azure, the container image is pulled from this registry.

# Variables
$acrresourcegroupname = "fabrikam-acr-group"
$location = "southcentralus"
$registryname="fabrikamregistry$(Get-Random)"

New-AzureRmResourceGroup -Name $acrresourcegroupname -Location $location

$registry = New-AzureRMContainerRegistry -ResourceGroupName $acrresourcegroupname -Name $registryname -EnableAdminUser -Sku Basic

Creare un cluster di Service Fabric in AzureCreate a Service Fabric cluster on Azure

Le applicazioni Service Fabric sono eseguite in un cluster, un set di macchine virtuali o fisiche connesse mediante una rete.Service Fabric applications run on a cluster, a network-connected set of virtual or physical machines. Prima di poter distribuire l'applicazione in Azure, creare un cluster di Service Fabric in Azure.Before you can deploy the application to Azure, first create a Service Fabric cluster in Azure.

È possibile:You can:

  • Creare un cluster di test da Visual Studio.Create a test cluster from Visual Studio. Questa opzione consente di creare un cluster sicuro direttamente da Visual Studio con le configurazioni preferite.This option allows you to create a secure cluster directly from Visual Studio with your preferred configurations.
  • Creare un cluster sicuro da un modelloCreate a secure cluster from a template

Questa esercitazione consente di creare un cluster da Visual Studio, ideale per scenari di test.This tutorial creates a cluster from Visual Studio, which is ideal for test scenarios. Se si crea un cluster in altri modi o si usa un cluster esistente, è possibile copiare e incollare l'endpoint della connessione o sceglierlo dalla sottoscrizione.If you create a cluster some other way or use an existing cluster, you can copy and paste your connection endpoint or choose it from your subscription.

Quando si crea il cluster, scegliere uno SKU che supporta l'esecuzione dei contenitori.When creating the cluster, choose a SKU that supports running containers. Il sistema operativo Windows Server nei nodi del cluster deve essere compatibile con il sistema operativo Windows Server del contenitore.The Windows Server OS on your cluster nodes must be compatible with the Windows Server OS of your container. Per altre informazioni, vedere Windows Server container OS and host OS compatibility (Compatibilità tra il sistema operativo del contenitore di Windows Server e il sistema operativo dell'host).To learn more, see Windows Server container OS and host OS compatibility. Per impostazione predefinita, questa esercitazione consente di creare un'immagine Docker basata su Windows Server 2016 LTSC.By default, this tutorial creates a Docker image based on Windows Server 2016 LTSC. I contenitori basati su questa immagine verranno eseguiti nei cluster creati con Windows Server 2016 Datacenter con Contenitori.Containers based on this image will run on clusters created with Windows Server 2016 Datacenter with Containers. Tuttavia, se si crea un cluster o si usa un cluster esistente basato su Windows Server Datacenter Core 1709 con Contenitori, è necessario modificare l'immagine del sistema operativo Windows Server su cui è basato il contenitore.However, if you create a cluster or use an existing cluster based on Windows Server Datacenter Core 1709 with Containers, you must change the Windows Server OS image that the container is based on. Aprire Dockerfile nel progetto FabrikamFiber.Web, impostare come commento l'istruzione FROM esistente (basata su windowsservercore-ltsc) e rimuovere il commento dall'istruzione FROM basata su windowsservercore-1709.Open the Dockerfile in the FabrikamFiber.Web project, comment out the existing FROM statement (based on windowsservercore-ltsc) and uncomment the FROM statement based on windowsservercore-1709.

  1. Fare clic con il pulsante destro del mouse sul progetto di applicazione FabrikamFiber.CallCenterApplication in Esplora soluzioni e scegliere Pubblica.Right-click on the FabrikamFiber.CallCenterApplication application project in the Solution Explorer and choose Publish.

  2. Accedere con l'account Azure per poter avere accesso alle sottoscrizioni.Sign in by using your Azure account so that you can have access to your subscription(s).

  3. Selezionare l'elenco a discesa per Endpoint connessione e quindi l'opzione Crea nuovo cluster.Select the dropdown for the Connection Endpoint and select the Create New Cluster... option.

  4. Nella finestra di dialogo Crea cluster modificare le impostazioni seguenti:In the Create cluster dialog, modify the following settings:

    1. Specificare il nome del cluster nel campo Nome del cluster, nonché la sottoscrizione e la località da usare.Specify the name of your cluster in the Cluster Name field, as well as the subscription and location you want to use.
    2. Facoltativamente, è possibile modificare il numero di nodi.Optional: You can modify the number of nodes. Per impostazione predefinita vengono usati tre nodi, il numero minimo necessario per testare gli scenari di Service Fabric.By default you have three nodes, the minimum required for testing Service Fabric scenarios.
    3. Selezionare la scheda Certificato. In questa scheda digitare una password che verrà usata per proteggere il certificato del cluster.Select the Certificate tab. In this tab, type a password to use to secure the certificate of your cluster. Questo certificato consente di rendere sicuro il cluster.This certificate helps make your cluster secure. È anche possibile modificare il percorso in cui si vuole salvare il certificato.You can also modify the path to where you want to save the certificate. Visual Studio può anche importare automaticamente il certificato, perché questo passaggio è obbligatorio per la pubblicazione dell'applicazione nel cluster.Visual Studio can also import the certificate for you, since this is a required step to publish the application to the cluster.
    4. Selezionare la scheda Dettagli macchina virtuale. Specificare la password che si vuole usare per le macchine virtuali (VM) che costituiscono il cluster.Select the VM Detail tab. Specify the password you would like to use for the Virtual Machines (VM) that make up the cluster. Il nome utente e la password possono essere usati per la connessione remota alle VM.The user name and password can be used to remotely connect to the VMs. Si deve anche selezionare una dimensione di macchina virtuale ed è possibile modificare l'immagine di VM, se necessario.You must also select a VM machine size and can change the VM image if needed.
    5. Nella scheda Avanzate elencare la porta dell'applicazione per aprirla nel servizio di bilanciamento del carico quando si distribuisce il cluster.In the Advanced tab, list the application port to open in the load balancer when the cluster deploys. In Esplora soluzioni aprire FabrikamFiber.Web->PackageRoot->ServiceManifest.xml.In Solution Explorer, open FabrikamFiber.Web->PackageRoot->ServiceManifest.xml. La porta per il front-end Web è elencata in Endpoint.The port for the web front-end is listed in Endpoint. È anche possibile aggiungere una chiave di Application Insights esistente a cui indirizzare i file di log dell'applicazione.You can also add an existing Application Insights key to be used to route application log files to.
    6. Al termine della modifica delle impostazioni, selezionare il pulsante Crea.When you are done modifying settings, select the Create button.
  5. La creazione richiede alcuni minuti. Il completamento dell'operazione verrà indicato nella finestra di output.Creation takes several minutes to complete; the output window will indicate when the cluster is fully created.

Consentire all'applicazione in esecuzione in Azure di accedere al database SQLAllow your application running in Azure to access the SQL DB

In precedenza è stata creata una regola del firewall SQL per concedere l'accesso all'applicazione in esecuzione in locale.Previously, you created a SQL firewall rule to give access to your application running locally. A questo punto è necessario consentire all'applicazione in esecuzione in Azure di accedere al database SQL.Next, you need to enable the application running in Azure to access the SQL DB. Creare un endpoint di servizio di rete virtuale per il cluster di Service Fabric e quindi creare una regola per consentire a tale endpoint di accedere al database SQL.Create a virtual network service endpoint for the Service Fabric cluster and then create a rule to allow that endpoint to access the SQL DB.

# Create a virtual network service endpoint
$clusterresourcegroup = "fabrikamfiber.callcenterapplication_RG"
$resource = Get-AzureRmResource -ResourceGroupName $clusterresourcegroup -ResourceType Microsoft.Network/virtualNetworks | Select-Object -first 1
$vnetName = $resource.Name

Write-Host 'Virtual network name: ' $vnetName 

# Get the virtual network by name.
$vnet = Get-AzureRmVirtualNetwork `
  -ResourceGroupName $clusterresourcegroup `
  -Name              $vnetName

Write-Host "Get the subnet in the virtual network:"

# Get the subnet, assume the first subnet contains the Service Fabric cluster.
$subnet = Get-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $vnet | Select-Object -first 1

$subnetName = $subnet.Name
$subnetID = $subnet.Id
$addressPrefix = $subnet.AddressPrefix

Write-Host "Subnet name: " $subnetName " Address prefix: " $addressPrefix " ID: " $subnetID

# Assign a Virtual Service endpoint 'Microsoft.Sql' to the subnet.
$vnet = Set-AzureRmVirtualNetworkSubnetConfig `
  -Name            $subnetName `
  -AddressPrefix   $addressPrefix `
  -VirtualNetwork  $vnet `
  -ServiceEndpoint Microsoft.Sql | Set-AzureRmVirtualNetwork

$vnet.Subnets[0].ServiceEndpoints;  # Display the first endpoint.

# Add a SQL DB firewall rule for the virtual network service endpoint
$subnet = Get-AzureRmVirtualNetworkSubnetConfig `
  -Name           $subnetName `
  -VirtualNetwork $vnet;

$VNetRuleName="ServiceFabricClusterVNetRule"
$vnetRuleObject1 = New-AzureRmSqlServerVirtualNetworkRule `
  -ResourceGroupName      $dbresourcegroupname `
  -ServerName             $servername `
  -VirtualNetworkRuleName $VNetRuleName `
  -VirtualNetworkSubnetId $subnetID;

Distribuzione dell'applicazione in AzureDeploy the application to Azure

Ora che l'applicazione è pronta, è possibile distribuirla nel cluster in Azure direttamente da Visual Studio.Now that the application is ready, you can deploy it to the cluster in Azure directly from Visual Studio. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto di applicazione FabrikamFiber.CallCenterApplication e scegliere Pubblica.In Solution Explorer, right-click the FabrikamFiber.CallCenterApplication application project and select Publish. In Endpoint connessione selezionare l'endpoint del cluster creato in precedenza.In Connection Endpoint, select the endpoint of the cluster that you created previously. In Registro contenitori di Azure selezionare il registro contenitori creato in precedenza.In Azure Container Registry, select the container registry that you created previously. Fare clic su Pubblica per distribuire l'applicazione nel cluster in Azure.Click Publish to deploy the application to the cluster in Azure.

Pubblicare l'applicazione

Seguire lo stato della distribuzione nella finestra di output.Follow the deployment progress in the output window. Al termine della distribuzione dell'applicazione, aprire un browser e digitare l'indirizzo del cluster e la porta dell'applicazione.When the application is deployed, open a browser and type in the cluster address and application port. Ad esempio, http://http://fabrikamfibercallcenter.southcentralus.cloudapp.azure.com:8659/.For example, http://http://fabrikamfibercallcenter.southcentralus.cloudapp.azure.com:8659/.

Esempio Web Fabrikam

Pulire le risorseClean up resources

Se l'operazione è terminata, assicurarsi di rimuovere tutte le risorse create.If you're done, be sure to remove all the resources you created. Il modo più semplice consiste nel rimuovere i gruppi di risorse che contengono il cluster di Service Fabric, il database SQL di Azure e Registro contenitori di Azure.The simplest way to is to remove the resources groups that contain the Service Fabric cluster, Azure SQL DB, and Azure Container Registry.

$dbresourcegroupname = "fabrikam-fiber-db-group"
$acrresourcegroupname = "fabrikam-acr-group"
$clusterresourcegroupname="fabrikamcallcentergroup"

# Remove the Azure SQL DB
Remove-AzureRmResourceGroup -Name $dbresourcegroupname

# Remove the container registry
Remove-AzureRmResourceGroup -Name $acrresourcegroupname

# Remove the Service Fabric cluster
Remove-AzureRmResourceGroup -Name $clusterresourcegroupname

Passaggi successiviNext steps

Questa esercitazione illustra come:In this tutorial, you learned how to:

  • Aggiungere un'applicazione esistente in un contenitore con Visual StudioContainerize an existing application using Visual Studio
  • Creare un database SQL di AzureCreate an Azure SQL database
  • Creare un registro contenitori di AzureCreate an Azure container registry
  • Distribuire un'applicazione di Service Fabric in AzureDeploy a Service Fabric application to Azure

La parte successiva dell'esercitazione comprende informazioni su come configurare il monitoraggio del contenitore.In the next part of the tutorial, learn how to set up monitoring for your container.