Azure에 Worker Service 배포

이 문서에서는 Azure에 .NET Worker Service를 배포하는 방법을 알아봅니다. ACR(Azure Container Registry)ACI(Azure Container Instance)로 실행되는 작업자는 클라우드에서 마이크로서비스의 역할을 할 수 있습니다. 장기 실행 서비스에는 여러 가지 사용 사례가 있으며, 이 때문에 Worker Service가 존재합니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 작업자 서비스를 만듭니다.
  • 컨테이너 레지스트리 리소스를 만듭니다.
  • 컨테이너 레지스트리에 이미지를 푸시합니다.
  • 컨테이너 인스턴스를 배포합니다.
  • 작업 서비스 기능을 확인합니다.

모든 ‘.NET의 작업자’ 예제 소스 코드는 샘플 브라우저에서 다운로드할 수 있습니다. 자세한 내용은 코드 샘플 찾아보기: .NET의 작업자를 참조하세요.

필수 조건

새 프로젝트 만들기

Visual Studio를 사용하여 새 Worker Service 프로젝트를 만들려면 파일>새로 만들기>Project...를 선택합니다. 새 프로젝트 만들기 대화 상자에서 ‘Worker Service’를 검색하고 Worker Service 템플릿을 선택합니다. 원하는 프로젝트 이름을 입력하고 적절한 위치를 선택한 후 다음을 선택합니다. 추가 정보 페이지에서 대상 프레임워크.NET 5.0을 선택하고 Docker 사용 옵션을 선택하여 Docker 지원을 활성화합니다. 원하는 Docker OS를 선택합니다.

Visual Studio Code를 사용하여 Worker Service 프로젝트를 만들려면 통합 터미널에서 .NET CLI 명령을 실행하면 됩니다. 자세한 내용은 Visual Studio Code: 통합 터미널을 참조하세요.

통합 터미널을 열고 dotnet new 명령을 실행하여 <Project.Name>을 원하는 프로젝트 이름으로 바꿉니다.

dotnet new worker --name <Project.Name>

.NET CLI 새 작업자 서비스 프로젝트 명령에 대한 자세한 내용은 dotnet 새 작업자를 참조하세요.

.NET CLI를 사용하여 새 Worker Service 프로젝트를 만들려면 작업 디렉터리에서 즐겨찾는 터미널을 엽니다. dotnet new 명령을 실행하고 <Project.Name>을 원하는 프로젝트 이름으로 바꿉니다.

dotnet new worker --name <Project.Name>

.NET CLI 새 작업자 서비스 프로젝트 명령에 대한 자세한 내용은 dotnet 새 작업자를 참조하세요.

종속 패키지를 복원하고 오류 없이 컴파일되도록 애플리케이션을 빌드합니다.

Visual Studio에서 애플리케이션을 빌드하려면 F6 키를 누르거나 빌드>솔루션 빌드 메뉴 옵션을 선택합니다.

Visual Studio Code에서 애플리케이션을 빌드하려면 통합 터미널 창을 열고 작업 디렉터리에서 dotnet build 명령을 실행합니다.

dotnet build

.NET CLI 빌드 명령에 대한 자세한 내용은 dotnet build를 참조하세요.

.NET CLI에서 애플리케이션을 빌드하려면 작업 디렉터리에서 dotnet build 명령을 실행합니다.

dotnet build <path/to/project.csproj>

빌드할 프로젝트 파일의 경로인 <path/to/project.csproj> 값을 지정합니다. .NET CLI 빌드 명령에 대한 자세한 내용은 dotnet build를 참조하세요.

Docker 지원 추가

새 작업자 프로젝트를 만들 때 Docker 사용 확인란을 올바르게 선택한 경우 Docker 이미지 빌드 단계로 건너뜁니다.

이 옵션을 선택하지 않은 경우 지금이라도 추가할 수 있습니다. Visual Studio에서 솔루션 탐색기의 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 추가>Docker 지원을 선택합니다. 대상 OS를 선택하라는 메시지가 표시되면 기본 OS를 선택하여 확인을 선택합니다.

Docker File Options

Visual Studio Code에서는 Docker 확장Azure 계정 확장이 설치되어 있어야 합니다. 명령 팔레트를 열고 Docker: 작업 영역에 Docker 파일 추가 옵션을 선택합니다. 애플리케이션 플랫폼 선택 메시지가 표시되면 .NET: Core Console을 선택합니다. 프로젝트 선택 메시지가 표시되면 생성한 Worker Service 프로젝트를 선택합니다. 운영 체제 선택 메시지가 표시되면 나열된 첫 번째 OS를 선택합니다. 선택적 Docker Compose 파일 포함 여부를 묻는 메시지가 표시되면 아니요를 선택합니다.

