다음을 통해 공유


자습서: 소스 코드에서 Azure Container Apps로 빌드 및 배포

이 문서에서는 기본 프로그래밍 언어로 컴퓨터의 소스 코드에서 Azure Container Apps에 애플리케이션을 빌드하고 배포하는 방법을 보여 줍니다.

이 자습서에서 수행하는 작업은 다음과 같습니다.

  • 간단한 웹 애플리케이션을 만듭니다.
  • 앱에 연결된 Dockerfile을 만듭니다.
  • 컴파일된 코드에서 이미지를 만들고 컨테이너 레지스트리에 푸시합니다.
  • 관리 ID를 사용하여 컨테이너 레지스트리에 안전하게 액세스합니다.
  • Azure Container Apps에 컨테이너를 배포합니다.
  • 브라우저에서 앱을 보고 배포를 확인합니다.

필수 조건

이 프로젝트를 완료하려면 다음 항목이 필요합니다.

요건 지침
Azure 계정 계정이 없으면 무료 계정을 만듭니다. 계속 진행하려면 Azure 구독에 대한 기여자 또는 소유자 권한이 필요합니다.

자세한 내용은 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.
Azure CLI Azure CLI설치하거나 최신 버전으로 업그레이드합니다. Azure 개발자 CLI(azd 명령)는 Azure CLI를 통해 사용할 수 있습니다.

선택한 언어에 따라 적절한 런타임, SDK 및 기타 종속성을 설치해야 할 수도 있습니다.

.NET SDK를 설치합니다.

로컬 애플리케이션 만들기

다음 단계에서는 Azure Container Apps에 배포할 샘플 애플리케이션을 빌드하는 데 필요한 코드 및 종속성을 보여줍니다.

참고 항목

나열된 언어가 아닌 다른 언어를 사용하려면 원하는 AI 모델에 다음 프롬프트를 입력합니다.

프롬프트를 제출하기 전에 원하는 언어로 바꿉 <LANGUAGE> 니다.

Generate the simplest possible "hello world" web server in idiomatic <LANGUAGE>.

Make sure to include any dependencies required for the application to run locally and in production. 
  1. 소스 코드를 만들고 실행합니다.

    새 C# 프로젝트를 만듭니다.

    dotnet new webapp --name MyAcaDemo --language C#
    

    MyAcaDemo 폴더로 변경합니다.

    cd MyAcaDemo
    

    코드 편집기에서 열고 Program.cs 내용을 다음 코드로 바꿉니다.

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
    
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseUrls("http://*:8080");
                });
    }
    

    이 코드를 사용하여 클래스를 Program 구현하면 웹 애플리케이션의 기반이 됩니다. 다음으로, 웹 페이지를 응답으로 반환하는 클래스를 만듭니다.

    동일한 폴더에 이름이 지정된 Startup.cs 새 파일을 만들고 다음 코드를 입력합니다.

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
        }
    
        public void Configure(IApplicationBuilder app)
        {   
            app.UseRouting();
    
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }
    }
    

    이제 웹 애플리케이션에 대한 요청이 이루어지면 "헬로 월드!" 텍스트가 반환됩니다. 로컬 컴퓨터에서 코드가 올바르게 실행되고 있는지 확인하려면 릴리스 구성에서 프로젝트를 빌드합니다.

    dotnet build -c Release
    

    다음으로, 애플리케이션을 실행하여 코드가 올바르게 구현되었는지 확인합니다.

    dotnet run --configuration Release
    

    애플리케이션이 예상대로 작동하는지 확인하면 로컬 서버를 중지하고 Dockerfile 만들기로 이동하여 컨테이너 앱에 앱을 배포할 수 있습니다.

  2. MyAcaDemo 폴더에서 이름이 지정된 Dockerfile 파일을 만들고 다음 내용을 추가합니다.

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    WORKDIR /src
    COPY . .
    RUN dotnet publish -c Release -o /app/publish
    
    FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
    WORKDIR /app
    COPY --from=build /app/publish .
    EXPOSE 8080
    ENTRYPOINT ["dotnet", "MyAcaDemo.dll"]
    

    이제 코드와 Dockerfile을 준비했으므로 Azure Container Apps에 앱을 배포할 수 있습니다.

