ASP.NET MVC 애플리케이션을 Windows 컨테이너로 마이그레이션Migrating ASP.NET MVC Applications to Windows Containers

Windows 컨테이너에서 기존 .NET Framework 기반 애플리케이션을 실행하려면 앱을 변경할 필요가 없습니다.Running an existing .NET Framework-based application in a Windows container doesn't require any changes to your app. Windows 컨테이너에서 앱을 실행하려면 앱을 포함하는 Docker 이미지를 만들고 컨테이너를 시작합니다.To run your app in a Windows container you create a Docker image containing your app and start the container. 이 항목에서는 기존 ASP.NET MVC 애플리케이션을 가져오고 Windows 컨테이너에 배포하는 방법을 설명합니다.This topic explains how to take an existing ASP.NET MVC application and deploy it in a Windows container.

기존 ASP.NET MVC 앱으로 시작한 다음 Visual Studio를 사용하여 게시된 자산을 빌드합니다.You start with an existing ASP.NET MVC app, then build the published assets using Visual Studio. Docker를 사용하여 앱을 포함하고 실행하는 이미지를 만듭니다.You use Docker to create the image that contains and runs your app. Windows 컨테이너에서 실행 중인 사이트로 이동하고 앱이 작동하는지 확인합니다.You'll browse to the site running in a Windows container and verify the app is working.

이 문서에서는 Docker에 대한 기본적으로 이해하고 있다고 가정합니다.This article assumes a basic understanding of Docker. Docker 개요를 참고하여 Docker에 대해 알아볼 수 있습니다.You can learn about Docker by reading the Docker Overview.

컨테이너에서 실행할 앱은 임의로 질문에 대답하는 간단한 웹 사이트입니다.The app you'll run in a container is a simple website that answers questions randomly. 이 앱은 인증이나 데이터베이스 스토리지가 없는 기본 MVC 애플리케이션으로, 웹 계층을 컨테이너로 이동하는 데 집중할 수 있게 합니다.This app is a basic MVC application with no authentication or database storage; it lets you focus on moving the web tier to a container. 이후 항목에서는 컨테이너화된 애플리케이션에서 영구 스토리지를 이동 및 관리하는 방법을 보여줍니다.Future topics will show how to move and manage persistent storage in containerized applications.

애플리케이션 이동 과정은 다음 단계로 이루어집니다.Moving your application involves these steps:

  1. 이미지에 대한 자산을 빌드하는 게시 태스크 만들기Creating a publish task to build the assets for an image.
  2. 애플리케이션을 실행할 Docker 이미지 빌드Building a Docker image that will run your application.
  3. 이미지를 실행하는 Docker 컨테이너 시작Starting a Docker container that runs your image.
  4. 브라우저를 사용하여 애플리케이션 확인Verifying the application using your browser.

완료된 애플리케이션은 GitHub에 있습니다.The finished application is on GitHub.

사전 요구 사항Prerequisites

개발 컴퓨터에는 다음 소프트웨어가 있어야 합니다.The development machine must have the following software:

Important

Windows Server 2016을 사용하는 경우 컨테이너 호스트 배포 - Windows Server에 대한 지침을 따르세요.If you are using Windows Server 2016, follow the instructions for Container Host Deployment - Windows Server.

Docker를 설치하고 시작한 후에 트레이 아이콘을 마우스 오른쪽 단추로 클릭하고 Windows 컨테이너로 전환을 선택합니다.After installing and starting Docker, right-click on the tray icon and select Switch to Windows containers. 그러려면 Windows를 기반으로 하는 Docker 이미지를 실행해야 합니다.This is required to run Docker images based on Windows. 이 명령을 실행하는 데 몇 초 정도 걸립니다.This command takes a few seconds to execute:

Windows 컨테이너Windows Container

게시 스크립트Publish script