Docker 지원에는 Dockerfile이 필요합니다. 이 파일은 .NET Worker Service를 Docker 이미지로 빌드하기 위한 포괄적인 지침 집합입니다. Dockerfile은 파일 확장명이 없는 파일입니다. 다음 코드는 Dockerfile의 예이며 프로젝트 파일의 루트 디렉터리에 있어야 합니다.

CLI를 사용하면 Dockerfile이 생성되지 않습니다. 해당 내용을 프로젝트의 루트 디렉터리에 있는 Dockerfile이라는 새 파일에 복사합니다.

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
WORKDIR /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-dotnet-configure-containers
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["App.CloudService.csproj", "./"]
RUN dotnet restore "App.CloudService.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "App.CloudService.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "App.CloudService.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "App.CloudService.dll"]

참고 항목

Dockerfile에서 *App.CloudService를 참조하는 여러 줄을 업데이트해야 합니다. 즉, 프로젝트 이름으로 바꿉니다.

공식 .NET 이미지에 대한 자세한 내용은 Docker Hub: .NET 런타임Docker Hub: .NET SDK를 참조하세요.

Docker 이미지 빌드

Docker 이미지를 빌드하려면 Docker 엔진이 실행 중 이어야 합니다.

Important

Docker Desktop 및 Visual Studio를 사용하는 경우 볼륨 공유와 관련된 오류를 방지하려면 볼륨 공유가 사용하도록 설정되어 있는지 확인합니다.

  1. Docker Desktop의 설정 화면에서 공유 드라이브를 선택합니다.
  2. 프로젝트 파일이 포함된 드라이브를 선택합니다.

자세한 내용은 Docker 관련 Visual Studio 개발 문제 해결을 참조하세요.

솔루션 탐색기에서 dockerfile을 마우스 오른쪽 단추로 클릭하고 Docker 이미지 빌드를 선택합니다. 출력 창이 표시되어 docker build 명령 진행률을 보고합니다.

탐색기에서 dockerfile을 마우스 오른쪽 단추로 클릭하고 이미지 빌드를 선택합니다. 이미지 태그 형식을 지정하라는 메시지가 표시되면 appcloudservice:latest를 입력합니다. Docker 작업 출력 터미널이 표시되어 Docker 빌드 명령 진행률을 보고합니다.

참고 항목

이미지에 태그를 지정하라는 메시지가 표시되지 않으면 Visual Studio Code가 기존 tasks.json에 의존하고 있을 수 있습니다. 사용된 태그가 적합하지 않은 경우 tasks 배열에서 docker-build 구성 항목의 dockerBuild/tag 값을 업데이트하여 태그를 변경할 수 있습니다. 다음 예제 구성 섹션을 고려합니다.

{
  "type": "docker-build",
  "label": "docker-build: release",
  "dependsOn": [
    "build"
  ],
  "dockerBuild": {
    "tag": "appcloudservice:latest",
    "dockerfile": "${workspaceFolder}/cloud-service/Dockerfile",
    "context": "${workspaceFolder}",
    "pull": true
  },
  "netCore": {
    "appProject": "${workspaceFolder}/cloud-service/App.CloudService.csproj"
  }
}

Dockerfile의 루트 디렉터리에서 터미널 창을 열고 다음 docker 명령을 실행합니다.

docker build -t appcloudservice:latest -f Dockerfile .

docker build 명령이 실행되면 Dockerfile의 각 줄을 명령 단계로 처리합니다. 이 명령은 이미지를 빌드하고 해당 이미지를 가리키는 appcloudservice라는 로컬 리포지토리를 만듭니다.

생성된 Dockerfile은 개발 환경에 따라 다릅니다. 예를 들어 Visual Studio에서 Docker 지원을 추가하는 경우 Dockerfile 단계가 다르기 때문에 Visual Studio Code에서 Docker 이미지 빌드를 시도하면 문제가 발생할 수 있습니다. 단일 개발 환경을 선택하고 이 자습서에서 사용하는 것이 가장 좋습니다.

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

