재우니의 블로그

 

 

아래는 .NET 8.0을 명시적으로 지정하여 ASP.NET Core MVC 애플리케이션을 생성하고, Docker Desktop을 이용해 Docker 기반으로 설치부터 실행까지 진행하는 단계별 가이드입니다.


1. Docker Desktop 및 .NET 8 SDK 준비

  1. Docker Desktop 설치 및 실행 확인
    • Docker Desktop 다운로드 페이지에서 자신의 운영체제(Windows, macOS 등)에 맞는 Docker Desktop을 다운로드하고 설치합니다.
    • 설치 후 Docker Desktop을 실행하여 아이콘이 정상적으로 표시되는지 확인합니다.
  2. .NET 8 SDK 설치 확인
    • 터미널(또는 명령 프롬프트)을 열고 아래 명령어로 설치된 .NET SDK 버전을 확인합니다.
      dotnet --version
      
    • 만약 .NET 8 SDK가 설치되어 있지 않다면 공식 .NET 8 다운로드 페이지에서 설치하세요.

2. ASP.NET Core MVC 프로젝트 생성 (.NET 8.0 명시)

터미널에서 프로젝트를 생성할 디렉토리로 이동한 후, 아래 명령어를 실행하여 .NET 8.0을 타겟으로 하는 ASP.NET Core MVC 프로젝트를 생성합니다.

dotnet new mvc -n MyAspNetCoreApp -f net8.0
  • -n MyAspNetCoreApp 옵션은 프로젝트 이름을 MyAspNetCoreApp으로 지정합니다.
  • -f net8.0 옵션을 사용하여 타겟 프레임워크를 .NET 8.0으로 명시합니다.

프로젝트 생성 후, MyAspNetCoreApp 폴더 내의 MyAspNetCoreApp.csproj 파일을 열어 <TargetFramework>net8.0</TargetFramework>가 제대로 설정되었는지 확인합니다.


3. Dockerfile 작성 (Multi-stage Build)

프로젝트 루트 디렉토리(즉, MyAspNetCoreApp 폴더)에 Dockerfile을 생성하고 아래 내용을 입력합니다.

# [빌드 단계]
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app

# 프로젝트 파일 복사 및 복원
COPY *.csproj ./
RUN dotnet restore

# 소스 코드 전체 복사 및 게시(Publish)
COPY . ./
RUN dotnet publish -c Release -o out

# [런타임 단계]
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app

# 빌드 단계에서 생성한 결과물을 런타임 이미지로 복사
COPY --from=build /app/out ./

# 애플리케이션 실행 (프로젝트 이름에 따라 DLL 파일명이 달라질 수 있음)
ENTRYPOINT ["dotnet", "MyAspNetCoreApp.dll"]

설명:

  • 빌드 단계: mcr.microsoft.com/dotnet/sdk:8.0 이미지를 사용해 프로젝트를 복원(restore)하고, 소스 코드를 빌드하여 게시(publish)합니다.
  • 런타임 단계: 게시된 결과물을 mcr.microsoft.com/dotnet/aspnet:8.0 런타임 이미지로 복사하여 컨테이너가 애플리케이션을 실행할 수 있도록 합니다.

4. Docker 이미지 빌드

프로젝트 루트(즉, Dockerfile이 있는 폴더)에서 아래 명령어를 실행합니다.

docker build -t myaspnetcoreapp .
  • -t myaspnetcoreapp 옵션은 빌드된 이미지에 myaspnetcoreapp이라는 태그를 부여합니다.
  • 빌드 프로세스는 multi-stage 빌드를 사용하여 먼저 SDK 이미지에서 빌드한 후 런타임 이미지를 생성합니다.

빌드가 정상적으로 완료되면 로컬 Docker 이미지 목록에 myaspnetcoreapp 이미지가 추가됩니다.


5. Docker 컨테이너 실행

