연습 - 사용자 고유의 웹앱을 실행하도록 Docker 이미지 사용자 지정

완료됨

Dockerfile에는 사용자 지정 Docker 이미지를 빌드하는 단계가 포함되어 있습니다.

Docker를 사용하여 조직의 웹 앱 중 하나를 배포하기로 결정합니다. 호텔 예약 웹 사이트의 웹 API를 구현하는 간단한 웹앱을 선택합니다. 웹 API는 고객의 예약을 만들고 검색하는 HTTP POST 및 GET 작업을 공개합니다.

참고

이 버전의 웹앱에서는 예약이 실제로 유지되지 않으며, 쿼리가 더미 데이터를 반환합니다.

이 연습에서는 아직 Dockerfile이 없는 앱에 사용할 Dockerfile을 만들겠습니다. 그런 다음, 이미지를 빌드하여 로컬로 실행하겠습니다.

웹앱에 사용할 Dockerfile 만들기

  1. 아직 실행 중이지 않은 경우 컴퓨터에서 Docker를 시작합니다.

  2. 로컬 컴퓨터의 명령 프롬프트 창에서 다음 명령을 실행하여 웹앱용 소스 코드를 다운로드합니다.

    git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
    
  3. 다음 명령을 입력하여 src 디렉터리를 엽니다.

    cd mslearn-hotel-reservation-system/src
    
  4. src 디렉터리에서 다음 명령을 입력하여 이름이 Dockerfile인 새 파일을 만들고 메모장에서 엽니다.

    copy NUL Dockerfile
    notepad Dockerfile
    

    참고

    기본적으로 메모장 명령은 텍스트 파일을 엽니다. 파일 확장명이 없는 모든 파일 형식 으로 저장해야 합니다. 확인하려면 파일 탐색기에서 src 폴더를 열고 보기 > 표시 > 파일 이름 확장명을 선택합니다. 필요한 경우 파일의 이름을 바꾸고 파일 이름에서 .txt를 제거합니다.

  5. Dockerfile에 다음 코드를 추가합니다.

    FROM mcr.microsoft.com/dotnet/core/sdk:2.2
    WORKDIR /src
    COPY ["/HotelReservationSystem/HotelReservationSystem.csproj", "HotelReservationSystem/"]
    COPY ["/HotelReservationSystemTypes/HotelReservationSystemTypes.csproj", "HotelReservationSystemTypes/"]
    RUN dotnet restore "HotelReservationSystem/HotelReservationSystem.csproj"
    

    이 코드에는 .NET Core Framework SDK가 포함된 이미지를 가져오는 명령이 있습니다. 웹앱의 프로젝트 파일(HotelReservationSystem.csproj)과 라이브러리 프로젝트(HotelReservationSystemTypes.csproj)는 컨테이너의 /src 폴더에 복사됩니다. dotnet restore 명령은 해당 프로젝트에 필요한 종속성을 NuGet에서 다운로드합니다.

  6. Dockerfile의 하단에 다음 코드를 추가합니다.

    COPY . .
    WORKDIR "/src/HotelReservationSystem"
    RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
    

    이러한 명령은 웹앱용 소스 코드를 컨테이너에 복사한 다음 dotnet 빌드 명령을 실행하여 앱을 빌드합니다. 결과 DLL은 컨테이너의 /app 폴더에 기록됩니다.

  7. Dockerfile의 하단에 다음 명령을 추가합니다.

    RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
    

    dotnet publish 명령은 웹 사이트의 실행 파일을 새 폴더로 복사하고 모든 중간 파일을 제거합니다. 그런 다음 이 폴더의 파일을 웹 사이트에 배포할 수 있습니다.

  8. Dockerfile의 맨 아래에 다음 명령을 추가합니다.

    EXPOSE 80
    WORKDIR /app
    ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
    

    첫 번째 명령은 컨테이너의 포트 80을 엽니다. 두 번째 명령은 게시된 웹앱 버전이 들어 있는 /app 폴더로 이동합니다. 마지막 명령은 컨테이너가 실행될 때 dotnet HotelReservationSystem.dll 명령을 실행해야 한다고 지정합니다. 이 라이브러리에는 웹앱에 대해 컴파일된 코드가 포함되어 있습니다.

  9. 파일을 저장하고 텍스트 편집기를 닫습니다. 파일 확장명이 없는 모든 파일 형식 으로 저장해야 합니다.

Dockerfile을 사용하여 이미지 빌드 및 배포

  1. 명령 프롬프트에서 다음 명령을 실행하여 Dockerfile을 사용하는 샘플 앱의 이미지를 빌드합니다. 명령 끝에 .를 반드시 입력하세요. 이 명령은 이미지를 빌드하여 로컬로 저장합니다. 이미지 이름은 reservationsystem으로 지정됩니다. 이미지가 성공적으로 빌드되었는지 확인합니다. 프로세스가 완료되면 파일 및 디렉터리 권한에 대한 경고가 표시됩니다. 이 연습에서는 이러한 경고를 무시해도 됩니다. 이미지를 빌드하는 데 잠시 시간이 걸릴 수 있습니다.

    docker build -t reservationsystem .
    
  2. 다음 명령을 실행하여 이미지가 생성되어 로컬 레지스트리에 저장되었는지 확인합니다.

    docker image list
    

    이미지의 이름은 reservationsystem으로 지정됩니다. microsoft/dotnet이라는 이미지도 있습니다.

    REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
    reservationsystem   latest              d2501f0f2ced        About a minute ago   1.76GB
    

웹앱 테스트

  1. 다음 코드를 입력하여 reservationsystem 이미지로 컨테이너를 실행합니다. Docker는 긴 16진수 문자열을 반환합니다. 컨테이너는 UI 없이 백그라운드에서 실행됩니다. 컨테이너의 포트 80은 호스트 머신의 포트 8080에 매핑됩니다. 컨테이너 이름은 reservations로 지정됩니다.

    docker run -p 8080:80 -d --name reservations reservationsystem
    
  2. 웹 브라우저를 시작하고 http://localhost:8080/api/reservations/1로 이동합니다. 예약 번호 1에 대한 데이터를 포함하는 JSON 개체가 다음 출력과 유사하게 표시됩니다.

    Screenshot of the hotel reservations system web app running in a browser.

    Localhost URL의 끝에 있는 "1"을 다른 예약 번호(예: 2 또는 20)로 바꿔서 해당 예약 세부 정보를 확인합니다.

  3. 다음 명령을 실행하여 컨테이너의 상태를 확인합니다.

    docker ps -a
    

    출력은 모든 사용 가능한 컨테이너에 대해 다음을 나열합니다.

    • 컨테이너 ID
    • 이미지
    • 명령
    • 만든 시간
    • 상태
    • 포트
    • NAMES

    컨테이너의 STATUSUp인지 확인합니다.

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    07b0d1de4db7        reservationsystem   "dotnet HotelReserva…"   5 minutes ago       Up 5 minutes        0.0.0.0:8080->80/tcp   reservations
    
  4. 다음 명령을 입력하여 reservations 컨테이너를 중지합니다.

    docker container stop reservations
    
  5. 로컬 레지스트리에서 reservations 컨테이너를 삭제합니다.

    docker rm reservations
    
  6. reservationsystem은 로컬 레지스트리에 그대로 둡니다. 이 이미지는 다음 연습에서 사용됩니다.

축하합니다! 웹 앱용 이미지를 만들고 Docker 컨테이너를 사용하여 실행했습니다.