푸터 콘텐츠로 바로가기
Iron Academy Logo
C# 애플리케이션
C# 애플리케이션

다른 카테고리

컨테이너 및 Docker Hub에 배포하기 - C# 과정의 샘플 API 빌딩

Tim Corey
23분 51초

.NET Core 애플리케이션을 Docker 컨테이너에 배포하는 것은 현대 개발자에게 필수적인 기술입니다. 컨테이너는 불변의 인프라, 손쉬운 배포, 그리고 경량의 런타임 환경을 제공합니다. 이 심층 가이드에서는 Tim Corey의 종합 비디오 튜토리얼 " 컨테이너 및 Docker Hub에 배포 - C#으로 샘플 API 구축"에 나온 단계를 따라 샘플 API를 Docker 컨테이너에 배포하고 Docker Hub에 푸시하는 과정을 자세히 살펴보겠습니다.

단계별로 과정을 살펴보면서, 쉽게 따라할 수 있도록 특정 시점을 참조하겠습니다. 이 가이드에서는 dotnet publish, docker run 명령과 같은 명령어 사용법과 기본 이미지, 런타임 이미지, 컨테이너 이미지와 같은 용어를 다룹니다. 이 모든 개념은 Docker를 사용하여 .NET 애플리케이션을 배포하는 데 중요합니다.

샘플 API 생성 및 이해

영상 초반에 팀은 웹 개발을 배울 때 샘플 앱이 얼마나 유용한지 강조합니다. 이 앱은 /courses 및 /health와 같은 엔드포인트를 포함하고, 상태 점검 저하와 같은 실제 문제를 시뮬레이션하며, 로컬 컴퓨터와 원격 서버 모두에서 실행되도록 설계되었습니다.

이 앱은 .NET Core 앱(더 정확히는 ASP.NET Core 최소 API)으로, Docker 컨테이너를 통해 쉽게 실행하고 테스트할 수 있습니다.

Docker를 로컬 환경에 설정하기

팀은 Docker Desktop을 사용하여 자신의 로컬 머신에 Docker가 설치되어 있는지 확인합니다. 그는 Docker가 로컬에 설치되어 있지 않아도 Docker Hub에 직접 게시할 수 있지만, 시연을 위해 로컬 배포부터 시작한다고 언급합니다.

그는 미리 설치된 두 개의 Docker 이미지를 보여줍니다.

  • 개인용 자막 도구

  • 마이크로소프트에서 제공하는 공식 ASP.NET Core 기본 이미지: mcr.microsoft.com/dotnet/aspnet

이 기본 이미지는 약 328MB이며 컨테이너 이미지의 기반 역할을 합니다. 마이크로소프트는 이러한 이미지를 MCR(Microsoft Container Registry)에 호스팅하며, 리눅스 컨테이너와 윈도우 컨테이너를 모두 지원합니다. 본 프로젝트의 목표 운영체제는 리눅스입니다.

로컬 컨테이너에 게시하기

Tim은 API 프로젝트 폴더로 이동하여 명령줄에서 다음 명령을 실행합니다.

dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

이 명령은 .NET 8 및 .NET 9에 내장된 컨테이너 지원 기능을 사용하므로 Dockerfile이 필요하지 않습니다. 게시 프로세스는 적합한 런타임 이미지를 선택하고 자체 포함 컨테이너 이미지를 빌드합니다.

내부 작동 방식은 다음과 같습니다.

  • 프로젝트 파일(.csproj)은 API를 빌드하는 데 사용됩니다.

  • 종속성은 dotnet restore 명령을 사용하여 복원됩니다.

출력 결과는 게시 폴더에 저장됩니다.

  • DLL 파일이 생성되어 컨테이너에 포함됩니다.

결과 이미지의 크기는 약 333MB입니다(기본 이미지보다 5MB 정도만 더 큽니다).

Docker를 사용하여 이미지 실행

이미지가 생성되면 Tim은 Docker Desktop을 사용하여 컨테이너를 실행합니다. 내부적으로 앱은 8080번 포트에서 수신 대기합니다. Tim은 포트 구성에 0을 입력하여 해당 포트를 임의의 호스트 포트로 매핑합니다.

컨테이너는 임의의 이름(예: elegant_hoover)으로 시작되며, 브라우저가 열리면 기본 응답으로 "Hello World"가 표시되는 작동하는 API가 나타납니다.

Tim은 /courses와 /health 페이지를 방문하여 API가 정상적으로 작동하는 것을 확인했습니다. 상태 점검 엔드포인트는 실제 운영 환경 시나리오를 시뮬레이션하는 데 유용합니다.

실행 중인 컨테이너를 보려면 CLI에서 docker ps 명령을 사용하면 됩니다. Tim은 정리 과정을 보여주기 위해 실행 중인 컨테이너와 이미지를 삭제합니다.

Docker Hub 저장소 생성

다음으로 Tim은 클라우드 배포 부분으로 넘어갑니다. 그는 Docker Hub 계정에 로그인하여 thesampleapi라는 이름의 공개 저장소를 생성합니다.

Docker 이미지는 여기에 푸시되므로 다른 사용자는 다음 명령어를 사용하여 이미지를 가져올 수 있습니다.

docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest

Docker Hub용 프로젝트 구성

