.NET 8용 컨테이너의 새로운 기능
이 문서에서는 .NET 8용 컨테이너의 새로운 기능에 대해 설명합니다.
컨테이너 이미지
.NET 8용 .NET 컨테이너 이미지는 다음과 같이 변경되었습니다.
- 루트가 아닌 사용자
- Debian 12
- 다듬어진 Ubuntu 이미지
- 다중 플랫폼 컨테이너 이미지 빌드
- ASP.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
로 실행할 수 없습니다.
자세한 내용은
Debian 12
이제 컨테이너 이미지는 Debian 12(Bookworm)사용합니다. Debian은 .NET 컨테이너 이미지의 기본 Linux 배포판입니다.
자세한 내용을 보려면 Debian 12로 업그레이드된 Debian 컨테이너 이미지를 참조하세요.
잘 다듬어진 Ubuntu 이미지
Chiseled Ubuntu 이미지는 .NET 8에서 사용할 수 있습니다. 치즐 이미지는 매우 작고 패키지 관리자나 셸이 없으며 non-root
으로 인해 공격 가능 표면이 줄어듭니다. 이 유형의 이미지는 어플라이언스 스타일 컴퓨팅의 이점을 원하는 개발자를 위한 것입니다.
깎은 이미지는 기본적으로 세계화를 지원하지 않습니다.
extra
이미지는 icu
및 tzdata
패키지를 포함하여 제공됩니다.
세계화 및 컨테이너에 대한 자세한 내용은 세계화 테스트 앱참조하세요.
다중 플랫폼 컨테이너 이미지 빌드
Docker는 여러 환경에서 작동하는 --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 페이지에 나열됩니다.
컨테이너 게시
- 생성된 이미지의 기본값은
- 성능 및 호환성
- 인증
- tar.gz 아카이브에 게시
생성 이미지 기본값
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
폴더 이름 또는 특정 파일 이름을 가진 경로를 지정할 수 있습니다.
참조하세요
.NET