본문으로 건너뛰기

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 8000
EXPOSE 9229
  • FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base
    • ASP.NET Core 8 런타임을 포함한 Alpine Linux 기반의 가벼운 이미지를 사용합니다.
    • Alpine은 최소한의 패키지만 포함하고 있어 보안성이 높고, 이미지 크기가 작습니다.
  • WORKDIR /app
    • 컨테이너 내에서 작업 디렉토리를 /app으로 설정합니다.
  • EXPOSE 8000
    • 컨테이너가 8000번 포트에서 애플리케이션을 실행할 수 있도록 설정합니다.
  • 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에 저장합니다.

애플리케이션 배포 준비

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 --from=publish /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 기반 이미지보다 크기가 훨씬 작음
  • 보안성: 최소한의 패키지만 포함하여 공격 표면이 줄어듦
  • 성능 최적화: 메모리 사용량이 낮고, 컨테이너 시작 속도가 빠름

포트 8000과 9229의 역할

  • 포트 8000: 기본적으로 애플리케이션이 실행되는 HTTP 포트
  • 포트 9229: Node.js 및 .NET Core 애플리케이션의 원격 디버깅을 위해 사용됨

실행 방법

# Docker 이미지 빌드
docker build -t yourapp-image .

# 컨테이너 실행
docker run -d -p 8000:8000 --name yourapp-container yourapp-image
  • -d: 백그라운드에서 실행
  • -p 8000:8000: 호스트와 컨테이너의 포트를 매핑
  • --name yourapp-container: 컨테이너 이름 지정
# 베이스 이미지로 ASP.NET Core 8 사용
FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base
WORKDIR /app
EXPOSE 8000
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 --from=publish /app/publish .

# 애플리케이션 실행
ENTRYPOINT ["dotnet", "YourApp.dll"]