다음을 통해 공유


모놀리식 애플리케이션을 컨테이너화하기

팁 (조언)

이 콘텐츠는 .NET Docs 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 컨테이너화된 .NET 애플리케이션용 .NET 마이크로 서비스 아키텍처인 eBook에서 발췌한 내용입니다.

컨테이너화된 .NET 애플리케이션을 위한 .NET 마이크로서비스 아키텍처 eBook의 표지 썸네일.

모놀리식으로 배포된 단일 웹 애플리케이션 또는 서비스를 빌드하고 컨테이너로 배포할 수 있습니다. 애플리케이션 자체는 내부적으로 모놀리식이 아니지만 여러 라이브러리, 구성 요소 또는 계층(애플리케이션 계층, 도메인 계층, 데이터 액세스 계층 등)으로 구성될 수 있습니다. 그러나 외부적으로는 단일 컨테이너( 단일 프로세스, 단일 웹 애플리케이션 또는 단일 서비스)입니다.

이 모델을 관리하려면 애플리케이션을 나타내는 단일 컨테이너를 배포합니다. 용량을 늘리려면 규모를 확장합니다. 즉, 앞에 부하 분산 장치를 사용하여 복사본을 더 추가하면 됩니다. 단순성은 단일 컨테이너 또는 VM에서 단일 배포를 관리하는 것에서 비롯됩니다.

모놀리식 컨테이너화된 애플리케이션의 구성 요소를 보여 주는 다이어그램

그림 4-1. 컨테이너화된 모놀리식 애플리케이션의 아키텍처 예제

그림 4-1과 같이 각 컨테이너에 여러 구성 요소, 라이브러리 또는 내부 계층을 포함할 수 있습니다. 모놀리식 컨테이너화된 애플리케이션은 내부 계층 또는 라이브러리가 있는 단일 컨테이너 내에서 대부분의 기능을 가지며 여러 서버/VM에서 컨테이너를 복제하여 확장합니다. 그러나 이 모놀리식 패턴은 컨테이너 원칙 "컨테이너가 한 가지 작업을 수행하고 한 프로세스에서 수행"과 충돌할 수 있지만 경우에 따라 괜찮을 수 있습니다.

이 방법의 단점은 애플리케이션이 커지면 확장해야 한다는 것이 분명해집니다. 전체 애플리케이션의 크기를 조정할 수 있는 경우 실제로 문제가 되지 않습니다. 그러나 대부분의 경우 애플리케이션의 일부만 크기 조정이 필요한 초크 지점이지만 다른 구성 요소는 덜 사용됩니다.

예를 들어 일반적인 전자 상거래 애플리케이션에서는 제품 정보 하위 시스템을 확장해야 할 수 있습니다. 구매하는 고객보다 제품을 찾는 고객이 많기 때문입니다. 결제 파이프라인을 사용하는 것보다 더 많은 고객이 장바구니를 사용합니다. 더 적은 수의 고객이 의견을 추가하거나 구매 기록을 봅니다. 또한 콘텐츠 및 마케팅 캠페인을 관리해야 하는 소수의 직원만 있을 수 있습니다. 모놀리식 디자인의 크기를 조정하면 이러한 다양한 작업에 대한 모든 코드가 여러 번 배포되고 동일한 등급으로 크기가 조정됩니다.

애플리케이션 수평 중복의 크기를 조정하고, 애플리케이션의 여러 영역을 분할하고, 유사한 비즈니스 개념 또는 데이터를 분할하는 여러 가지 방법이 있습니다. 그러나 모든 구성 요소의 크기를 조정하는 문제 외에도 단일 구성 요소를 변경하려면 전체 애플리케이션을 완전히 다시 테스트하고 모든 인스턴스를 완전히 다시 배포해야 합니다.

그러나 애플리케이션 개발이 처음에는 마이크로 서비스 접근 방식보다 쉽기 때문에 모놀리식 접근 방식이 일반적입니다. 따라서 많은 조직에서 이 아키텍처 접근 방식을 사용하여 개발합니다. 일부 조직은 충분한 결과를 보였지만 다른 조직은 한계에 도달하고 있습니다. 많은 조직에서 이 모델을 사용하여 애플리케이션을 설계했습니다. 도구와 인프라로 인해 몇 년 전에 SOA(서비스 지향 아키텍처)를 빌드하기가 너무 어려웠기 때문에 애플리케이션이 증가하기 전까지는 필요를 못했습니다.

인프라 관점에서 각 서버는 동일한 호스트 내에서 많은 애플리케이션을 실행할 수 있으며, 그림 4-2와 같이 리소스 사용량에서 적절한 효율성 비율을 가질 수 있습니다.

컨테이너에서 많은 앱을 실행하는 한 호스트를 보여 주는 다이어그램

그림 4-2. 모놀리식 접근 방식: 여러 앱을 실행하는 호스트, 각 앱이 컨테이너로 실행됨