동일한 위치에서 Docker 이미지에 로드해야 하는 모든 자산을 수집합니다.Collect all the assets that you need to load into a Docker image in one place. Visual Studio 게시 명령을 사용하여 앱에 대한 게시 프로필을 만들 수 있습니다.You can use the Visual Studio Publish command to create a publish profile for your app. 이 프로필은 이 자습서의 뒷부분에서 대상 이미지에 복사할 모든 자산을 디렉터리 트리 하나에 배치합니다.This profile will put all the assets in one directory tree that you copy to your target image later in this tutorial.

게시 단계Publish Steps

  1. Visual Studio에서 웹 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.Right click on the web project in Visual Studio, and select Publish.
  2. 사용자 지정 프로필 단추를 클릭 한 다음 파일 시스템 을 방법으로 선택 합니다.Click the Custom profile button, and then select File System as the method.
  3. 디렉터리를 선택합니다.Choose the directory. 규칙에 따라 다운로드한 샘플은 bin\Release\PublishOutput을 사용합니다.By convention, the downloaded sample uses bin\Release\PublishOutput.

게시 연결Publish Connection

설정 탭의 파일 게시 옵션 섹션을 엽니다. 게시 중 미리 컴파일을 선택 합니다.Open the File Publish Options section of the Settings tab. Select Precompile during publishing. 이 최적화는 Docker 컨테이너의 뷰를 컴파일하며 미리 컴파일된 뷰를 복사함을 의미합니다.This optimization means that you'll be compiling views in the Docker container, you are copying the precompiled views.

게시 설정Publish Settings

게시를 클릭하면 Visual Studio에서 필요한 모든 자산을 대상 폴더에 복사합니다.Click Publish, and Visual Studio will copy all the needed assets to the destination folder.

이미지 빌드Build the image

Docker 이미지를 정의 하는 Dockerfile 이라는 새 파일을 만듭니다.Create a new file named Dockerfile to define your Docker image. Dockerfile 에는 최종 이미지를 작성 하는 지침이 포함 되어 있으며 기본 이미지 이름, 필수 구성 요소, 실행 하려는 앱 및 기타 구성 이미지가 포함 되어 있습니다.Dockerfile contains instructions to build the final image and includes any base image names, required components, the app you want to run, and other configuration images. Dockerfiledocker build 이미지를 만드는 명령에 대 한 입력입니다.Dockerfile is the input to the docker build command that creates the image.

이 연습에서는 microsoft/aspnet Docker 허브에 있는 이미지를 기반으로 이미지를 빌드합니다.For this exercise, you will build an image based on the microsoft/aspnet image located on Docker Hub. 기본 이미지인 microsoft/aspnet은 Windows Server 이미지입니다.The base image, microsoft/aspnet, is a Windows Server image. 여기에는 Windows Server Core, IIS 및 ASP.NET 4.7.2가 포함 됩니다.It contains Windows Server Core, IIS, and ASP.NET 4.7.2. 컨테이너에서 이 이미지를 실행하면 IIS 및 설치된 웹 사이트가 자동으로 시작됩니다.When you run this image in your container, it will automatically start IIS and installed websites.

이미지를 만드는 Dockerfile은 다음과 같이 표시됩니다.The Dockerfile that creates your image looks like this:

# The `FROM` instruction specifies the base image. You are
# extending the `microsoft/aspnet` image.

FROM microsoft/aspnet

# The final instruction copies the site you published earlier into the container.
COPY ./bin/Release/PublishOutput/ /inetpub/wwwroot

이 Dockerfile에는 ENTRYPOINT 명령이 없습니다.There is no ENTRYPOINT command in this Dockerfile. 해당 명령이 필요하지 않습니다.You don't need one. IIS를 사용 하 여 Windows Server를 실행 하는 경우 IIS 프로세스는 aspnet 기본 이미지에서 시작 하도록 구성 된 entrypoint입니다.When running Windows Server with IIS, the IIS process is the entrypoint, which is configured to start in the aspnet base image.

Docker 빌드 명령을 실행하여 ASP.NET 앱을 실행하는 이미지를 만듭니다.Run the Docker build command to create the image that runs your ASP.NET app. 이렇게 하려면 프로젝트의 디렉터리에서 PowerShell 창을 열고 솔루션 디렉터리에 다음 명령을 입력 합니다.To do this, open a PowerShell window in the directory of your project and type the following command in the solution directory:

docker build -t mvcrandomanswers .

이 명령은 Dockerfile의 지침을 사용 하 여 이미지를 mvcrandomanswers로 명명 (-t 태깅) 하는 새 이미지를 빌드합니다.This command will build the new image using the instructions in your Dockerfile, naming (-t tagging) the image as mvcrandomanswers. 이 과정에 Docker Hub에서 기본 이미지를 끌어온 다음 해당 이미지에 앱이 추가될 수 있습니다.This may include pulling the base image from Docker Hub, and then adding your app to that image.

명령이 완료되면 docker images 명령을 실행하여 새 이미지에 대한 정보를 확인할 수 있습니다.Once that command completes, you can run the docker images command to see information on the new image:

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
mvcrandomanswers              latest              86838648aab6        2 minutes ago       10.1 GB

사용자 컴퓨터의 이미지 ID는 다릅니다.The IMAGE ID will be different on your machine. 이제 앱을 실행해 보겠습니다.Now, let's run the app.

컨테이너 시작Start a container

다음 docker run 명령을 실행하여 컨테이너를 시작합니다.Start a container by executing the following docker run command:

docker run -d --name randomanswers mvcrandomanswers

-d 인수는 분리된 모드로 이미지를 시작하도록 Docker에 지정합니다.The -d argument tells Docker to start the image in detached mode. 즉, Docker 이미지가 현재 셸에서 연결이 끊긴 상태로 실행됩니다.That means the Docker image runs disconnected from the current shell.

대부분의 docker 예제에서 컨테이너와 호스트 포트를 매핑하기 위해-p가 표시 될 수 있습니다.In many docker examples, you may see -p to map the container and host ports. 기본 aspnet 이미지는 포트 80에서 수신 대기 하 고 노출 하도록 컨테이너를 이미 구성 했습니다.The default aspnet image has already configured the container to listen on port 80 and expose it.

--name randomanswers는 실행 중인 컨테이너에 이름을 제공합니다.The --name randomanswers gives a name to the running container. 대부분의 명령에서 컨테이너 ID 대신 이 이름을 사용할 수 있습니다.You can use this name instead of the container ID in most commands.

mvcrandomanswers는 시작할 이미지의 이름입니다.The mvcrandomanswers is the name of the image to start.

브라우저에서 확인Verify in the browser

컨테이너가 시작 되 면 표시 된 예제에서를 사용 하 여 실행 중인 컨테이너에 연결 http://localhost 합니다.Once the container starts, connect to the running container using http://localhost in the example shown. 해당 URL을 브라우저에 입력하면 실행 중인 사이트가 표시됩니다.Type that URL into your browser, and you should see the running site.

Note

일부 VPN 또는 프록시 소프트웨어가 사이트로 이동하지 못하도록 차단할 수도 있습니다.Some VPN or proxy software may prevent you from navigating to your site. 일시적으로 사용하지 않도록 설정하여 컨테이너가 작동하는지 확인할 수 있습니다.You can temporarily disable it to make sure your container is working.

GitHub의 샘플 디렉터리에는 이러한 명령을 자동으로 실행하는 PowerShell 스크립트가 들어 있습니다.The sample directory on GitHub contains a PowerShell script that executes these commands for you. PowerShell 창을 열고 디렉터리를 솔루션 디렉터리로 변경한 후 다음을 입력합니다.Open a PowerShell window, change directory to your solution directory, and type:

./run.ps1

위의 명령은 이미지를 빌드하고 컴퓨터에 있는 이미지 목록을 표시 하며 컨테이너를 시작 합니다.The command above builds the image, displays the list of images on your machine, and starts a container.

컨테이너를 중지하려면 docker stop 명령을 실행합니다.To stop your container, issue a docker stop command:

docker stop randomanswers

컨테이너를 제거하려면 docker rm 명령을 실행합니다.To remove the container, issue a docker rm command:

docker rm randomanswers