dotnet publish 도구를 사용하여 .NET 앱을 컨테이너화
컨테이너에는 변경할 수 없는 인프라, 이식 가능한 아키텍처 제공 및 확장성 사용과 같은 많은 기능과 이점이 있습니다. 이미지를 사용하여 로컬 개발 환경, 프라이빗 클라우드 또는 퍼블릭 클라우드용 컨테이너를 만들 수 있습니다. 이 자습서에서는 Dockerfile을 사용하지 않고 dotnet publish 명령을 사용하여 .NET 애플리케이션을 컨테이너화하는 방법을 알아봅니다. 또한 컨테이너 이미지 및 실행을 구성하는 방법과 리소스를 정리하는 방법을 살펴봅니다.
팁
Dockerfile을 사용하여 .NET 앱을 컨테이너화하려는 경우, 자습서: .NET 앱을 컨테이너화하기를 참조하세요.
필수 구성 요소
다음 필수 구성 요소를 설치합니다.
-
.NET 8+ SDK
.NET이 설치된 경우dotnet --info
명령을 사용하여 사용 중인 SDK를 확인합니다.
컨테이너를 로컬로 실행하려는 경우 다음과 같은 OCI(Open Container Initiative) 호환 컨테이너 런타임이 필요합니다.
- Docker Desktop: 가장 일반적인 컨테이너 런타임입니다.
- Podman: Docker에 대한 오픈 소스 디먼리스 대안입니다.
중요하다
.NET SDK는 Docker 없이 컨테이너 이미지를 만듭니다. Docker 또는 Podman은 이미지를 로컬로 실행하려는 경우에만 필요합니다. 기본적으로 .NET 앱 컨테이너 이미지로 게시할
이러한 필수 구성 요소 외에도 샘플 프로젝트가 작업자이므로 .NET
.NET 앱 만들기
컨테이너화하려면 .NET 앱이 필요하므로 먼저 템플릿에서 새 앱을 만듭니다. 터미널을 열고, 아직 만들지 않았다면 작업 폴더(sample-directory)를 만들고, 해당 디렉터리로 이동합니다. 작업 폴더에서 다음 명령을 실행하여 Worker라는 하위 디렉터리에 새 프로젝트를 생성합니다 :.
dotnet new worker -o Worker -n DotNet.ContainerImage
폴더 트리는 다음 디렉터리와 유사합니다.
📁 sample-directory
└──📂 Worker
├──appsettings.Development.json
├──appsettings.json
├──DotNet.ContainerImage.csproj
├──Program.cs
├──Worker.cs
├──📂 Properties
│ └─── launchSettings.json
└──📂 obj
├── DotNet.ContainerImage.csproj.nuget.dgspec.json
├── DotNet.ContainerImage.csproj.nuget.g.props
├── DotNet.ContainerImage.csproj.nuget.g.targets
├── project.assets.json
└── project.nuget.cache
dotnet new
명령은 Worker 새 폴더를 만들고, 실행할 때 매초마다 메시지를 기록하는 작업자 서비스를 생성합니다. 터미널 세션에서 디렉터리를 변경하고 Worker 폴더로 이동합니다.
dotnet run
명령을 사용하여 앱을 시작합니다.
dotnet run
Using launch settings from ./Worker/Properties/launchSettings.json...
Building...
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:28 -06:00
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: .\Worker
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:29 -06:00
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:30 -06:00
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
작업자 템플릿은 무기한 반복됩니다. 취소 명령 Ctrl+C 사용하여 중지합니다.
컨테이너 이미지 이름 설정
앱을 컨테이너로 게시할 때 사용할 수 있는 다양한 구성 옵션이 있습니다. 기본적으로 컨테이너 이미지 이름은 프로젝트의 AssemblyName
. 해당 이름이 컨테이너 이미지 이름으로 유효하지 않은 경우 다음 프로젝트 파일에 표시된 대로 ContainerRepository
지정하여 재정의할 수 있습니다.
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
<ContainerRepository>dotnet-worker-image</ContainerRepository>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.0" />
</ItemGroup>
</Project>
자세한 내용은 ContainerRepository
참조하세요.
.NET 앱 게시
.NET 앱을 컨테이너로 게시하려면 다음 dotnet publish 명령을 사용합니다.
dotnet publish --os linux --arch x64 /t:PublishContainer
위의 .NET CLI 명령은 앱을 컨테이너로 게시합니다.
- Linux를 OS(
--os linux
)로 대상으로 지정합니다. - x64 아키텍처(
--arch x64
)를 지정합니다.
중요하다
컨테이너를 로컬로 게시하려면 활성 OCI 규격 디먼이 실행 중이어야 합니다. 앱을 컨테이너로 게시하려고 할 때 실행되지 않는 경우 다음과 유사한 오류가 발생합니다.
..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]
dotnet publish
명령은 예제 출력과 유사한 출력을 생성합니다.
Restore complete (0.2s)
DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\
이 명령은 작업자 앱을 게시 폴더로 컴파일하고 기본적으로 컨테이너 이미지를 로컬 Docker 디먼에 푸시합니다. Podman을 사용하는 경우 별칭
tarball에 .NET 앱 게시
tarball(또는 tar 파일)은 다른 파일이 포함된 파일입니다. 일반적으로 압축된 보관 파일임을 나타내기 위해 *.tar.gz 복합 파일 확장으로 끝납니다. 이러한 파일 형식은 소프트웨어를 배포하거나 백업을 만드는 데 사용됩니다. 이 경우 생성된 tarball은 컨테이너 이미지를 배포하는 데 사용됩니다.
.NET 앱을 tarball에 컨테이너로 게시하려면 다음 명령을 사용합니다.
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerArchiveOutputPath=./images/container-image.tar.gz
위의 명령은 tarball에 컨테이너로 앱을 게시합니다.
- Linux를 OS(
--os linux
)로 대상으로 지정합니다. - x64 아키텍처(
--arch x64
)를 지정합니다. -
ContainerArchiveOutputPath
속성을./images/container-image.tar.gz
로 설정합니다.
이 명령에는 실행 중인 OCI 규격 디먼이 필요하지 않습니다. 자세한 내용은 ContainerArchiveOutputPath
참조하세요.
타르볼을 로드하세요
tarball로 내보내는 일반적인 사용 사례는 보안 중심 조직을 위한 것입니다. 컨테이너를 만들고, tarball로 내보낸 다음, tarball을 통해 보안 검색 도구를 실행합니다. 이 방법은 라이브 시스템을 검사하는 복잡성을 방지하기 때문에 규정 준수를 간소화합니다.
타볼에는 적절한 도구를 사용하여 로드할 수 있는 전체 컨테이너가 포함되어 있습니다.
-
Docker:
docker load -i ./images/container-image.tar.gz
-
Podman:
podman load -i ./images/container-image.tar.gz
컨테이너 레지스트리에 .NET 앱 게시
컨테이너 레지스트리는 컨테이너 이미지를 저장하고 관리하는 서비스입니다. 컨테이너 이미지를 여러 환경에 저장하고 배포하는 데 사용됩니다. 다음 명령을 사용하여 컨테이너 레지스트리에 컨테이너로 .NET 앱을 게시할 수 있습니다.
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerRegistry=ghcr.io
위의 코드는 컨테이너 레지스트리에 컨테이너로 앱을 게시합니다.
- Linux를 OS(
--os linux
)로 대상으로 지정합니다. - x64 아키텍처(
--arch x64
)를 지정합니다. -
ContainerRegistry
속성을ghcr.io
로 설정합니다.
자세한 내용은 ContainerRegistry참조하세요.
리소스 정리
이 문서에서는 .NET 작업자를 컨테이너 이미지로 게시했습니다. 원하는 경우 이 리소스를 삭제합니다.
docker images
명령을 사용하여 설치된 이미지 목록을 확인합니다.
docker images
다음 예제 출력을 고려합니다.
REPOSITORY TAG IMAGE ID CREATED SIZE
dotnet-worker-image 1.0.0 25aeb97a2e21 12 seconds ago 191MB
팁
이미지 파일은 클 수 있습니다. 일반적으로 앱을 테스트하고 개발하는 동안 만든 임시 컨테이너를 제거합니다. 일반적으로 해당 런타임에 따라 다른 이미지를 빌드하려는 경우 런타임이 설치된 기본 이미지를 유지합니다.
이미지를 삭제하려면 이미지 ID를 복사하고 docker image rm
명령을 실행합니다.
docker image rm 25aeb97a2e21
다음 단계
- .NET SDK에 대한 기본 제공 컨테이너 지원 발표
- 자습서: .NET 앱 컨테이너화
- .NET 컨테이너 이미지
- 컨테이너 지원하는 Azure 서비스를 검토합니다.
- Dockerfile 명령 대해 읽습니다.
- Visual Studio에서 컨테이너 도구 탐색
.NET