이미지가 빌드되었으면, 아래 명령어로 Docker 컨테이너를 실행합니다.

컨테이너가 실제로 리스닝하는 포트 8080과 호스트 포트를 매핑하도록 Docker run 명령어를 변경합니다.

docker run -d -p 8080:8080 --name myaspnetcoreappcontainer myaspnetcoreapp
  • -d 옵션은 컨테이너를 백그라운드 모드로 실행합니다.
  • -p 8080:8080 옵션은 호스트의 8080 포트를 컨테이너의 8080 포트에 매핑하여 브라우저에서 접근할 수 있도록 합니다.
  • --name myaspnetcoreappcontainer 옵션은 컨테이너에 이름을 부여하여 관리하기 쉽게 합니다.

이렇게 하면 호스트의 8080 포트가 컨테이너의 8080 포트와 연결되어 브라우저에서 http://localhost:8080로 접근 시 정상적으로 응답하게 됩니다.


6. 웹 애플리케이션 접속 확인

컨테이너가 정상적으로 실행 중이라면 웹 브라우저를 열고 아래 주소로 접속합니다.

http://localhost:8080

정상적으로 ASP.NET Core MVC 애플리케이션의 초기 페이지(예: 기본 홈 페이지)가 나타난다면 성공적으로 실행된 것입니다.


7. Docker 컨테이너 및 이미지 관리

컨테이너 중지

실행 중인 컨테이너를 중지하려면 아래 명령어를 사용합니다.

docker stop myaspnetcoreappcontainer

컨테이너 삭제

더 이상 필요하지 않은 컨테이너는 아래 명령어로 삭제할 수 있습니다.

docker rm myaspnetcoreappcontainer

이미지 삭제

이미지를 삭제하려면 아래 명령어를 사용합니다.

docker rmi myaspnetcoreapp

추가 팁

  • 코드 변경 후 다시 빌드:
    프로젝트 코드에 변경사항이 있을 경우, Docker 이미지를 다시 빌드하여 반영할 수 있습니다.
  • Docker Compose 활용:
    여러 서비스(예: 데이터베이스 등)와 함께 구성할 때는 Docker Compose를 활용하면 관리가 편리합니다.
  • 로그 확인:
    컨테이너 로그를 확인하려면 다음 명령어를 사용하세요.
  • docker logs myaspnetcoreappcontainer

이와 같이, .NET 8.0을 명시적으로 지정하여 dotnet new mvc -n MyAspNetCoreApp -f net8.0로 프로젝트를 생성하고, Dockerfile에서 동일한 버전의 SDK 및 런타임 이미지를 사용하도록 설정한 후 Docker 빌드와 실행을 진행하면, 버전 불일치 문제 없이 ASP.NET Core 8 기반 애플리케이션을 Docker 컨테이너에서 실행할 수 있습니다.

 


 

 

 

ASP.NET Core 8 소스 코드를 수정한 후, Docker 컨테이너에 변경사항을 반영하려면 기본적으로 Docker 이미지 재빌드컨테이너 재실행이 필요합니다. 아래 단계별로 설명드리겠습니다.


1. 소스 코드 수정

  1. 로컬 개발 환경(예: Visual Studio, VS Code 등)에서 ASP.NET Core 8 애플리케이션의 소스 코드를 수정합니다.
  2. 변경 사항이 저장되었는지 확인합니다.

2. Docker 이미지 재빌드

Docker는 컨테이너 실행 시 이미지 기반으로 동작하기 때문에, 소스 코드를 수정했다면 변경 내용을 포함하는 새 이미지를 빌드해야 합니다.

  1. 터미널 또는 명령 프롬프트에서 Dockerfile이 있는 프로젝트 루트 디렉토리로 이동합니다.
  2. 아래 명령어를 실행하여 이미지를 재빌드합니다.
    • -t myaspnetcoreapp 옵션은 새로 빌드되는 이미지에 태그를 부여합니다.
    • 빌드 과정에서 Dockerfile에 명시된 multi-stage 빌드를 수행하여 소스 코드 변경사항이 반영된 새로운 이미지를 생성합니다.
  3. docker build -t myaspnetcoreapp .

