다음을 통해 공유


자습서: Azure Service Fabric에 Windows 컨테이너의 .NET 애플리케이션 배포

이 자습서에서는 기존 ASP.NET 애플리케이션을 컨테이너화하고 Service Fabric 애플리케이션으로 패키징하는 방법을 보여 줍니다. Service Fabric 개발 클러스터에서 컨테이너를 로컬로 실행한 다음 Azure에 애플리케이션을 배포합니다. 애플리케이션은 Azure SQL Database에서 데이터를 유지합니다.

이 튜토리얼에서는 다음을 배우게 됩니다:

  • Visual Studio를 사용하여 기존 애플리케이션 컨테이너화
  • Azure SQL Database에서 데이터베이스 만들기
  • Azure Container Registry 만들기
  • Azure에 Service Fabric 애플리케이션 배포

비고

Azure Az PowerShell 모듈을 사용하여 Azure와 상호 작용하는 것이 좋습니다. 시작하려면 Azure PowerShell 설치를 참조하세요. Az PowerShell 모듈로 마이그레이션하는 방법에 대한 자세한 내용은 Azure PowerShell을 AzureRM에서 Azure로 마이그레이션을 참조하세요.

필수 조건

  1. Azure 구독이 없는 경우 무료 계정을 만드십시오.
  2. Windows 기능 Hyper-V컨테이너를 사용하도록 설정합니다.
  3. Windows 10에서 컨테이너를 실행할 수 있도록 Windows 용 Docker Desktop 을 설치합니다.
  4. Service Fabric 런타임 버전 6.2 이상Service Fabric SDK 버전 3.1 이상을 설치합니다.
  5. Visual Studio를 설치하고 Azure 개발ASP.NET 및 웹 개발 워크로드를 사용하도록 설정합니다.
  6. Azure PowerShell 설치

Fabrikam Fiber CallCenter 다운로드 및 실행

  1. GitHub에서 Fabrikam Fiber CallCenter 샘플 애플리케이션을 다운로드합니다.

  2. Fabrikam Fiber CallCenter 애플리케이션이 오류 없이 빌드되고 실행되는지 확인합니다. 관리자 권한으로 Visual Studio를 시작하고 VS2015\FabrikamFiber.CallCenter.sln 파일을 엽니다. F5 키를 눌러 애플리케이션을 실행하고 디버그합니다.

    로컬 호스트에서 실행되는 Fabrikam Fiber CallCenter 애플리케이션 홈페이지의 스크린샷. 페이지에는 지원 호출 목록이 있는 대시보드가 표시됩니다.

Azure SQL DB 만들기

프로덕션 환경에서 Fabrikam Fiber CallCenter 애플리케이션을 실행하는 경우 데이터는 데이터베이스에 유지되어야 합니다. 현재 컨테이너의 영구 데이터를 보장할 수 있는 방법은 없으므로 컨테이너의 SQL Server에 프로덕션 데이터를 저장할 수 없습니다.

Azure SQL Database를 사용하는 것이 좋습니다. Azure에서 관리되는 SQL Server DB를 설정하고 실행하려면 다음 스크립트를 실행합니다. 필요에 따라 스크립트 변수를 수정합니다. clientIP 는 개발 컴퓨터의 IP 주소입니다. 스크립트에서 출력한 서버의 이름을 기록해 둡다.

$subscriptionID="<subscription ID>"

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

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

# The 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 = "<client IP>"

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

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

# Create the SQL server.
New-AzSqlServer -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-AzSqlServerFirewallRule -ResourceGroupName $dbresourcegroupname `
    -ServerName $servername `
    -FirewallRuleName "AllowClient" -StartIpAddress $clientIP -EndIpAddress $clientIP

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

Write-Host "Server name is $servername"

팁 (조언)

회사 방화벽 뒤에 있는 경우 개발 컴퓨터의 IP 주소가 인터넷에 노출되는 IP 주소가 아닐 수 있습니다. 데이터베이스에 방화벽 규칙에 대한 올바른 IP 주소가 있는지 확인하려면 Azure Portal 로 이동하여 SQL Database 섹션에서 데이터베이스를 찾습니다. 해당 이름을 클릭한 다음 개요 섹션에서 "서버 방화벽 설정"을 클릭합니다. "클라이언트 IP 주소"는 개발 머신의 IP 주소입니다. "AllowClient" 규칙의 IP 주소와 일치하는지 확인합니다.

웹 구성 업데이트

