다음을 통해 공유


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

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

컨테이너 이미지

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

루트가 아닌 사용자

이미지에는 non-root 사용자가 포함되었습니다. 이 사용자는 이미지를 non-root에 맞도록 설정합니다. non-root으로 실행하려면 Dockerfile의 끝에 다음 줄을 추가하세요(또는 Kubernetes 매니페스트에서 비슷한 명령어를 추가하세요).

USER app

.NET 8은 1654인 non-root 사용자에 대한 UID에 대한 환경 변수를 추가합니다. 이 환경 변수는 Kubernetes runAsNonRoot 테스트에 유용하며, 컨테이너 사용자는 이름이 아닌 UID를 통해 설정해야 합니다. 이 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 배포판입니다.

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

잘 다듬어진 Ubuntu 이미지

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

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

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

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

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 이미지를 사용할 수 있습니다. 이 컴포지트는 여러 CIL 어셈블리를 R2R(즉시 실행) 출력 바이너리로 컴파일하여 빌드됩니다. 이러한 어셈블리는 단일 이미지에 포함되므로 지팅 시간이 줄어들고 앱의 시작 성능이 향상됩니다. 일반 ASP.NET 이미지에 비해 복합 이미지의 다른 큰 장점은 복합 이미지의 크기가 디스크에서 더 작다는 것입니다.

주의해야 할 사항이 있습니다. 복합체에는 여러 어셈블리가 하나로 내장되어 있어 버전 간 결합이 더 엄격해집니다. 앱은 사용자 지정 버전의 프레임워크 또는 ASP.NET 이진 파일을 사용할 수 없습니다.

복합 이미지mcr.microsoft.com/dotnet/aspnet 리포지토리에서 Alpine Linux, Ubuntu("자미") 치즐 및 마리너 배포판 플랫폼용으로 제공됩니다. 태그는 -composite 접미사가 붙은 형태로 ASP.NET Docker 페이지에 나열됩니다.

컨테이너 게시

생성 이미지 기본값

dotnet publish 컨테이너 이미지를 생성할 수 있습니다. 기본적으로 이미지를 생성하므로 앱이 기본적으로 안전하게 유지됩니다. ContainerUser 속성(예: root)을 설정하여 언제든지 이 기본값을 변경합니다.

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

성능 및 호환성

.NET 8은 컨테이너를 원격 레지스트리, 특히 Azure 레지스트리에 푸시하기 위한 성능이 향상되었습니다. 속도 향상은 계층을 한 번의 작업으로 푸시하는 것에서 비롯되며, 원자성 업로드를 지원하지 않는 레지스트리의 경우 보다 안정적인 청크 처리 메커니즘을 제공합니다.

또한 이러한 향상된 기능은 더 많은 레지스트리(Harbor, Artifactory, Quay.io 및 Podman)가 지원됨을 의미합니다.

인증

.NET 8은 레지스트리에 컨테이너를 푸시할 때 OAuth 토큰 교환 인증(Azure 관리 ID)에 대한 지원을 추가합니다. 이 지원은 이제 인증 오류 없이 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

폴더 이름 또는 특정 파일 이름을 가진 경로를 지정할 수 있습니다.

참조하세요