ACR(Azure Container Registry) 리소스를 사용하면 프라이빗 레지스트리에서 컨테이너 이미지 및 아티팩트를 빌드, 저장 및 관리할 수 있습니다. 컨테이너 레지스트리를 만들려면 Azure Portal에 새 리소스를 만들어야 합니다.

  1. 구독과 해당 리소스 그룹을 선택합니다(또는 새 그룹을 만듭니다).
  2. 레지스트리 이름을 입력합니다.
  3. 위치를 선택합니다.
  4. 적절한 SKU를 선택합니다(예: Basic).
  5. 검토 + 만들기를 선택합니다.
  6. 유효성 검사 통과가 나타나면 만들기를 선택합니다.

Important

컨테이너 인스턴스를 만들 때 이 컨테이너 레지스트리를 사용하려면 관리 사용자를 사용하도록 설정해야 합니다. 액세스 키를 선택하고 관리 사용자를 사용하도록 설정합니다.

ACR(Azure Container Registry) 리소스를 사용하면 프라이빗 레지스트리에서 컨테이너 이미지 및 아티팩트를 빌드, 저장 및 관리할 수 있습니다. Dockerfile의 루트 디렉터리에서 터미널 창을 열고 다음 Azure CLI 명령을 실행합니다.

Important

Azure CLI의 Azure 리소스와 상호 작용하려면 터미널 세션에 대해 인증을 받아야 합니다. 인증하려면 az login 명령을 사용합니다.

az login

로그인한 후 az account set 명령을 사용하여 둘 이상의 기본 구독이 있거나 기본 구독 집합이 없는 경우 구독을 지정합니다.

az account set --subscription <subscription name or id>

Azure CLI에 로그인하면 세션이 리소스와 적절히 상호 작용할 수 있습니다.

작업자 서비스를 연결하려는 리소스 그룹이 아직 없는 경우 az group create 명령을 사용하여 만듭니다.

az group create -n <resource group> -l <location>

<resource group> 이름 및 <location>을 제공합니다. 컨테이너 레지스트리를 만들려면 az acr create 명령을 호출합니다.

az acr create -n <registry name> -g <resource group> --sku <sku> --admin-enabled true

자리 표시자를 적절한 자체 값으로 바꿉니다.

  • <registry name>: 레지스트리 키의 이름입니다.
  • <resource group>: 사용한 리소스 그룹 이름입니다.
  • <sku>: 허용되는 값, 기본, 클래식, 프리미엄 또는 표준입니다.

이전 명령:

  • 지정된 리소스 그룹에 레지스트리 이름이 지정된 Azure Container Registry 만듭니다.
  • 관리 사용자 사용 - Azure Container Instances에 필요합니다.

자세한 내용은 빠른 시작: Azure 컨테이너 레지스트리 만들기를 참조하세요.

컨테이너 레지스트리에 이미지 푸시

.NET Docker 이미지를 빌드하고 컨테이너 레지스트리 리소스가 만들어졌으므로 이제 컨테이너 레지스트리에 이미지를 푸시할 수 있습니다.

솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다. 게시 대화 상자가 표시됩니다. 대상에서 Azure를 선택하고 다음을 선택합니다.

Visual Studio: Publish dialog - select Azure

특정 대상에서 Azure Container Registry를 선택한 후 다음을 선택합니다.

Visual Studio: Publish dialog - select container registry

다음으로 Container Registry에서 ACR 리소스를 만들 때 사용한 구독 이름을 선택합니다. 컨테이너 레지스트리 선택 영역에서, 만든 컨테이너 레지스트리를 선택하고 마침을 선택합니다.

Visual Studio: Publish dialog - select container registry details

이렇게 하면 이미지를 컨테이너 레지스트리에 게시하는 데 사용할 수 있는 게시 프로필이 만들어집니다. 게시 단추를 선택하여 이미지를 컨테이너 레지스트리로 푸시합니다. 출력 창에서 게시 진행률 를 보고합니다. 성공적으로 완료되면 ‘게시 성공’ 메시지가 표시됩니다.

Visual Studio Code의 작업 막대에서 Docker를 선택합니다. IMAGES 트리 뷰 패널을 확장한 다음, appcloudservice 이미지 노드를 확장하고 latest 태그를 마우스 오른쪽 단추로 클릭합니다.

Visual Studio Code: Docker - push image

통합 터미널 창은 docker push 명령의 진행률을 컨테이너 레지스트리에 보고합니다.

컨테이너 레지스트리에 이미지를 푸시하려면 먼저 레지스트리에 로그인해야 합니다.

az acr login -n <registry name>

az acr login 명령은 Docker CLI를 통해 컨테이너 레지스트리에 로그인합니다. 이미지를 컨테이너 레지스트리로 푸시하려면 컨테이너 레지스트리 이름과 함께 azacr build 명령을 <registry name>으로 사용합니다.