FabrikamFiber.Web 프로젝트로 돌아가서 web.config 파일의 연결 문자열을 업데이트하여 컨테이너의 SQL Server를 가리킵니다. 연결 문자열의 서버 부분을 이전 스크립트에서 만든 서버 이름으로 업데이트합니다. "fab-fiber-751718376.database.windows.net"와 같아야 합니다. 다음 XML에서는 connectionString 특성만 업데이트해야 합니다. providerNamename 특성은 변경할 필요가 없습니다.

<add name="FabrikamFiber-Express" connectionString="Server=<server name>,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=<server name>,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" />
  

비고

호스트에서 연결할 수 있는 한 로컬 디버깅에 선호하는 SQL Server를 사용할 수 있습니다. 그러나 localdb 는 통신을 지원하지 container -> host 않습니다. 웹 애플리케이션의 릴리스 빌드를 빌드할 때 다른 SQL 데이터베이스를 사용하려면 web.release.config 파일에 다른 연결 문자열을 추가합니다.

애플리케이션 컨테이너화

  1. FabrikamFiber.Web 프로젝트 >컨테이너 오케스트레이터 지원>를 마우스 오른쪽 단추로 클릭합니다. 컨테이너 오케스트레이터로 Service Fabric 을 선택하고 확인을 클릭합니다.

  2. 메시지가 표시되면 [예 ]를 클릭하여 Docker를 Windows 컨테이너로 전환합니다.

    솔루션에서 새 프로젝트 Service Fabric 애플리케이션 프로젝트 FabrikamFiber.CallCenterApplication 이 만들어집니다. Dockerfile이 기존 FabrikamFiber.Web 프로젝트에 추가됩니다. PackageRoot 디렉터리도 새 FabrikamFiber.Web 서비스에 대한 서비스 매니페스트 및 설정을 포함하는 FabrikamFiber.Web 프로젝트에 추가됩니다.

    이제 컨테이너를 빌드하고 Service Fabric 애플리케이션에 패키징할 준비가 되었습니다. 머신에 컨테이너 이미지를 빌드한 후에는 컨테이너 레지스트리에 푸시하고 실행할 호스트로 끌어올 수 있습니다.

컨테이너화된 애플리케이션을 로컬로 실행

F5 키를 눌러 로컬 Service Fabric 개발 클러스터의 컨테이너에서 애플리케이션을 실행하고 디버그합니다. Visual Studio 프로젝트 디렉터리에 'ServiceFabricAllowedUsers' 그룹 읽기 및 실행 권한을 부여하라는 메시지 상자가 표시되면 예를 클릭합니다.

F5 실행에서 다음과 같은 예외를 throw하는 경우 올바른 IP가 Azure 데이터베이스 방화벽에 추가되지 않았습니다.

System.Data.SqlClient.SqlException
HResult=0x80131904
Message=Cannot open server 'fab-fiber-751718376' requested by the login. Client with IP address '123.456.789.012' is not allowed to access the server.  To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range.  It may take up to five minutes for this change to take effect.
Source=.Net SqlClient Data Provider
StackTrace:
<Cannot evaluate the exception stack trace>

Azure 데이터베이스 방화벽에 적절한 IP를 추가하려면 다음 명령을 실행합니다.

# The IP address of your development computer that accesses the SQL DB.
$clientIPNew = "<client IP from the Error Message>"

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

컨테이너 레지스트리 만들기

이제 애플리케이션이 로컬로 실행되었으므로 Azure에 배포할 준비를 시작합니다. 컨테이너 이미지는 컨테이너 레지스트리에 저장해야 합니다. 다음 스크립트를 사용하여 Azure 컨테이너 레지스트리 를 만듭니다. 컨테이너 레지스트리 이름은 다른 Azure 구독에서 볼 수 있으므로 고유해야 합니다. Azure에 애플리케이션을 배포하기 전에 컨테이너 이미지를 이 레지스트리에 푸시합니다. 애플리케이션이 Azure의 클러스터에 배포되면 컨테이너 이미지가 이 레지스트리에서 가져옵니다.

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

New-AzResourceGroup -Name $acrresourcegroupname -Location $location

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

Azure에서 Service Fabric 클러스터 만들기

Service Fabric 애플리케이션은 네트워크에 연결된 가상 또는 물리적 컴퓨터 집합인 클러스터에서 실행됩니다. Azure에 애플리케이션을 배포하기 전에 Azure에서 Service Fabric 클러스터를 만듭니다.

