연습 - .NET 마이크로 서비스에 대한 컨테이너 이미지 빌드
이 연습에서는 .NET SDK 및 Docker를 사용하여 마이크로 서비스 엔드포인트를 만들고 컨테이너화합니다.
참고 항목
Docker 및 .NET SDK가 사전 설치된 GitHub Codespaces 인스턴스에서 이 연습을 완료할 수 있습니다. 자체 개발 환경에서 이러한 도구와 기술을 사용하는 경우 이러한 필수 구성 요소가 설치되어 있는지 확인합니다.
개발 환경 열기
연습을 호스팅하는 GitHub 코드 공간을 사용하거나 Visual Studio Code에서 로컬로 연습을 완료하도록 선택할 수 있습니다.
codespace를 사용하려면 이 Codespace 만들기 링크를 사용하여 사전 구성된 GitHub Codespace를 만듭니다.
GitHub는 코드 공간을 만들고 구성하는 데 몇 분 정도 걸립니다. 프로세스가 완료되면 연습용 코드 파일이 표시됩니다. 이 모듈의 나머지 부분에 사용되는 코드는 /dotnet-docker 디렉터리에 있습니다.
Visual Studio Code를 사용하려면 https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative 리포지토리를 로컬 컴퓨터에 복제합니다. 다음 작업:
- Visual Studio Code에서 Dev Container를 실행하려면 시스템 요구 사항을 설치합니다.
- Docker가 실행 중인지 확인합니다.
- 새 Visual Studio Code 창에서 복제된 리포지토리의 폴더를 엽니다.
- 명령 팔레트를 열려면 Ctrl+Shift+P를 누릅니다.
- 검색: >개발 컨테이너: 다시 빌드 및 컨테이너에서 다시 열기
- 드롭다운에서 eShopLite - dotnet-docker를 선택합니다. Visual Studio Code는 개발 컨테이너를 로컬로 만듭니다.
.NET 게시를 사용하여 제품 백 엔드 이미지 만들기
최신 .NET 8 릴리스는 컨테이너화에 대한 지원을 향상시킵니다. dotnet publish
명령을 사용하여 마이크로 서비스에 대한 Docker 이미지를 만들 수 있습니다. 이 명령은 app
계정으로 서비스를 실행하는 루트 없는 컨테이너 이미지를 만듭니다. 루트 없는 컨테이너를 실행하는 것은 보안 및 성능에 적합합니다. 이 명령은 프로젝트 파일의 설정을 확인하여 최상의 기본 이미지를 선택하는 방법을 알고 있습니다.
모든 eShopLite 서비스에 대한 이미지를 만들려면 터미널 탭으로 이동하여 다음 명령을 실행합니다.
cd ./dotnet-docker dotnet publish /p:PublishProfile=DefaultContainer
다음 메시지와 같은 출력이 표시됩니다.
DataEntities -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/DataEntities/bin/Release/net8.0/publish/ Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/Products.dll Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/publish/ Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/Store.dll Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/publish/ Building image 'store' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'. Building image 'products' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'. Pushed image 'store:latest' to local registry via 'docker'. Pushed image 'products:latest' to local registry via 'docker'.
이 명령은 솔루션 파일을 읽고, 3개의 프로젝트가 포함되어 있다고 판단하고, 빌드하고, 저장소 및 제품 프로젝트에 대한 이미지를 만들었습니다. 이미지는 프로젝트의 이름을 따서 명명되고 로컬 Docker 레지스트리에 게시됩니다.
Docker에서 이미지를 사용할 수 있는지 확인합니다.
docker images
다음 메시지와 같은 출력이 표시됩니다.
REPOSITORY TAG IMAGE ID CREATED SIZE products latest 63614e340088 About a minute ago 293MB store latest e9458c3abdb1 About a minute ago 218MB
Dockerfile을 사용하여 제품 백 엔드 이미지 만들기
이미지를 빌드하는 방법을 더 자세히 제어하려면 Dockerfile을 사용하여 Products 웹 서비스에 대한 이미지를 만들 수 있습니다.
탐색기 창에서 ./dotnet-docker/Products에 Dockerfile이라는 파일을 만듭니다. 파일이 비어 있습니다.
다음 코드를 입력합니다.
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /DataEntities COPY "DataEntities/DataEntities.csproj" . RUN dotnet restore COPY "DataEntities" . RUN dotnet publish -c release -o /app
다음 단계를 완료한 후 이 코드는 Products Docker 이미지에서 DataEntities 라이브러리를 설정합니다.
mcr.microsoft.com/dotnet/sdk:8.0
이미지를 풀(pull)하고 이미지 이름을build
로 지정합니다.- 이미지 내 작업 디렉터리를
/DataEntities
으로 설정합니다. - 로컬에서 찾은 DataEntities.csproj라는 파일을 만든
/DataEntities
디렉터리에 복사합니다. - 프로젝트에서
dotnet restore
를 호출합니다. - 로컬 DataEntities 디렉터리의 모든 항목을 이미지에 복사합니다.
- 프로젝트에서
dotnet publish
를 호출합니다.
마지막 줄 바로 아래에 다음 코드를 입력합니다.
WORKDIR /src COPY Products/Products.csproj . RUN dotnet restore COPY Products . RUN dotnet publish -c release -o /app
이 코드는 호출 시 다음 단계를 순차적으로 수행합니다.
- 이미지 내 작업 디렉터리를
/src
으로 설정합니다. - 로컬에서 찾은 Products.csproj라는 파일을 만든
/src
디렉터리에 복사합니다. - 프로젝트에서
dotnet restore
를 호출합니다. - 로컬 Products 디렉터리의 모든 항목을 이미지에 복사합니다.
- 프로젝트에서
dotnet publish
를 호출합니다.
- 이미지 내 작업 디렉터리를
마지막 줄 바로 아래에 다음 코드를 입력합니다.
FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app EXPOSE 80 EXPOSE 443 COPY --from=build /app . ENTRYPOINT ["dotnet", "Products.dll"]
이 코드는 호출 시 다음 단계를 순차적으로 수행합니다.
mcr.microsoft.com/dotnet/aspnet:8.0
이미지를 풀합니다.- 이미지 내 작업 디렉터리를
/app
으로 설정합니다. - 포트 80 및 443을 공개합니다.
- 만든 build 이미지의 app 디렉터리에서 모든 항목을 이 이미지의 app 디렉터리에 복사합니다.
- 이 이미지의 진입점을
dotnet
로 설정하고Products.dll
을 인수로 전달합니다.
Docker 이미지를 만듭니다.
Dockerfile을 완료한 후 다음 단계는 이를 사용하여 Docker 이미지를 만드는 것입니다.
제품 백 엔드 서비스에 대한 이미지를 만들려면 터미널 탭으로 이동하여 다음 명령을 실행합니다.
cd ./dotnet-docker docker build -t productsbackend:latest -f Products/Dockerfile .
현재 디렉터리에서 Dockerfile 명령을 실행하고 productsbackend:latest태그를 결과 이미지에 적용합니다.
많은 출력이 생성된 후 이미지가 빌드됩니다.
docker images
를 입력하면 productsbackend를 포함한 codespace의 모든 이미지 목록이 표시됩니다. 다른 이미지는 codespace 자체에 대한 이미지입니다.다음 메시지와 같은 출력이 표시됩니다.
REPOSITORY TAG IMAGE ID CREATED SIZE products latest 63614e340088 10 minutes ago 293MB store latest e9458c3abdb1 10 minutes ago 218MB productsbackend latest 190783f7e06f About a minute ago 293MB
dotnet publish
을 사용하는 것과 앱의 각 마이크로 서비스에 대한 Dockerfile을 수동으로 만들어야 하는 것의 차이점을 생각해 보세요.
컨테이너 실행 및 서비스 테스트
이제 이미지를 사용하여 Products 서비스를 실행하고 호스트할 수 있습니다.
새 products 이미지에서 컨테이너를 만들어 실행하고 포트 32001에서 서비스를 노출하려면 다음 명령을 실행합니다.
docker run -it --rm -p 32001:8080 products
또는 Dockerfile을 사용하여 만든 이미지를 실행하려면 다음을 실행합니다.
docker run -it --rm -p 32001:8080 productsbackend
서비스를 테스트하려면 포트 탭으로 전환한 다음 백 엔드 포트의 로컬 주소 오른쪽에 있는 지구본 아이콘을 선택합니다. 브라우저에서 해당 주소로 새 탭이 열립니다.
일부 제품을 쿼리하려면 /api/product와 함께 주소를 추가한 다음 Enter 키를 누릅니다. JSON 형식으로 나열된 일부 제품 정보가 표시됩니다.
[ { "id": 1, "name": "Solar Powered Flashlight", "description": "A fantastic product for outdoor enthusiasts", "price": 19.99, "imageUrl": "product1.png" }, { "id": 2, "name": "Hiking Poles", "description": "Ideal for camping and hiking trips", "price": 24.99, "imageUrl": "product2.png" }, { "id": 3, "name": "Outdoor Rain Jacket", "description": "This product will keep you warm and dry in all weathers", "price": 49.99, "imageUrl": "product3.png" }, ... ]