3. 기존 컨테이너 중지 및 삭제

새로운 이미지를 기반으로 컨테이너를 실행하기 전에, 이전에 실행 중인 컨테이너가 있다면 이를 중지하고 삭제해야 합니다.

  1. 현재 실행 중인 컨테이너 확인: docker ps
  2. 실행 중인 컨테이너(예: myaspnetcoreappcontainer)를 중지합니다. docker stop myaspnetcoreappcontainer
  3. 중지된 컨테이너를 삭제합니다. docker rm myaspnetcoreappcontainer

4. 새 컨테이너 실행

새로 빌드된 이미지를 기반으로 컨테이너를 다시 실행합니다.

  1. 아래 명령어를 사용하여 새 컨테이너를 실행합니다.
    • 위 명령은 호스트의 8080 포트를 컨테이너의 8080 포트에 매핑합니다. (컨테이너 내부 애플리케이션이 8080 포트에서 리스닝하고 있는 경우)
    • 만약 애플리케이션이 다른 포트(예: 80)에서 리스닝하도록 설정되어 있다면, 포트 매핑 옵션을 -p 호스트포트:컨테이너포트 형식에 맞게 수정합니다.
  2. docker run -d -p 8080:8080 --name myaspnetcoreappcontainer myaspnetcoreapp
  3. 컨테이너가 정상적으로 시작되었는지 다음 명령어로 확인합니다. docker ps
  4. 브라우저에서 http://localhost:8080 (또는 매핑한 포트)으로 접속하여 변경 사항이 반영되었는지 확인합니다.

5. 개발 편의를 위한 추가 방법

Docker Compose 사용

여러 서비스를 함께 관리하거나, 자주 소스 변경이 발생하는 개발 환경에서는 Docker Compose를 사용하면 편리합니다.
예를 들어, docker-compose.yml 파일을 작성하고 아래와 같이 구성할 수 있습니다.

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8080:8080"

 

 

변경 후에는 다음 명령어로 이미지 재빌드 및 컨테이너 재실행을 할 수 있습니다.

docker-compose up --build

 

 

이 명령어는 소스 코드 수정 후 이미지 재빌드 및 컨테이너 실행을 한 번에 처리해줍니다.

 

실시간 변경 감지 (Hot Reload)

ASP.NET Core 6 이상부터는 dotnet watch 기능을 이용해 소스 변경 시 자동으로 애플리케이션을 재시작할 수 있지만,
Docker 컨테이너 내에서 이를 활용하려면 로컬 소스 코드를 컨테이너에 볼륨 마운트하는 방식으로 구성해야 합니다.
예를 들어, Docker run 시 -v 옵션을 사용하여 소스 코드 디렉토리를 컨테이너 내부에 매핑하면, 코드 변경이 바로 반영될 수 있습니다.

docker run -d -p 8080:8080 -v ${PWD}:/app --name myaspnetcoreappcontainer myaspnetcoreapp

 

 

이 경우, 컨테이너 내부에서 dotnet watch run --urls "http://+:8080" 명령어로 애플리케이션을 실행하면, 코드 변경 시 자동으로 리로드가 가능합니다.


결론

  1. 소스 수정 → 2. Docker 이미지 재빌드 (docker build) → 3. 기존 컨테이너 중지 및 삭제 (docker stop, docker rm) → 4. 새 컨테이너 실행 (docker run)

이와 같이 단계별로 진행하면 ASP.NET Core 8 소스 코드 변경 사항을 Docker 환경에 쉽게 반영할 수 있습니다.
개발 편의를 위해 Docker Compose나 볼륨 마운트를 활용하는 방법도 고려해 보세요.

 

 

 


 

 