당신은 할 수 있어요:

  • Visual Studio에서 테스트 클러스터를 만듭니다. 이 옵션을 사용하면 기본 구성을 사용하여 Visual Studio에서 직접 보안 클러스터를 만들 수 있습니다.
  • 템플릿에서 보안 클러스터 만들기

이 자습서에서는 테스트 시나리오에 적합한 Visual Studio에서 클러스터를 만듭니다. 다른 방법으로 클러스터를 만들거나 기존 클러스터를 사용하는 경우 연결 엔드포인트를 복사하여 붙여넣거나 구독에서 선택할 수 있습니다.

시작하기 전에 솔루션 탐색기에서 FabrikamFiber.Web -> PackageRoot -> ServiceManifest.xml 엽니다. 엔드포인트에 나열된 웹 프런트 엔드의 포트를 기록해 둡다.

클러스터를 만들 때:

  1. 솔루션 탐색기에서 FabrikamFiber.CallCenterApplication 애플리케이션 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.

  2. 구독에 액세스할 수 있도록 Azure 계정을 사용하여 로그인합니다.

  3. 연결 엔드포인트에 대한 드롭다운 아래에서 새 클러스터 만들기... 옵션을 선택합니다.

  4. 클러스터 만들기 대화 상자에서 다음 설정을 수정합니다.

    a. 클러스터 이름 필드에서 클러스터의 이름과 사용하려는 구독 및 위치를 지정합니다. 클러스터 리소스 그룹의 이름을 기록해 둡니다.

    b. 선택 사항: 노드 수를 수정할 수 있습니다. 기본적으로 Service Fabric 시나리오를 테스트하는 데 필요한 최소 3개의 노드가 있습니다.

    c. 인증서 탭을 선택합니다. 이 탭에서 클러스터의 인증서를 보호하는 데 사용할 암호를 입력합니다. 이 인증서는 클러스터를 안전하게 만드는 데 도움이 됩니다. 인증서를 저장할 경로를 수정할 수도 있습니다. 애플리케이션을 클러스터에 게시하는 데 필요한 단계이므로 Visual Studio에서 인증서를 가져올 수도 있습니다.

    비고

    이 인증서를 가져오는 폴더 경로를 기록해 둡다. 클러스터를 만든 후 다음 단계는 이 인증서를 가져오는 것입니다.

    d. VM 세부 정보 탭을 선택합니다. 클러스터를 구성하는 VM(Virtual Machines)에 사용할 암호를 지정합니다. 사용자 이름과 암호를 사용하여 VM에 원격으로 연결할 수 있습니다. 또한 VM 컴퓨터 크기를 선택해야 하며 필요한 경우 VM 이미지를 변경할 수 있습니다.

    중요합니다

    실행 중인 컨테이너를 지원하는 SKU를 선택합니다. 클러스터 노드의 Windows Server OS는 컨테이너의 Windows Server OS와 호환되어야 합니다. 자세한 내용은 Windows Server 컨테이너 OS 및 호스트 OS 호환성을 참조하세요. 기본적으로 이 자습서에서는 Windows Server 2016 LTSC를 기반으로 Docker 이미지를 만듭니다. 이 이미지를 기반으로 하는 컨테이너는 컨테이너가 있는 Windows Server 2016 Datacenter로 만든 클러스터에서 실행됩니다. 그러나 클러스터를 만들거나 다른 버전의 Windows Server를 기반으로 기존 클러스터를 사용하는 경우 컨테이너의 기반이 되는 OS 이미지를 변경해야 합니다. FabrikamFiber.Web 프로젝트에서 dockerfile을 열고, 이전 버전의 Windows Server를 기반으로 하는 기존 FROM 문을 주석으로 처리하고, FROM 원하는 버전의 태그에 따라 문을 추가 합니다. Windows Server Core 릴리스, 지원 타임라인 및 버전 관리에 대한 자세한 내용은 Windows Server Core 릴리스 정보를 참조하세요.

    e. 고급 탭에서 클러스터가 배포될 때 부하 분산 장치에서 열어야 할 애플리케이션 포트를 나열하십시오. 클러스터 만들기를 시작하기 전에 적어 두는 포트입니다. 애플리케이션 로그 파일을 라우팅하는 데 사용할 기존 Application Insights 키를 추가할 수도 있습니다.

    f. 설정 수정이 완료되면 만들기 단추를 선택합니다.

  5. 만들기를 완료하는 데 몇 분 정도 걸립니다. 출력 창은 클러스터가 완전히 만들어진 시기를 나타냅니다.

가져온 인증서 설치

