Service Fabric은 Service Fabric 마이크로 서비스(Reliable Services 및 Reliable Actor 기반 서비스)의 컨테이너화를 지원합니다. 자세한 내용은 Service Fabric 컨테이너를 참조하세요.
이 문서에서는 Windows 컨테이너 내에서 서비스를 실행하기 위한 지침을 제공합니다.
비고
현재 이 기능은 Windows에서만 작동합니다. 컨테이너를 실행하려면 Docker가 설치된 Windows Server에서 클러스터를 실행해야 합니다. Mirantis 런타임 설치를 참조하세요.
Service Fabric 애플리케이션을 컨테이너화하는 단계
Visual Studio에서 Service Fabric 애플리케이션을 엽니다.
프로젝트에 클래스 SFBinaryLoader.cs 추가합니다. 이 클래스의 코드는 컨테이너 내에서 실행할 때 애플리케이션 내에서 Service Fabric 런타임 이진 파일을 올바르게 로드하는 도우미입니다.
컨테이너화하려는 각 코드 패키지에 대해 프로그램 진입점에서 로더를 초기화합니다. 새 Main 함수를 Program.cs 추가하고 아래 예제와 같이 이전 Main을 RealMain으로 바꿉니다. SFBinaryLoader가 초기화될 때까지 Service Fabric 종속성 로드를 지연하는 데 필요합니다.
namespace MyApplication { internal static class Program { private static void Main() { SFBinaryLoader.Initialize(); RealMain(); } /// <summary> /// This is the entry point of the service host process. /// </summary> private static void RealMain() {
프로젝트를 빌드하고 패키지 합니다. 패키지를 빌드하고 만들려면 솔루션 탐색기에서 애플리케이션 프로젝트를 마우스 오른쪽 단추로 클릭하고 패키지 명령을 선택합니다.
컨테이너화해야 하는 모든 코드 패키지에 대해 PowerShell 스크립트 CreateDockerPackage.ps1실행합니다. 사용량은 다음과 같습니다.
전체 .NET
$codePackagePath = 'Path to the code package to containerize.' $dockerPackageOutputDirectoryPath = 'Output path for the generated docker folder.' $applicationExeName = 'Name of the Code package executable.' CreateDockerPackage.ps1 -CodePackageDirectoryPath $codePackagePath -DockerPackageOutputDirectoryPath $dockerPackageOutputDirectoryPath -ApplicationExeName $applicationExeName
.NET 코어
$codePackagePath = 'Path to the code package to containerize.' $dockerPackageOutputDirectoryPath = 'Output path for the generated docker folder.' $dotnetCoreDllName = 'Name of the Code package dotnet Core Dll.' CreateDockerPackage.ps1 -CodePackageDirectoryPath $codePackagePath -DockerPackageOutputDirectoryPath $dockerPackageOutputDirectoryPath -DotnetCoreDllName $dotnetCoreDllName
스크립트는 $dockerPackageOutputDirectoryPath Docker 아티팩트가 있는 폴더를 만듭니다. 생성된 Dockerfile을 모든 포트로
expose
수정하고, 필요에 따라 설치 스크립트를 실행하는 등의 작업을 수행합니다.컨테이너 이미지, 리포지토리 정보, 레지스트리 인증 및 포트-호스트 매핑을 추가하도록 ApplicationManifest.xml 및 ServiceManifest.xml 수정합니다. 매니페스트를 수정하려면 Azure Service Fabric 컨테이너 애플리케이션 만들기를 참조하세요. 서비스 매니페스트의 코드 패키지 정의를 해당 컨테이너 이미지로 바꿔야 합니다. EntryPoint를 ContainerHost 형식으로 변경해야 합니다.
<!-- Code package is your service executable. --> <CodePackage Name="Code" Version="1.0.0"> <EntryPoint> <!-- Follow this link for more information about deploying Windows containers to Service Fabric: https://aka.ms/sfguestcontainers --> <ContainerHost> <ImageName>myregistry.azurecr.io/samples/helloworldapp</ImageName> </ContainerHost> </EntryPoint> <!-- Pass environment variables to your container: --> </CodePackage>
복제자 및 서비스 엔드포인트에 대한 포트-호스트 매핑을 추가합니다. 이러한 두 포트는 모두 Service Fabric에서 런타임에 할당되므로 ContainerPort는 매핑에 할당된 포트를 사용하도록 0으로 설정됩니다.
<Policies> <ContainerHostPolicies CodePackageRef="Code"> <PortBinding ContainerPort="0" EndpointRef="ServiceEndpoint"/> <PortBinding ContainerPort="0" EndpointRef="ReplicatorEndpoint"/> </ContainerHostPolicies> </Policies>
컨테이너 격리 모드를 구성하려면 격리 모드 구성을 참조하세요. Windows는 컨테이너, 즉 프로세스 및 Hyper-V에 대한 두 가지 격리 모드를 지원합니다. 다음 코드 조각은 애플리케이션 매니페스트 파일에서 격리 모드를 지정하는 방법을 보여줍니다.
<Policies> <ContainerHostPolicies CodePackageRef="Code" Isolation="process"> ... </ContainerHostPolicies> </Policies>
<Policies> <ContainerHostPolicies CodePackageRef="Code" Isolation="hyperv"> ... </ContainerHostPolicies> </Policies>
(선택 사항) 서비스 간 수동 통신을 위해 인증서를 구성합니다. 기본적으로 기본 클러스터 인증서는 서로 다른 컨테이너화된 서비스 간의 수동 통신에 필요합니다. 이 인증서는 노드 자체에 있는 것처럼 컨테이너 내에 설치되지 않습니다. 이 문제를 해결하는 한 가지 방법은 컨테이너 내에 .pfx 파일을 PowerShell 스크립트와 함께 포함하여 컨테이너 내에 인증서를 설치하는 것입니다. 또 다른 방법은 인증서가 필요하지 않도록 클러스터를 구성하는 것입니다. Service Fabric 클러스터 보안 시나리오에 대해 자세히 알아봅니다.
(선택 사항) 사용자 모드를 사용하도록 Ktl 로거를 구성합니다. 상태 저장 서비스는 파일 시스템의 차이로 인해 컨테이너에서 실행할 때 오류가 발생할 수 있습니다. 이 오류는 다음과 같이 Service Fabric Explorer 내부에 표시됩니다.
System.Runtime.InteropServices.COMException (-2147024463) A device which does not exist was specified. (0x800701B1) ...
TransactionalReplicator 섹션에서 UseUserModeKtlLogger를 true로 설정하도록 클러스터 매니페스트를 업데이트하여 오류를 해결할 수 있습니다. 이 문서의 단계를 따릅니다.
{ "name": "TransactionalReplicator", "parameters": [ { "name": "UseUserModeKtlLogger", "value": "true" } ] }
이 애플리케이션을 테스트하려면 버전 5.7 이상을 실행하는 클러스터에 배포해야 합니다. 런타임 버전 6.1 이하의 경우 이 미리 보기 기능을 사용하도록 클러스터 설정을 편집하고 업데이트해야 합니다. 이 문서의 단계에 따라 다음에 표시된 설정을 추가합니다.
{ "name": "Hosting", "parameters": [ { "name": "FabricContainerAppsEnabled", "value": "true" } ] }
다음으로 편집된 애플리케이션 패키지를 이 클러스터에 배포 합니다.
비고
Service Fabric 클러스터는 의도된 단일 테넌트이며 호스팅된 애플리케이션은 신뢰할 수 있는 것으로 간주됩니다. 신뢰할 수 없는 컨테이너 애플리케이션을 호스팅하는 것을 고려하는 경우 게스트 컨테이너로 배포하고 Service Fabric 클러스터에서 신뢰할 수 없는 애플리케이션 호스팅을 참조하세요.
이제 클러스터를 실행하는 컨테이너화된 Service Fabric 애플리케이션이 있어야 합니다.
다음 단계
- Service Fabric의 컨테이너를 실행하는 방법에 대해 자세히 알아봅니다.
- Service Fabric 애플리케이션 수명 주기에 대해 자세히 알아봅니다.