.NET 및 Docker 소개

컨테이너는 Docker, KubernetesPodman과 같은 도구를 사용하여 클라우드 애플리케이션을 배포하고 호스팅하는 가장 널리 사용되는 방법 중 하나입니다. 많은 개발자가 앱을 종속성으로 패키지하고 해당 앱이 모든 컨테이너 호스트에서 안정적으로 실행되도록 하는 것이 간단하기 때문에 컨테이너를 선택합니다. 컨테이너와 함께 .NET 사용에 대한 광범위한 지원이 있습니다.

Docker는 컨테이너에 대한 훌륭한 개요를 제공합니다. Docker Desktop: Community Edition은 개발자 데스크톱 컴퓨터에서 컨테이너를 사용하는 데 사용할 수 있는 좋은 도구입니다.

.NET 이미지

공식 .NET 컨테이너 이미지는 Microsoft 아티팩트 레지스트리에 게시되며 Docker Hub에서 발견할 수 있습니다. 프로덕션용 런타임 이미지와 Linux(Alpine, Debian, Ubuntu, Mariner) 및 Windows용 코드 빌드용 SDK 이미지가 있습니다. 자세한 내용은 .NET 컨테이너 이미지를 참조하세요.

.NET 이미지는 새 .NET 패치가 게시되거나 운영 체제 기본 이미지가 업데이트될 때마다 정기적으로 업데이트됩니다.

조각난 컨테이너 이미지는 .NET 런타임에 필요한 최소한의 구성 요소 집합이 포함된 Ubuntu 컨테이너 이미지입니다. 이러한 이미지는 일반 Ubuntu 이미지보다 100MB 정도 작으며 구성 요소가 적기 때문에 CVE도 더 적습니다. 특히 보안 프로필이 크게 개선되는 셸이나 패키지 관리자가 포함되어 있지 않습니다. 또한 루트가 아닌 사용자도 포함되며 해당 사용자가 사용하도록 설정된 상태로 구성됩니다.

컨테이너 이미지 빌드

Dockerfile을 사용하여 컨테이너 이미지를 빌드하거나 .NET SDK를 사용하여 이미지를 생성할 수 있습니다. 이미지 빌드에 대한 샘플은 dotnet/dotnet-dockerdotnet/sdk-container-builds를 참조하세요.

다음 예에서는 몇 가지 빠른 단계를 통해 컨테이너 이미지를 빌드하고 실행하는 방법을 보여 줍니다(.NET 8 및 .NET 7.0.300에서 지원됨).

$ dotnet new webapp -o webapp
$ cd webapp/
$ dotnet publish -t:PublishContainer
MSBuild version 17.8.3+195e7f5a3 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  webapp -> /home/rich/webapp/bin/Release/net8.0/webapp.dll
  webapp -> /home/rich/webapp/bin/Release/net8.0/publish/
  Building image 'webapp' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
  Pushed image 'webapp:latest' to local registry via 'docker'.
$ docker run --rm -d -p 8000:8080 webapp
7c7ad33409e52ddd3a9d330902acdd49845ca4575e39a6494952b642e584016e
$ curl -s http://localhost:8000 | grep ASP.NET
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
$ docker ps
CONTAINER ID   IMAGE     COMMAND               CREATED              STATUS              PORTS                                       NAMES
7c7ad33409e5   webapp    "dotnet webapp.dll"   About a minute ago   Up About a minute   0.0.0.0:8000->8080/tcp, :::8000->8080/tcp   jovial_shtern
$ docker kill 7c7ad33409e5

docker init는 Dockerfile을 사용하려는 개발자를 위한 새로운 옵션입니다.

Ports

포트 매핑은 컨테이너 사용의 핵심 부분입니다. 외부 웹 요청에 응답하려면 포트를 컨테이너 외부에 게시해야 합니다. ASP.NET Core 컨테이너 이미지는 기본적으로 포트 8080에서 수신 대기하도록 .NET 8에서 변경되었습니다. .NET 6 및 7은 포트 80에서 수신 대기합니다.

docker run을 사용한 이전 예에서 호스트 포트 8000은 컨테이너 포트 8080에 매핑됩니다. Kubernetes는 비슷한 방식으로 작동합니다.

ASPNETCORE_HTTP_PORTS, ASPNETCORE_HTTPS_PORTSASPNETCORE_URLS 환경 변수를 사용하여 이 동작을 구성할 수 있습니다.

사용자

.NET 8부터 모든 이미지에는 app라는 루트가 아닌 사용자가 포함됩니다. 기본적으로 조각된 이미지는 이 사용자가 사용하도록 설정된 상태로 구성됩니다. .NET 컨테이너로 앱 게시 기능(컨테이너 이미지 빌드 섹션에서 설명)도 기본적으로 이 사용자가 사용하도록 설정된 이미지를 구성합니다. 다른 모든 시나리오에서는 app 사용자를 수동으로 설정할 수 있습니다(예: USERDockerfile 명령 사용). 이미지가 app로 구성되었고 명령을 root로 실행해야 하는 경우 USER 명령을 사용하여 사용자를 root로 설정할 수 있습니다.

정보 유지

컨테이너 관련 뉴스는 dotnet/dotnet-docker 토론.NET 블로그 "컨테이너" 범주에 게시됩니다.

Azure 서비스

다양한 Azure 서비스에서 컨테이너를 지원합니다. 애플리케이션을 위한 Docker 이미지를 생성하여 다음 서비스 중 하나에 배포합니다.

  • AKS(Azure Kubernetes Service)
    Kubernetes를 사용하여 Windows 및 Linux 컨테이너를 스케일링하고 오케스트레이션합니다.

  • Azure App Service
    PaaS 환경에서 컨테이너를 사용하여 웹앱 또는 API를 배포합니다.

  • Azure Container Apps
    서버, 오케스트레이션 또는 인프라를 관리하지 않고도 컨테이너 워크로드를 실행하고 가시성 및 0으로 크기 오케스트레이션을 위해 DaprKEDA에 대한 네이티브 지원을 활용합니다.

  • Azure Container Instances
    더 높은 수준의 관리 서비스 없이 클라우드에서 개별 컨테이너를 만듭니다.

  • Azure Batch
    컨테이너를 사용하여 반복적인 컴퓨팅 작업을 실행합니다.

  • Azure Service Fabric
    Windows 및 Linux 컨테이너를 사용하여 .NET 애플리케이션을 마이크로 서비스로 이동, 전환 및 현대화합니다.

  • Azure Container Registry
    모든 형식의 Azure 배포에서 컨테이너 이미지 저장 및 관리합니다.

다음 단계