API 프로젝트 파일 내부에서 Tim은 Docker 이미지를 게시할 위치와 방법을 정의하는 메타데이터를 추가합니다. 그는 다음과 같은 코드 블록을 추가합니다.

<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
  • ContainerRegistry: 대상 레지스트리로 Docker Hub를 지정합니다.

  • ContainerRepository: Docker Hub 저장소의 경로입니다.

  • ContainerImageTags: 버전 관리 및 최신 릴리스를 위해 이미지에 태그를 지정합니다.

이는 향후 다단계 빌드 흐름을 위해 이미지를 준비하는 것이지만, 팀은 현재로서는 모든 것을 간단하게 유지하고 있습니다.

Docker Hub에 게시

Tim은 동일한 게시 명령을 다시 실행합니다.

dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

처음에 푸시가 실패한 이유는 그가 .csproj 파일을 저장하는 것을 잊었기 때문입니다. 파일을 저장하고 명령어를 다시 실행하자 이미지가 Docker Hub에 성공적으로 업로드되었습니다.

Docker Hub에서는 thesampleapi 저장소 아래에 latest 및 1.0.0 태그가 모두 표시됩니다. 이러한 태그를 사용하면 특정 버전을 가져올 때 유연성을 확보할 수 있습니다.

Docker Hub에서 이미지 가져오기

Tim은 Docker가 설치된 모든 컴퓨터에서 이미지를 가져오는 방법을 보여줍니다.

docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest

Docker 레이어 캐싱 덕분에 이미지 대부분이 기본 이미지에 이미 존재하므로 이미지 다운로드 속도가 빠릅니다.

이미지를 실행하려면:

docker run -p 0:8080 timcorey/thesampleapi:latest
docker run -p 0:8080 timcorey/thesampleapi:latest

이는 임의의 호스트 포트를 내부 포트 8080에 매핑합니다.

이미지의 새 버전 만들기

버전 관리를 시연하기 위해 Tim은 .csproj 파일을 다음과 같이 수정합니다.

<ContainerImageTags>1.0.1;latest</ContainerImageTags>
<ContainerImageTags>1.0.1;latest</ContainerImageTags>

그는 이어서 게시 명령을 다시 실행합니다.

dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

현재 Docker Hub 저장소에는 세 개의 태그가 표시됩니다.

  • 1.0.0

  • 1.0.1

  • 최신 버전 (현재 1.0.1을 가리키고 있음)

팀은 여러 태그가 있더라도 Docker는 중복된 레이어를 저장하지 않아 레이어를 명확하게 구분함으로써 디스크 사용량을 최적화한다고 설명합니다.

로컬 개발을 위한 Docker 이미지 사용

Tim은 이미지가 Docker Hub에 올라가면 언제든지 어떤 컴퓨터에서든 다음 명령어를 사용하여 실행할 수 있다고 강조합니다.

docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest

다음으로 docker run 명령어를 사용하여 컨테이너를 실행하세요. 사용이 끝나면 다음 명령어로 정리하세요.

docker ps           # Get container ID
docker stop <id>    # Stop the container
docker rm <id>      # Remove the container
docker rmi <image>  # Remove the image
docker ps           # Get container ID
docker stop <id>    # Stop the container
docker rm <id>      # Remove the container
docker rmi <image>  # Remove the image

그는 이러한 특징 덕분에 로컬 시스템에 과부하를 주지 않고 필요에 따라 개발 및 테스트하기에 완벽하다고 설명합니다.

다음 단계는 무엇인가요?

팀은 다음 단계로 동일한 API를 가상 사설 서버(VPS)에 배포하는 것에 대해 언급하며 마무리합니다. 그는 도메인 매핑과 컨테이너를 공개적으로 접근 가능하도록 구성하는 과정을 설명할 것입니다.

결론: 로컬 빌드에서 클라우드 배포까지

팀 코리의 비디오 가이드를 활용하여 다음과 같은 작업을 진행했습니다.

  • dotnet new console 명령어를 사용하여 .NET Core API를 구축했습니다.

  • dotnet restore 및 dotnet publish 명령어를 사용하여 빌드 및 배포했습니다.

  • 샘플 Dockerfile 없이 Docker 컨테이너를 생성했습니다.

  • 컨테이너 이미지를 Docker Hub에 업로드했습니다.

  • docker run 명령어를 사용하여 컨테이너를 다운로드하고 실행했습니다.

  • 태그 관리 및 별도의 이미지 레이어

  • 버전 관리되는 이미지를 사용하여 프로덕션 환경에 맞게 준비되었습니다.

Docker와 .NET 중심으로 하는 이 워크플로는 확장 가능하고 테스트 가능하며 공유 가능한 애플리케이션을 구축하는 데 적합합니다.

Hero Worlddot related to 컨테이너 및 Docker Hub에 배포하기 - C# 과정의 샘플 API 빌딩
Hero Affiliate related to 컨테이너 및 Docker Hub에 배포하기 - C# 과정의 샘플 API 빌딩

사랑하는 것을 공유하여 더 많은 수익을 얻으세요

당신은 .NET, C#, Java, Python, 또는 Node.js를 다루는 개발자를 위한 콘텐츠를 만드나요? 당신의 전문성을 추가 수입으로 전환하세요!

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해