Share via


.NET 8용 컨테이너의 새로운 기능

이 문서에서는 .NET 8용 컨테이너의 새로운 기능을 설명합니다.

컨테이너 이미지

.NET 8용 .NET 컨테이너 이미지가 다음과 같이 변경되었습니다.

루트가 아닌 사용자

이미지에는 non-root 사용자가 포함되어 있습니다. 이 사용자는 이미지 non-root을(를) 가능하게 만듭니다. non-root(으)로 실행하려면 Dockerfile 끝에 다음 줄을 추가합니다(또는 Kubernetes 매니페스트의 유사한 지침).

USER app

.NET 8은 non-root 사용자의 UID에 대한 환경 변수(64198)를 추가합니다. 이 환경 변수는 이름이 아닌 UID를 통해 컨테이너 사용자를 설정해야 하는 Kubernetes runAsNonRoot 테스트에 유용합니다. 이 dockerfile은 사용 예를 보여 줍니다.

기본 포트도 포트 80에서 8080(으)로 변경되었습니다. 이 변경 내용을 지원하기 위해 새 환경 변수 ASPNETCORE_HTTP_PORTS을(를) 사용하여 포트를 더 쉽게 변경할 수 있습니다. 변수는 ASPNETCORE_URLS에서 요구하는 형식보다 간단한 포트 목록을 허용합니다. 이러한 변수 중 하나를 사용하여 포트를 다시 포트 80으로 변경하면 non-root(으)로 실행할 수 없습니다.

자세한 내용은 기본 ASP.NET Core 포트가 80에서 8080으로 변경되고 Linux 이미지의 루트가 아닌 새 '앱' 사용자를 참조하세요.

Debian 12

이제 컨테이너 이미지는 Debian 12(Bookworm)를 사용합니다. Debian은 .NET 컨테이너 이미지의 기본 Linux Distro입니다.

자세한 내용은 Debian 12로 업그레이드된 Debian 컨테이너 이미지를 참조 하세요.

Chiseled Ubuntu 이미지

Chiseled Ubuntu 이미지는 .NET 8에서 사용할 수 있습니다. Chiseled 이미지는 매우 작고 패키지 관리자나 셸이 없으며 non-root이므로 공격 표면이 줄어듭니다. 이 형식의 이미지는 어플라이언스 스타일 컴퓨팅의 이점을 원하는 개발자를 위한 것입니다.

깎은 이미지는 기본적으로 세계화를 지원하지 않습니다. extra포함 및 tzdata 패키지를 포함하는 icu 이미지가 제공됩니다.

세계화 및 컨테이너에 대한 자세한 내용은 세계화 테스트 앱을 참조 하세요.

다중 플랫폼 컨테이너 이미지 빌드

Docker는 여러 환경에서 작동하는 다중 플랫폼 이미지 사용 및 빌드를 지원합니다. .NET 8에는 아키텍처를 빌드한 .NET 이미지와 혼합하고 일치시킬 수 있는 새로운 패턴이 도입되었습니다. 예를 들어, macOS를 사용 중이고 Azure에서 x64 클라우드 서비스를 대상으로 지정하려는 경우 다음과 같이 --platform 스위치를 사용하여 이미지를 빌드할 수 있습니다.

docker build --pull -t app --platform linux/amd64

이제 .NET SDK는 복원 시 $TARGETARCH 값과 -a 인수를 지원합니다. 다음 코드 조각은 예를 보여 줍니다.

RUN dotnet restore -a $TARGETARCH

# Copy everything else and build app.
COPY aspnetapp/. .
RUN dotnet publish -a $TARGETARCH --self-contained false --no-restore -o /app

자세한 내용은 다중 플랫폼 컨테이너 지원 개선 블로그 게시물을 참조하세요.

ASP.NET 복합 이미지

컨테이너화 성능을 개선하려는 활동의 일환으로 런타임의 복합 버전이 포함된 새로운 ASP.NET Docker 이미지를 사용할 수 있습니다. 이 복합은 여러 MSIL 어셈블리를 단일 R2R(실행 준비 완료) 출력 이진 파일로 컴파일하여 빌드됩니다. 이러한 어셈블리는 단일 이미지에 포함되므로 지팅에 소요되는 시간이 줄어들고 앱의 시작 성능이 개선됩니다. 일반 ASP.NET 이미지에 비해 합성의 또 다른 큰 장점은 합성 이미지가 디스크에서 더 작은 크기를 갖는다는 것입니다.

알아두어야 할 주의 사항이 있습니다. 복합재에는 여러 어셈블리가 하나에 포함되어 있으므로 버전 결합이 더욱 긴밀해집니다. 앱은 프레임워크 또는 ASP.NET 이진 파일의 사용자 지정 버전을 사용할 수 없습니다.

복합 이미지는 리포지토리에서 mcr.microsoft.com/dotnet/aspnet Alpine Linux, Ubuntu("jammy") Chiseled 및 Mariner 배포판 플랫폼에서 사용할 수 있습니다. 태그는 ASP.NET Docker 페이지-composite 접미사와 함께 나열됩니다.

컨테이너 게시

생성된 이미지 기본값

dotnet publish 는 컨테이너 이미지를 생성할 수 있습니다. 기본적으로 이미지를 생성하므로 non-root 앱이 기본적으로 안전하게 유지됩니다. 예를 들어 .를 사용하여 적절한 설정을 통해 ContainerUser 언제든지 이 기본값을 root변경합니다.

기본 출력 컨테이너 태그는 이제 latest. 이 기본값은 컨테이너 공간의 다른 도구와 일치하며 내부 개발 루프에서 컨테이너를 더 쉽게 사용할 수 있도록 해줍니다.

성능 및 호환성

.NET 8에서는 컨테이너를 원격 레지스트리, 특히 Azure 레지스트리로 푸시하는 성능이 개선되었습니다. 속도 향상은 한 번의 작업으로 계층을 푸시하고, 원자성 업로드를 지원하지 않는 레지스트리의 경우 보다 신뢰할 수 있는 청크 메커니즘을 통해 발생합니다.

이러한 개선은 또한 Harbour, Artifactory, Quay.io 및 Podman과 같은 더 많은 레지스트리가 지원된다는 것을 의미합니다.

인증

.NET 8에는 컨테이너를 레지스트리에 푸시할 때 OAuth 토큰 교환 인증(Azure Managed Identity)에 대한 지원이 추가되었습니다. 이 지원은 이제 인증 오류 없이 Azure Container Registry와 같은 레지스트리에 푸시할 수 있음을 의미합니다. 다음 명령은 게시 흐름의 예를 보여 줍니다.

> az acr login -n <your registry name>
> dotnet publish -r linux-x64 -p PublishProfile=DefaultContainer

.NET 앱 컨테이너화에 대한 자세한 내용은 dotnet publish를 사용하여 .NET 앱 컨테이너화를 참조하세요.

tar.gz 보관에 게시

.NET 8부터 컨테이너를 tar.gz 보관으로 직접 만들 수 있습니다. 이 기능은 워크플로가 간단하지 않고 이미지를 푸시하기 전에 이미지에 대해 검사 도구를 실행해야 하는 경우에 유용합니다. 보관이 만들어지면 이를 이동하거나 검사하거나 로컬 Docker 툴체인에 로드할 수 있습니다.

보관 계층에 게시하려면 dotnet publish 명령에 ContainerArchiveOutputPath 속성을 추가합니다. 예를 들면 다음과 같습니다.

dotnet publish \
  -p PublishProfile=DefaultContainer \
  -p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz

폴더 이름이나 특정 파일 이름의 경로를 지정할 수 있습니다.

참고 항목