Azure 리소스 만들기

  1. 다음 명령을 사용하여 CLI에서 Azure에 로그인합니다. 인증 프로세스를 완료하려면 모든 프롬프트를 따라야 합니다.

    az login
    
  2. Azure CLI용 Azure Container Apps 확장을 설치하거나 업데이트합니다.

    az extension add --name containerapp --upgrade
    

    참고 항목

    명령을 실행할 az containerapp 때 누락된 매개 변수에 대한 오류가 발생하는 경우 최신 버전의 Azure Container Apps 확장이 설치되어 있어야 합니다.

  3. 이제 Azure CLI 설정이 완료되었으므로 환경 변수 집합을 정의할 수 있습니다.

    다음 명령을 실행하기 전에 제공된 값을 검토합니다.

    위치는 미국 중부로 구성되지만 원하는 경우 가장 가까운 위치로 변경할 수 있습니다.

    LOCATION="CentralUS"
    RESOURCE_GROUP="my-demo-group"
    IDENTITY_NAME="my-demo-identity"
    ENVIRONMENT="my-demo-environment"
    REGISTRY_NAME="mydemoregistry$(openssl rand -hex 4)"
    CONTAINER_APP_NAME="my-demo-app"
    

    mydemoregistry$(openssl rand -hex 4) 명령은 컨테이너 레지스트리 이름으로 사용할 임의의 문자열을 생성합니다. 레지스트리 이름은 전역적으로 고유해야 하므로 이 문자열을 사용하면 명령이 성공적으로 실행되도록 할 수 있습니다.

  4. 컨테이너 앱 배포와 관련된 서비스를 구성하는 리소스 그룹을 만듭니다.

    az group create \
      --name $RESOURCE_GROUP \
      --location $LOCATION \
      --output none
    
  5. 사용자 할당 관리 ID만들고 다음 명령을 사용하여 ID를 가져옵니다.

    먼저 관리 ID를 만듭니다.

    az identity create \
        --name $IDENTITY_NAME \
        --resource-group $RESOURCE_GROUP \
        --output none
    

    이제 나중에 사용할 수 있게 ID 식별자를 변수로 설정합니다.

    IDENTITY_ID=$(az identity show \
      --name $IDENTITY_NAME \
      --resource-group $RESOURCE_GROUP \
      --query id \
      --output tsv)
    
  6. 다음 명령을 사용하여 앱을 호스트하는 Container Apps 환경을 만듭니다.

    az containerapp env create \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --mi-user-assigned $IDENTITY_ID \
        --output none
    
  7. 리소스 그룹에 ACR(Azure Container Registry) 인스턴스를 만듭니다. 레지스트리는 컨테이너 이미지를 저장합니다.

    az acr create \
      --resource-group $RESOURCE_GROUP \
      --name $REGISTRY_NAME \
      --sku Basic \
      --output none
    
  8. 다음 명령을 사용하여 컨테이너 레지스트리 인스턴스에 사용자 할당 관리 ID를 할당합니다.

    az acr identity assign \
      --identities $IDENTITY_ID \
      --name $REGISTRY_NAME \
      --resource-group $RESOURCE_GROUP \
      --output none
    

레지스트리에 이미지 빌드 및 푸시

다음 명령을 사용하여 컨테이너 이미지를 빌드하고 컨테이너 레지스트리 인스턴스에 푸시합니다.

az acr build \
    -t $REGISTRY_NAME".azurecr.io/"$CONTAINER_APP_NAME":helloworld" \
    -r $REGISTRY_NAME .

이 명령은 컨테이너 이미지에 태그 helloworld 를 적용합니다.

컨테이너 앱 만들기

다음 명령을 사용하여 컨테이너 앱을 만듭니다.

az containerapp create \
  --name $CONTAINER_APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --environment $ENVIRONMENT \
  --image $REGISTRY_NAME".azurecr.io/"$CONTAINER_APP_NAME":helloworld" \
  --target-port 8080 \
  --ingress external \
  --user-assigned $IDENTITY_ID \
  --registry-identity $IDENTITY_ID \
  --registry-server $REGISTRY_NAME.azurecr.io \
  --query properties.configuration.ingress.fqdn

이 명령은 사용자가 할당한 관리 ID에 역할을 추가 acrPull 하므로 컨테이너 레지스트리에서 이미지를 끌어올 수 있습니다.

다음 표에서는 이 명령에서 사용하는 매개 변수에 대해 설명합니다.

매개 변수 설명
name $CONTAINER_APP_NAME 컨테이너 앱의 이름입니다.
resource-group $RESOURCE_GROUP 컨테이너 앱이 배포되는 리소스 그룹입니다.
environment $ENVIRONMENT 컨테이너 앱이 실행되는 환경입니다.
image $REGISTRY_NAME".azurecr.io/"$CONTAINER_APP_NAME":helloworld" 레지스트리 이름 및 태그를 포함하여 배포할 컨테이너 이미지입니다.
target-port 8080 앱이 요청을 수신 대기하는 포트와 일치합니다.
ingress external 공용 인터넷에서 컨테이너 앱에 액세스할 수 있도록 합니다.
user-assigned $IDENTITY_ID 컨테이너 앱에 대한 사용자 할당 관리 ID입니다.
registry-identity registry-identity 컨테이너 레지스트리에 액세스하는 데 사용되는 ID입니다.
registry-server $REGISTRY_NAME.azurecr.io 컨테이너 레지스트리의 서버 주소입니다.
query properties.configuration.ingress.fqdn 출력을 앱의 FQDN(정규화된 도메인 이름)으로 필터링합니다.

이 명령이 완료되면 새 웹앱에 대한 URL을 반환합니다.

배포 확인

앱의 URL을 웹 브라우저에 복사합니다. 컨테이너 앱이 시작되면 헬로 월드!을 반환합니다.

애플리케이션에 처음 액세스하는 경우이므로 앱이 응답을 반환하는 데 몇 분 정도 걸릴 수 있습니다.

리소스 정리

이 자습서에서 만든 Azure 리소스를 사용하지 않을 경우 단일 명령으로 제거할 수 있습니다. 명령을 실행하기 전에 코드를 변경하고 Azure에서 앱을 업데이트하는 방법을 보여 주는 이 자습서 시리즈의 다음 단계가 있습니다.

완료하고 이 자습서에서 만든 모든 Azure 리소스를 제거하려면 다음 명령을 사용하여 리소스 그룹을 삭제합니다.

az group delete --name aca-demo

문제가 있나요? Azure Container Apps 리포지토리에서 문제를 열어 GitHub에 알려주세요.

다음 단계

다음으로, 만든 컨테이너 앱을 업데이트하는 방법을 계속 알아봅니다.