Microsoft Azure의 모놀리식 애플리케이션은 각 인스턴스에 전용 VM을 사용하여 배포할 수 있습니다. 또한 Azure 가상 머신 확장 집합을 사용하여 VM의 크기를 쉽게 조정할 수 있습니다. 또한 Azure App Service 는 VM을 관리할 필요 없이 모놀리식 애플리케이션을 실행하고 인스턴스 크기를 쉽게 조정할 수 있습니다. 2016년부터 Azure App Services는 Docker 컨테이너의 단일 인스턴스를 실행하여 배포를 간소화할 수 있습니다.

그림 4-3과 같이 QA 환경 또는 제한된 프로덕션 환경으로 여러 Docker 호스트 VM을 배포하고 Azure 분산 장치를 사용하여 균형을 맞출 수 있습니다. 단일 컨테이너 내에 전체 애플리케이션이 존재하기 때문에, 이 방법은 크기 조정을 큰 폭으로 관리할 수 있게 해줍니다.

모놀리식 앱 컨테이너를 실행하는 여러 호스트를 보여 주는 다이어그램

그림 4-3. 단일 컨테이너 애플리케이션을 확장하는 여러 호스트의 예

다양한 호스트에 대한 배포는 기존 배포 기술로 관리할 수 있습니다. Docker 호스트는 명령 docker run을 수동으로 실행하거나 지속적 전달(CD) 파이프라인과 같은 자동화를 통해 관리할 수 있습니다.

모놀리식 애플리케이션을 컨테이너로 배포

컨테이너를 사용하여 모놀리식 애플리케이션 배포를 관리하는 이점이 있습니다. 컨테이너 인스턴스 크기 조정은 추가 VM을 배포하는 것보다 훨씬 빠르고 쉽습니다. 가상 머신 확장 집합을 사용하는 경우에도 VM을 시작하는 데 시간이 소요됩니다. 컨테이너 대신 기존 애플리케이션 인스턴스로 배포되는 경우 애플리케이션 구성은 VM의 일부로 관리되므로 이상적이지 않습니다.

Docker 이미지로 업데이트를 배포하는 것은 훨씬 빠르고 네트워크 효율적입니다. Docker 이미지는 일반적으로 몇 초 안에 시작되며 출시 속도가 빨라집니다. Docker 이미지 인스턴스를 분해하는 것은 명령을 실행하는 docker stop 것만큼 쉽고 일반적으로 1초 이내에 완료됩니다.

컨테이너는 설계상 변경할 수 없으므로 손상된 VM에 대해 걱정할 필요가 없습니다. 반면, VM에 대한 업데이트 스크립트는 디스크에 남아 있는 특정 구성 또는 파일을 고려하지 않을 수 있습니다.

모놀리식 애플리케이션은 Docker의 이점을 누릴 수 있지만, 우리는 이점에 대해서만 논의하고 있습니다. 컨테이너 관리의 추가 이점은 각 컨테이너 인스턴스의 다양한 인스턴스 및 수명 주기를 관리하는 컨테이너 오케스트레이터를 사용하여 배포하는 것입니다. 모놀리식 애플리케이션을 개별적으로 확장, 개발 및 배포할 수 있는 하위 시스템으로 분할하는 것은 마이크로 서비스의 영역으로의 진입점입니다.

Azure App Service에 단일 컨테이너 기반 애플리케이션 게시

Azure에 배포된 컨테이너의 유효성 검사를 받으려면 또는 애플리케이션이 단순히 단일 컨테이너 애플리케이션인 경우 Azure App Service는 확장 가능한 단일 컨테이너 기반 서비스를 제공하는 좋은 방법을 제공합니다. Azure App Service를 사용하는 것은 간단합니다. Git과 통합되어 코드를 쉽게 가져오고, Visual Studio에서 빌드하고, Azure에 직접 배포할 수 있습니다.

Container Registry를 보여 주는 App Service 만들기 대화 상자의 스크린샷

그림 4-4. Visual Studio 2022에서 Azure App Service에 단일 컨테이너 애플리케이션 게시

Docker가 없으면 Azure App Service에서 지원되지 않는 다른 기능, 프레임워크 또는 종속성이 필요한 경우 Azure 팀이 App Service에서 해당 종속성을 업데이트할 때까지 기다려야 했습니다. 또는 추가 제어를 통해 애플리케이션에 필요한 구성 요소 또는 프레임워크를 설치할 수 있는 Azure Cloud Services 또는 VM과 같은 다른 서비스로 전환해야 했습니다.

Visual Studio 2017 이상의 컨테이너 지원을 통해 그림 4-4와 같이 애플리케이션 환경에 원하는 내용을 포함할 수 있습니다. 컨테이너에서 실행 중이므로 애플리케이션에 종속성을 추가하는 경우 Dockerfile 또는 Docker 이미지에 종속성을 포함할 수 있습니다.

그림 4-4에 표시된 것처럼 게시 흐름은 컨테이너 레지스트리를 통해 이미지를 푸시합니다. Azure Container Registry(Azure의 배포에 가깝고 Azure Active Directory 그룹 및 계정으로 보호되는 레지스트리) 또는 Docker 허브 또는 온-프레미스 레지스트리와 같은 다른 Docker 레지스트리일 수 있습니다.