클라우드가 대세다.

Microsoft 플랫폼에서도 클라우드가 점점 대세가 되어 가고 있다.

Microsoft 플랫폼 클라우드는 AKS(Azure Kubernetes Services)라는 이름으로 Azure 서비스 중의 하나로 존재하는데  내부 기반 기술은 역시 Docker/Container이다. 즉, Docker용 컨테이너를 만들면 자연스럽게 AKS에 배포할 수 있는 준비가 완료된다는 뜻이다.

현재 시점(2020.04.09) 기준으로 최신 Docker용 컨테이너 앱 빌드를 위한 Visual Studio 환경은 2019 버전 기준이다. (.NET Core SDK 버전 기준으로는 3.1)

즉, Visual Studio 2019를 사용해야 최신 Docker용 컨테이너 앱을 만들어서 배포할 수 있다.

물론, MCR(Microsoft Container Registry)가 하위 호환성을 유지하기 때문에 SDK 2.2버전 또는 2.1버전 이미지를 다운받으면 해당 버전 앱을 만들어서 배포할 수는 있다. 즉, Visual Studio 2017을 사용해도 되긴 된다는 말씀.

그런데, Microsoft 공식 문서 사이트 및 github에 등록되어 있는 샘플 프로젝트가 3.1 최신버전 기준으로 만들어져 있기 때문에 하위 버전으로 받아서 빌드하려고 하면 에러가 와장창 나온다. SDK 버전에 따라 기본 문법 및 참조 라이브러리들이 대거 바뀌었기 때문.

얼마나 변경되었는지는 아래 링크를 참조하면 된다.

>> 참조1: https://docs.microsoft.com/ko-kr/aspnet/core/migration/20_21?view=aspnetcore-2.1

 

ASP.NET Core 2.0에서 2.1로 마이그레이션

이 문서에서는 ASP.NET Core 2.0 앱을 2.1로 마이그레이션하는 기본 사항을 설명 합니다.

docs.microsoft.com

>> 참조2: https://docs.microsoft.com/ko-kr/aspnet/core/migration/22-to-30?view=aspnetcore-3.1&tabs=visual-studio

 

ASP.NET 코어 2.2에서 3.0으로 마이그레이션

ASP.NET 코어 2.2 프로젝트를 ASP.NET 코어 3.0으로 마이그레이션하는 방법을 알아봅니다.

docs.microsoft.com

즉, 최신 3.1 버전 샘플 코드를 받아서 2.1 환경에서 빌드 및 실행되도록 하려면 위 링크들을 참조해서 역순 변환 과정을 거쳐야 한다. (이렇게 하느니 Visual Studio 2017에서 샘플 프로젝트를 만들어서 수정하는 것이 오히려 나을 수도 있다...)

아무튼, ASP.NET Core 프로젝트를 잘 만들었다 치고.

그 다음에는 .NET Core 및 ASP.NET Core 앱을 만들어서 Docker 컨테이너로 만들어 배포하는 절차를 아래 문서를 보고 따라 해 보면 금방 Docker에 대한 개념 이해 및 샘플 실행까지는 무난하게 할 수 있게 된다.

>> 참조3: https://docs.microsoft.com/ko-kr/dotnet/core/docker/build-container

 

Docker를 사용하여 앱 컨테이너화 자습서 - .NET Core

이 자습서에서는 Docker를 사용하여 .NET Core 애플리케이션을 컨테이너화하는 방법을 알아봅니다.

docs.microsoft.com

>> 참조4: https://docs.microsoft.com/ko-kr/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-3.1

 

ASP.NET Core의 Docker 이미지

Docker 레지스트리에서 게시된 .NET Core Docker 이미지를 사용하는 방법을 알아봅니다. 이미지를 끌어오고 고유한 이미지를 빌드합니다.

docs.microsoft.com

그런데, 위 과정에서 역시 github에서 받은 aspnetcore 샘플 프로젝트를 위와 같이 역순 변환 과정을 거치면 Visual Studio 2017 환경(.NET Core SDK 2.1)에서 빌드가 잘 되고, Linux용 Docker로 배포까지도 잘 되는데...

문제는, Windows용 Docker로 전환해서 다시 빌드 및 실행하려고 하면 오류가 발생한다.

D:\Project\GitHub\dotnet-docker\samples\aspnetapp>docker build -t aspnetapp .
Sending build context to Docker daemon  6.854MB
Step 1/12 : FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build
2.1: Pulling from dotnet/core/sdk
no matching manifest for windows/amd64 10.0.17134 in the manifest list entries

이런 오류가...

이 문제는 내가 사용하고 있는 Windows 10 버전(1803 - 10.0.17134)에 맞는 SDK 이미지가 없다는 것인데, 특이하게도 Windows용 Docker인 경우에는 현재 OS의 버전을 심각할 정도로 가린다. 대충 돌아가게 해줘도 될 것을... ㄷㄷ

이것을 바로 잡으려면 샘플 프로젝트에 기본 제공된 Dockerfile을 수정해야 한다. (난 Dockerfile.nanoserver-x64를 수정해서 Dockerfile.nanoserver-x64-1803 파일을 만들었다.)

