.NET 7용 Docker 내장 컨테이너 지원

2022년 9월 14일에 Microsoft는 프로덕션에서 지원되는 .NET 7의 두 RC(릴리스 후보) 중 첫 번째인 .NET 7 릴리스 후보 1을 발표했습니다.

.NET 7 출시는 2022년 11월 8일부터 10일까지 .NET Conf 2022에서 예정되어 있습니다! 그때까지 우리는 이 새로운.NET release의 새로운 기능과 개선 사항 중 일부를 시험해 볼 수 있습니다!

몇 가지 새롭고 흥미로운 기능 중에서 특히 마음에 들고 여기서 강조하고 싶은 기능은 .NET 7에 대한 도커 내장 컨테이너 지원입니다.

새로운 클라우드 네이티브 기능 중 하나인 이 새로운 .NET 7 리소스는 .NET이 클라우드 네이티브 애플리케이션을 구축하고 웹 앱에서 탄력성, 확장성, 효율성 및 속도를 달성하기 위한 탁월한 대안으로 스스로를 더욱 통합하는 데 도움이 됩니다.

시작하자



이 릴리스의 경우 Docker 및 .NET 7.0.100-rc.1.22431.12 이상이 설치되어 있어야 합니다. 또한 Linux-x64 컨테이너만 지원됩니다.

아래에서 컨테이너화된 ASP.NET 애플리케이션을 처음부터 빌드하는 것이 얼마나 간단한지 확인할 수 있습니다.

# 1st step - create a new project 
dotnet new mvc -n my-containerized-app

# 2nd step - move project to its directory
cd my-containerized-app

# 3rd step - add a reference to a (temporary) package that creates the container
dotnet add package Microsoft.NET.Build.Containers

# 4th step - publish your project for linux-x64
dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer

# 5th step - run your app using the new container
docker run -it --rm -p 5010:80 --name my-cloud-native-app my-containerized-app:1.0.0



docker 및 .NET CLI에 익숙하거나 이미 마스터했다면 위의 지침 순서를 이해하는 데 어려움이 없을 것입니다.

그러나 초보자라면 각 문장을 단계별로 살펴보겠습니다.

첫 번째 및 두 번째 단계에서는 ASP.NET Core Empty 템플릿을 사용하여 새 .NET 애플리케이션을 만든 다음 새 프로젝트 디렉터리로 이동했습니다.

$ dotnet new mvc -n my-containerized-app
$ cd my-containerized-app


  • dotnet new : 새 프로젝트를 만드는 명령
  • mvc : .NET 템플릿 프로젝트를 설정하는 인수
  • -n : 생성된 출력에 대한 옵션

  • 세 번째 단계에서는 기본적으로 .NET 애플리케이션을 컨테이너로 게시하기 위해 Microsoft.NET.Build.Containers, nuget package을 추가했습니다.

    $ dotnet add package Microsoft.NET.Build.Containers
    


    이 예제에서는 empty mvc template 을 사용하고 있지만 자신의 프로젝트에서는 이 패키지를 추가하기만 하면 됩니다.
    my-containerized-app.csproj 파일을 살펴보면 패키지를 볼 수 있습니다.

      <ItemGroup>
        <PackageReference Include="Microsoft.NET.Build.Containers" Version="0.1.8" />
      </ItemGroup>
    


    네 번째 단계에서는 애플리케이션을 컴파일했습니다.

    $ dotnet publish --os linux --arch x64 - p:PublishProfile=DefaultContainer
    


  • dotnet publish : 앱을 컴파일하는 명령
  • --os linux--arch: 대상 운영 체제(OS)를 지정하고 대상 아키텍처를 지정하는 옵션입니다. 우리는 각각 linux와 x64를 지정했습니다. 그리고 Linux-x64 컨테이너만 지원된다는 점을 기억하는 것이 중요합니다
  • .
  • -p : 속성 설정에 사용

  • 콘솔에 docker images를 입력하면 이미지가 이미 생성된 것을 볼 수 있습니다.

    REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
    my-containerized-app   1.0.0     b65f7ee7668a   7 seconds ago   220MB
    


    이제 다섯 번째이자 마지막 단계에서 마침내 컨테이너를 실행합니다.

    $ docker run -it -p 5010:80 --name my-cloud-native-app  my-containerized-app:1.0.0
    


  • docker run : 실행되는 컨테이너 프로세스는 자체 파일 시스템, 자체 네트워킹 및 호스트와 분리된 자체 격리된 프로세스 트리가 있다는 점에서 격리됩니다
  • .
  • -it: 분리 모드 대신 대화형 모드에서 컨테이너를 실행하여 컨테이너가 실행 상태에 있는 동안 명령을 실행할 수 있습니다
  • .
  • -p 5010:80 : 사용된 포트의 정의입니다. <port that we will use on our local host>:<port used inside the container>
  • --name my-cloud-native-app : 컨테이너의 이름을 설정하여 docker가 임의의 이름을 생성하지 못하도록 합니다.
  • my-containerized-app:1.0.0 : 사용하려는 이미지 설정, 이 예에서는 <name of our project>:<version defined by .NET>

  • 모든 것이 잘 진행된다면 아래와 비슷한 결과를 얻게 될 것입니다.

    warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
          Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
    warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
          No XML encryptor configured. Key {2b3bd45e-0cc8-4cad-a0b9-ce5593370e33} may be persisted to storage in unencrypted form.
    info: Microsoft.Hosting.Lifetime[14]
          Now listening on: http://[::]:80
    info: Microsoft.Hosting.Lifetime[0]
          Application started. Press Ctrl+C to shut down.
    info: Microsoft.Hosting.Lifetime[0]
          Hosting environment: Production
    info: Microsoft.Hosting.Lifetime[0]
          Content root path: /app
    


    그런 다음 아무 브라우저에서나 응용 프로그램에 액세스하십시오: http://localhost:5010/ :



    결론



    그게 다야. 이 리소스가 얼마나 단순하고 프로젝트에 얼마나 유용한지 확인할 수 있었습니다. 가상 머신과 달리 컨테이너는 신속하게 확장 및 축소할 수 있으며 세분화된 확장성, 이식성 및 리소스의 효율적인 사용을 제공하는 클라우드 네이티브 애플리케이션에 필수적입니다.

    좋은 웹페이지 즐겨찾기