az acr build -r <registry name> -t appcloudservice .

이전 명령:

  • 원본을 tar 파일로 압축합니다.
  • 컨테이너 레지스트리에 업로드합니다.
  • 컨테이너 레지스트리는 tar 파일의 압축을 풉니다.
  • Dockerfile에 대해 컨테이너 레지스트리 리소스에서 docker build 명령을 실행합니다.
  • 컨테이너 레지스트리에 이미지를 추가합니다.

이미지가 컨테이너 레지스트리에 성공적으로 푸시되었는지 확인하려면 Azure Portal로 이동합니다. 컨테이너 레지스트리 리소스를 열고 서비스에서 리포지토리를 선택합니다. 이미지가 표시됩니다.

컨테이너 인스턴스로 배포

Visual Studio Code의 작업 막대에서 Docker를 선택합니다. REGISTRIES 노드를 확장하고 레지스트리 연결을 선택합니다. 메시지가 표시되면 Azure를 선택하고 필요한 경우 로그인합니다.

Important

Visual Studio Code에서 컨테이너 인스턴스로 배포하는 작업은 더 이상 Mac에서 작동하지 않습니다. 자세한 내용은 GitHub: Visual Studio Code용 Docker 확장 정보를 참조하세요.

Visual Studio Code - Docker: Connect registry

REGISTRIES 노드를 확장하고 Azure, 구독 > 컨테이너 레지스트리 > 이미지를 차례로 선택한 다음, 태그를 마우스 오른쪽 단추로 클릭합니다. Azure Container Instances에 이미지 배포를 선택합니다.

Visual Studio Code - Docker: Deploy image to Azure Container Instances

컨테이너 인스턴스를 만들려면 먼저 az container create 명령을 사용하여 컨테이너 그룹을 만듭니다.

az container create -g <resource group> \
  --name <instance name> \
  --image <registry name>.azurecr.io/<image name>:latest \
  --registry-password <password>

적절한 값을 제공합니다.

  • <resource group>: 이 자습서에서 사용한 리소스 그룹의 이름입니다.
  • <instance name>: 컨테이너 인스턴스의 이름입니다.
  • <registry name>: 컨테이너 레지스트리의 이름입니다.
  • <image name>: 이미지의 이름입니다.
  • <password>: 컨테이너 레지스트리에 대한 암호입니다. 이 암호는 Azure Portal, 컨테이너 레지스트리 리소스 >액세스 키에서 얻을 수 있습니다.

컨테이너 레지스트리를 만들려면 Azure Portal에서 새 리소스도 만들어야 합니다.

  1. 이전 섹션과 동일한 구독과 해당 리소스 그룹을 선택합니다.
  2. 컨테이너 이름appcloudservice-container를 입력합니다.
  3. 이전 위치 선택 항목에 해당하는 지역을 선택합니다.
  4. 이미지 원본으로 Azure Container Registry를 선택합니다.
  5. 이전 단계에서 제공한 이름으로 레지스트리를 선택합니다.
  6. 이미지이미지 태그를 선택합니다.
  7. 검토 + 만들기를 선택합니다.
  8. 유효성 검사 통과를 가정하고 만들기를 선택합니다.

리소스가 만들어지는 데 시간이 걸릴 수 있습니다. 리소스가 만들어지면 리소스로 이동 단추를 선택합니다.

자세한 내용은 빠른 시작: Azure 컨테이너 인스턴스 만들기를 참조하세요.

서비스 기능 확인

컨테이너 인스턴스를 만든 직후 실행이 시작됩니다.

작업자 서비스가 제대로 작동하는지 확인하려면 Azure Portal의 컨테이너 인스턴스 리소스로 이동하여 컨테이너 옵션을 선택합니다.

Azure portal: Container instance running

컨테이너와 현재 상태가 표시됩니다. 이 경우 실행 중입니다. 로그를 선택하여 .NET Worker Service 출력을 확인합니다.

작업자 서비스가 제대로 작동하는지 확인하려면 실행 중인 애플리케이션에서 로그를 볼 수 있습니다. az container logs 명령을 사용합니다.

az container logs -g <resource group> --name <instance name>

적절한 값을 제공합니다.

  • <resource group>: 이 자습서에서 사용한 리소스 그룹의 이름입니다.
  • <instance name>: 컨테이너 인스턴스의 이름입니다.

.NET 작업자 서비스 출력 로그가 표시됩니다. 이는 컨테이너화된 앱을 ACI에 성공적으로 배포했다는 의미입니다.

참고 항목