다른 직원과 Docker 이미지를 공유하는 방법은 여러 가지가 있습니다. 대표적으로 두 가지 방법을 소개하겠습니다.


방법 1: Docker Hub(또는 기타 원격 레지스트리) 이용

1. Docker Hub 계정 만들기 및 로그인

먼저, Docker Hub에 무료 계정을 생성합니다.
터미널에서 아래 명령어로 Docker Hub에 로그인합니다.

docker login

로그인 후 Docker Hub에 이미지 저장이 가능합니다.

2. 이미지 태그(Tag) 지정하기

현재 로컬에 있는 이미지를 Docker Hub에 업로드하려면 올바른 태그를 지정해야 합니다. 예를 들어, 내 Docker Hub 아이디가 shimpark 이고 이미지 이름을 myaspnetcoreapp-web 으로 사용할 경우, 아래와 같이 태그를 지정합니다.

 

 

 docker tag myaspnetcoreapp-web shimpark/myaspnetcoreapp:latest

3. Docker Hub에 이미지 푸시(Push)

태그가 완료되면 이미지를 Docker Hub에 업로드합니다.

 

docker push shimpark/myaspnetcoreapp:latest

 

푸시가 완료되면 Docker Hub 웹사이트에서 해당 이미지가 올라갔는지 확인할 수 있습니다.

 

 

4. 다른 직원이 이미지 Pull 받아서 컨테이너 실행하기

다른 직원은 Docker Hub에서 이미지를 가져와야 합니다. 터미널에서 아래 명령어를 실행합니다.

docker pull shimpark/myaspnetcoreapp:latest

 

Pull 받은 후, 자신의 로컬에서 컨테이너를 실행합니다.

예를 들어, 포트 매핑이 8080:8080으로 되어 있다면:

docker run -d -p 8080:8080 --name myaspnetcoreapp-container shimpark/myaspnetcoreapp:latest

 

이렇게 하면 동일한 이미지로 컨테이너가 실행되어 애플리케이션이 동일하게 동작합니다.

 


방법 2: Docker Save/Load를 이용한 이미지 파일 공유

1. 이미지 Save 하기

Docker 이미지를 tar 파일로 저장하여 파일로 공유할 수 있습니다.

docker save -o myaspnetcoreapp.tar myaspnetcoreapp

 

이 명령어는 myaspnetcoreapp 이미지를 myaspnetcoreapp.tar 파일로 내보냅니다.

2. tar 파일 전달

생성된 myaspnetcoreapp.tar 파일을 이메일, 파일 공유 서비스, USB 등으로 다른 직원에게 전달합니다.

3. 다른 직원이 이미지 Load 하기

다른 직원은 전달받은 tar 파일을 자신의 Docker 환경에 로드합니다.

docker load -i myaspnetcoreapp.tar

 

로드가 완료되면 로컬 Docker 이미지 목록에 myaspnetcoreapp 이미지가 추가됩니다.

 

4. 컨테이너 실행하기

이미지를 로드한 후, 아래와 같이 컨테이너를 실행할 수 있습니다.

docker run -d -p 8080:8080 --name myaspnetcoreapp-container myaspnetcoreapp

 

이제 동일한 애플리케이션이 컨테이너로 실행됩니다.


결론

  • Docker Hub 방법:
    • 이미지를 태그하고 푸시(push)한 뒤, 다른 직원은 Docker Hub에서 pull 받아 컨테이너 실행
  • Save/Load 방법:
    • 이미지를 tar 파일로 저장(save)하여 파일 공유 후, 다른 직원이 load 받아 컨테이너 실행

두 방법 모두 사용 환경이나 보안 정책에 따라 선택할 수 있으며, 조직 내부 네트워크에서는 Save/Load 방식이 더 편리할 수 있고, 외부와 공유하거나 버전 관리를 하려면 Docker Hub 같은 원격 레지스트리를 이용하는 것이 좋습니다.