https://hub.docker.com/_/microsoft-dotnet-core
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore -r win-x64

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app -r win-x64 --self-contained false --no-restore

# final stage/image
# Uses the 1909 release; 1903, and 1809 are other choices
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1909 AS runtime
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["aspnetapp"]

일단 이 내용을,

https://hub.docker.com/_/microsoft-dotnet-core
FROM mcr.microsoft.com/dotnet/core/sdk:2.1-nanoserver-1803 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore -r win-x64

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app -r win-x64 --self-contained false --no-restore

# final stage/image
# Uses the 1909 release; 1903, and 1809 are other choices
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-nanoserver-1803 AS runtime
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["aspnetapp"]

이렇게 수정하고 빌드 시 옵션으로 위 수정 생성한 Dockerfile을 지정해 준다.

D:\Project\GitHub\dotnet-docker\samples\aspnetapp>docker build --pull -t aspnetapp -f Dockerfile.nanoserver-x64-1803 . 
Sending build context to Docker daemon  4.397MB
Step 1/12 : FROM mcr.microsoft.com/dotnet/core/sdk:2.1-nanoserver-1803 AS build
2.1-nanoserver-1803: Pulling from dotnet/core/sdk
Digest: sha256:97a386c69d480fdf6b7034995e85d3dde39ab5313afcb709f45d543176575438
... 
Successfully built 7c93bee5c191
Successfully tagged aspnetapp:latest

그러면 위와 같이 12단계쯤 거쳐서 정상 빌드가 완료된다.

문제는, 이렇게 빌드 성공한 앱을 run 명령으로 배포 후 즉시 실행하려고 하면,

D:\Project\GitHub\dotnet-docker\samples\aspnetapp>docker run -it --rm --name aspnetcore_sample aspnetapp 
docker: Error response from daemon: container e4c61827923bc6993987d41143cba3f01a5055bd095a1ddeb5699af64ee1cf39 encountered an error during hcsshim::System::CreateProcess: failure in a Windows system call: The system cannot find the file specified. (0x2) 
[Event Detail:  Provider: 00000000-0000-0000-0000-000000000000] 
[Event Detail:  Provider: 00000000-0000-0000-0000-000000000000] 
[Event Detail: onecore\vm\compute\management\orchestration\vmhostedcontainer\processmanagement.cpp(174)\vmcomputeagent.exe!00007FF79E6AC00A: (caller: 00007FF79E67ECEA) Exception(54) tid(378) 80070002 The system cannot find the file specified. 
    CallContext:[\Bridge_ProcessMessage\ComputeSystemManager_ExecuteProcess\VmHostedContainer_ExecuteProcess] 
 Provider: 00000000-0000-0000-0000-000000000000] extra info: {"CommandLine":"aspnetapp","User":"ContainerUser","WorkingDirectory":"C:\\app","Environment":{"ASPNETCORE_URLS":"http://+:80","DOTNET_RUNNING_IN_CONTAINER":"true","DOTNET_RUNNING_IN_CONTAINERS":"true"},"EmulateConsole":true,"CreateStdInPipe":true,"CreateStdOutPipe":true,"ConsoleSize":[30,120]}.

이렇게 또 오류가 발생한다. Docker는 기본적으로 Hyper-V를 이용한 가상환경을 이용하는데, 설치(배포)까지는 잘 되었지만 뭔가 실행하기 위한 환경 설정에 문제가 있는 것 같다.

다시 Dockerfile로 돌아가서 보니, 수정해야 할 곳이 하나 더 보인다.

https://hub.docker.com/_/microsoft-dotnet-core 
FROM mcr.microsoft.com/dotnet/core/sdk:2.1-nanoserver-1803 AS build 
WORKDIR /source 

# copy csproj and restore as distinct layers 
COPY *.sln . 
COPY aspnetapp/*.csproj ./aspnetapp/ 
RUN dotnet restore -r win-x64 

# copy everything else and build app 
COPY aspnetapp/. ./aspnetapp/ 
WORKDIR /source/aspnetapp 
RUN dotnet publish -c release -o /app -r win-x64 --self-contained false --no-restore 

# final stage/image 
# Uses the 1909 release; 1903, and 1809 are other choices 
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-nanoserver-1803 AS runtime 
WORKDIR /app 
COPY --from=build /app ./ 
ENTRYPOINT ["dotnet", "aspnetapp.dll"] 

바로 맨 아랫줄 이 부분. "aspnetapp"라고만 실행하면 당근 될 리가 없지. 샘플, 대체 너 뭐야?

수정한 뒤 다시 실행하면, Windows용 Docker에서도 정상 실행된다.

D:\Project\GitHub\dotnet-docker\samples\aspnetapp>docker run -it --rm --name aspnetcore_sample aspnetapp 
(clear)
Hosting environment: Production
Content root path: C:\app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

이렇게.

실행화면은 아래와 같다.

 

끝.

 

 



Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]