터미널에서 프로젝트를 생성할 디렉토리로 이동한 후, 아래 명령어를 실행하여 .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 런타임 이미지로 복사하여 컨테이너가 애플리케이션을 실행할 수 있도록 합니다.
빌드 프로세스는 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. 소스 코드 수정
로컬 개발 환경(예: Visual Studio, VS Code 등)에서 ASP.NET Core 8 애플리케이션의 소스 코드를 수정합니다.
변경 사항이 저장되었는지 확인합니다.
2. Docker 이미지 재빌드
Docker는 컨테이너 실행 시 이미지 기반으로 동작하기 때문에, 소스 코드를 수정했다면 변경 내용을 포함하는 새 이미지를 빌드해야 합니다.
터미널 또는 명령 프롬프트에서 Dockerfile이 있는 프로젝트 루트 디렉토리로 이동합니다.
아래 명령어를 실행하여 이미지를 재빌드합니다.
-t myaspnetcoreapp 옵션은 새로 빌드되는 이미지에 태그를 부여합니다.
빌드 과정에서 Dockerfile에 명시된 multi-stage 빌드를 수행하여 소스 코드 변경사항이 반영된 새로운 이미지를 생성합니다.
docker build -t myaspnetcoreapp .
3. 기존 컨테이너 중지 및 삭제
새로운 이미지를 기반으로 컨테이너를 실행하기 전에, 이전에 실행 중인 컨테이너가 있다면 이를 중지하고 삭제해야 합니다.
현재 실행 중인 컨테이너 확인: docker ps
실행 중인 컨테이너(예: myaspnetcoreappcontainer)를 중지합니다. docker stop myaspnetcoreappcontainer
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" 명령어로 애플리케이션을 실행하면, 코드 변경 시 자동으로 리로드가 가능합니다.
결론
소스 수정 → 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 같은 원격 레지스트리를 이용하는 것이 좋습니다.