클러스터 만들기 단계의 일부로 가져온 인증서를 현재 사용자 저장소 위치에 설치하고 제공한 프라이빗 키 암호를 제공합니다.

제어판에서 사용자 인증서 관리를 열고 인증서가 인증서 - 현재 사용자 ->개인 ->인증서 아래에 설치되어 있는지 확인하여 설치를 확인할 수 있습니다. 인증서는 [클러스터 이름]와 같아야 합니다. [클러스터 위치].cloudapp.azure.com(예: fabrikamfibercallcenter.southcentralus.cloudapp.azure.com).

Azure에서 실행 중인 애플리케이션이 SQL Database에 액세스하도록 허용

이전에는 로컬로 실행되는 애플리케이션에 대한 액세스 권한을 부여하는 SQL 방화벽 규칙을 만들었습니다. 다음으로 Azure에서 실행되는 애플리케이션이 SQL DB에 액세스할 수 있도록 설정해야 합니다. Service Fabric 클러스터에 대한 가상 네트워크 서비스 엔드포인트 를 만든 다음 해당 엔드포인트가 SQL DB에 액세스할 수 있도록 하는 규칙을 만듭니다. 클러스터를 만들 때 적어 두는 클러스터 리소스 그룹 변수를 지정해야 합니다.

# Create a virtual network service endpoint
$clusterresourcegroup = "<cluster resource group>"
$resource = Get-AzResource -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-AzVirtualNetwork `
  -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-AzVirtualNetworkSubnetConfig -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-AzVirtualNetworkSubnetConfig `
  -Name            $subnetName `
  -AddressPrefix   $addressPrefix `
  -VirtualNetwork  $vnet `
  -ServiceEndpoint Microsoft.Sql | Set-AzVirtualNetwork

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

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

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

애플리케이션을 Azure에 배포합니다.

이제 애플리케이션이 준비되었으므로 Visual Studio에서 직접 Azure의 클러스터에 배포할 수 있습니다. 솔루션 탐색기에서 FabrikamFiber.CallCenterApplication 애플리케이션 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다. 연결 엔드포인트에서 이전에 만든 클러스터의 엔드포인트를 선택합니다. Azure Container Registry에서 이전에 만든 컨테이너 레지스트리를 선택합니다. 게시를 클릭하여 Azure의 클러스터에 애플리케이션을 배포합니다.

애플리케이션 게시

출력 창에서 배포 진행률을 따릅니다. 애플리케이션이 배포되면 브라우저를 열고 클러스터 주소 및 애플리케이션 포트를 입력합니다. 예: http://fabrikamfibercallcenter.southcentralus.cloudapp.azure.com:8659/.

azure.com 실행되는 Fabrikam Fiber CallCenter 애플리케이션 홈페이지의 스크린샷 페이지에는 지원 호출 목록이 있는 대시보드가 표시됩니다.

페이지를 로드하지 못하거나 인증서를 묻는 메시지가 표시되지 않는 경우 탐색기 경로를 https://fabrikamfibercallcenter.southcentralus.cloudapp.azure.com:19080/Explorer 열고 새로 설치된 인증서를 선택합니다.

Service Fabric 클러스터를 사용하여 CI/CD(연속 통합 및 배포) 설정

Azure DevOps를 사용하여 Service Fabric 클러스터에 CI/CD 애플리케이션 배포를 구성하는 방법을 알아보려면 자습서: SERVICE Fabric 클러스터에 CI/CD를 사용하여 애플리케이션 배포를 참조하세요. 자습서에 설명된 프로세스는 이(FabrikamFiber) 프로젝트에 대해 동일합니다. 투표 샘플 다운로드를 건너뛰고 FabrikamFiber를 Voting 대신 리포지토리 이름으로 대체하면 됩니다.

자원을 정리하세요

완료되면 만든 모든 리소스를 제거해야 합니다. 가장 간단한 방법은 Service Fabric 클러스터, Azure SQL DB 및 Azure Container Registry를 포함하는 리소스 그룹을 제거하는 것입니다.

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

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

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

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

다음 단계

이 자습서에서는 다음 방법을 알아보았습니다.

  • Visual Studio를 사용하여 기존 애플리케이션 컨테이너화
  • Azure SQL Database에서 데이터베이스 만들기
  • Azure Container Registry 만들기
  • Azure에 Service Fabric 애플리케이션 배포

자습서의 다음 부분에서는 CI/CD를 사용하여 컨테이너 애플리케이션을 Service Fabric 클러스터에 배포하는 방법을 알아봅니다.