ASP.NET Core 8 기반 Dockerfile 가이드
ASP.NET Core 8을 기반으로 하는 경량화된 Dockerlize 앱을 만들기 위한 Dockerfile의 구조와 각 단계에 대한 설명을 포함합니다. 해당 Dockerfile은 멀티스테이지 빌드를 활용하여 최적화된 이미지를 생성하는 방식으로 작성되었습니다.
Dockerfile 설명
베이스 이미지 설정
FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base
WORKDIR /app
EXPOSE 8421
EXPOSE 9229
-
FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base
- ASP.NET Core 8 런타임을 포함한 Alpine Linux 기반의 가벼운 이미지를 사용합니다.
- Alpine은 최소한의 패키지만 포함하고 있어 보안성이 높고, 이미지 크기가 작습니다.
-
WORKDIR /app
- 컨테이너 내에서 작업 디렉토리를
/app
으로 설정합니다.
- 컨테이너 내에서 작업 디렉토리를
-
EXPOSE 8421
- 컨테이너가 8421번 포트에서 애플리케이션을 실행할 수 있도록 설정합니다.
-
EXPOSE 9229
- 디버깅을 위해 9229 포트를 추가로 노출합니다.
빌드 환경 설정
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["YourApp.csproj", "./"]
RUN dotnet restore "./YourApp.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "YourApp.csproj" -c Release -o /app/build
-
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
- .NET SDK 8.0 이미지를 사용하여 애플리케이션을 빌드합니다.
- SDK는 컴파일과 빌드, 패키지 관리 등을 수행하는 역할을 합니다.
-
WORKDIR /src
- 소스 코드가 저장될 디렉토리를
/src
로 지정합니다.
- 소스 코드가 저장될 디렉토리를
-
COPY ["YourApp.csproj", "./"]
- 프로젝트 파일(
.csproj
)을 컨테이너로 복사합니다.
- 프로젝트 파일(
-
RUN dotnet restore "./YourApp.csproj"
- 프로젝트가 의존하는 NuGet 패키지를 복원합니다.
-
COPY . .
- 전체 소스 코드를 컨테이너 내로 복사합니다.
-
WORKDIR "/src/."
- 현재 디렉토리 내에서 빌드를 수행합니다.
-
RUN dotnet build "YourApp.csproj" -c Release -o /app/build
- Release 모드로 애플리케이션을 빌드하고 결과물을
/app/build
에 저장합니다.
- Release 모드로 애플리케이션을 빌드하고 결과물을
애플리케이션 배포 준비
FROM build AS publish
RUN dotnet publish "YourApp.csproj" -c Release -o /app/publish
-
FROM build AS publish
- 이전 단계(
build
)에서 만든 빌드 환경을 기반으로 합니다.
- 이전 단계(
-
RUN dotnet publish "YourApp.csproj" -c Release -o /app/publish
publish
명령어를 통해 실행 가능한 형태의 애플리케이션을 생성합니다.-c Release
옵션을 통해 최적화된 코드로 패키징합니다.- 결과물은
/app/publish
디렉토리에 저장됩니다.
최종 컨테이너 생성
FROM base AS final
WORKDIR /app
COPY /app/publish .
-
FROM base AS final
- 첫 번째 단계에서 만든 **런타임 환경(base 이미지)**를 사용합니다.
- SDK 없이 ASP.NET Core 런타임만 포함된 가벼운 컨테이너에서 애플리케이션을 실행합니다.
-
WORKDIR /app
- 작업 디렉토리를
/app
으로 설정합니다.
- 작업 디렉토리를
-
COPY --from=publish /app/publish .
publish
단계에서 생성된 실행 파일을 최종 컨테이너로 복사합니다.
애플리케이션 실행
ENTRYPOINT ["dotnet", "YourApp.dll"]
ENTRYPOINT ["dotnet", "YourApp.dll"]
- 컨테이너 실행 시
dotnet YourApp.dll
을 실행하여 애플리케이션을 시작합니다. - ENTRYPOINT를 사용하면 컨테이너가 실행될 때 특정 명령어가 항상 실행되도록 설정할 수 있습니다.
- 컨테이너 실행 시
전체 Dockerfile 및 요약
이 Dockerfile은 멀티스테이지 빌드를 활용하여 효율적인 ASP.NET Core 8 애플리케이션을 컨테이너화하는 방식을 설명합니다. Alpine 기반의 경량 런타임 이미지를 활용하여 보안성과 성능을 높이면서도 빌드 속도를 최적화할 수 있습니다.
멀티스테이지 빌드의 이점
- 이미지 크기 최적화:
- SDK(컴파일 도구)가 포함된 이미지에서 빌드하고, 최종 실행 환경은 가벼운 런타임 이미지를 사용하므로 이미지 크 기가 작아집니다.
- 보안성 증가:
- 최종 컨테이너에는 빌드 도구 및 개발 패키지가 포함되지 않으므로 보안 취약점이 줄어듭니다.
- 캐싱을 활용한 빌드 속도 향상:
dotnet restore
를 먼저 실행하여 의존성 패키지를 캐싱하므로, 코드가 변경되지 않으면 다시 다운로드할 필요가 없습니다.
Alpine Linux 사용 이유
- 경량성: 일반적인 Ubuntu 기반 이미지보다 크기가 훨씬 작음
- 보안성: 최소한의 패키지만 포함하여 공격 표면이 줄어듦
- 성능 최적화: 메모리 사용량이 낮고, 컨테이너 시작 속도가 빠름
포트 8421과 9229의 역할
- 포트 8421: 기본적으로 애플리케이션이 실행되는 HTTP 포트
- 포트 9229: Node.js 및 .NET Core 애플리케이션의 원격 디버깅을 위해 사용됨
실행 방법
# Docker 이미지 빌드
docker build -t yourapp-image .
# 컨테이너 실행
docker run -d -p 8421:8421 --name yourapp-container yourapp-image
-d
: 백그라운드에서 실행-p 8421:8421
: 호스트와 컨테이너의 포트를 매핑--name yourapp-container
: 컨 테이너 이름 지정
# 베이스 이미지로 ASP.NET Core 8 사용
FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base
WORKDIR /app
EXPOSE 8421
EXPOSE 9229
# 빌드 이미지로 SDK 사용
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["YourApp.csproj", "./"]
RUN dotnet restore "./YourApp.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "YourApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "YourApp.csproj" -c Release -o /app/publish
# 최종 이미지
FROM base AS final
WORKDIR /app
COPY /app/publish .
# 애플리케이션 실행
ENTRYPOINT ["dotnet", "YourApp.dll"]