도커와 VM의 차이점은 무엇인가요?

도커와 가상 머신(VM)은 애플리케이션 배포에 사용되는 두 가지 기술입니다. 소프트웨어 개발 수명 주기에서 배포는 최종 사용자를 위해 실행할 애플리케이션 코드를 준비합니다. 도커는 개발자가 컨테이너라는 표준화된 단위로 소프트웨어를 패키징하는 데 사용하는 오픈 소스 플랫폼입니다. 컨테이너에는 라이브러리, 시스템 도구, 런타임을 비롯한 애플리케이션 코드와 해당 환경이 모두 갖춰져 있습니다. 도커를 사용하면 어떤 시스템에서든 애플리케이션을 배포하고 규모를 조정하며 코드가 일관되게 실행되도록 할 수 있습니다. 반면 가상 머신은 물리적 머신의 디지털 사본입니다. 동일한 호스트 운영 체제에서 고유한 개별 운영 체제가 실행되는 여러 가상 머신을 보유할 수 있습니다. 개발자는 가상 머신을 구성하여 애플리케이션 환경을 생성합니다. 가상 머신에서 도커 컨테이너를 실행할 수도 있습니다.

도커에 대해 읽어보기 »

가상화: 도커와 가상 머신

가상화를 통해 서버 및 네트워크와 같은 실제 리소스의 가상 인스턴스를 만들 수 있습니다. 컴퓨팅에서 가상화를 사용하면 가상화된 구성 요소의 격리된 여러 인스턴스가 실제 구성 요소에서 작동할 수 있습니다.

예를 들어 물리적 서버에서 여러 가상 서버를 실행할 수 있습니다. 여러 가상 인스턴스에서 실제 리소스를 공유하면 활용도가 높아지고 운영 비용도 절감됩니다. 가상화는 상당한 양의 애플리케이션 개발 및 배포의 기반입니다.

가상 머신

이름에서 알 수 있듯이 가상 머신(VM)은 전체 머신(서버)의 가상화를 제공합니다. 가상 머신은 CPU, 메모리, 네트워크 인터페이스 카드, USB 컨트롤러 및 사운드 카드와 같은 물리적 머신의 하드웨어 구성 요소를 에뮬레이션합니다. 가상 환경에서 게스트 운영 체제와 여러 애플리케이션을 실행할 수 있습니다. 

가상 머신은 클라우드 기술을 가능하게 했으며, Amazon Web Services(AWS)에서는 가상 머신을 인스턴스라고 합니다. 이러한 클라우드 인스턴스는 AWS에서 소유 및 유지 관리하며 API를 통해 사용할 수 있습니다.

클라우드 인스턴스에 대해 읽어보기 »

Docker

VM을 사용하면 모든 하드웨어에서 가상 머신을 실행할 수 있습니다. 도커를 사용하면 모든 운영 체제에서 애플리케이션을 실행할 수 있습니다. 도커는 컨테이너라고 하는 격리된 사용자 공간 인스턴스를 사용합니다.

도커 컨테이너에는 고유한 파일 시스템, 종속성 구조, 프로세스 및 네트워크 기능이 있습니다. 애플리케이션은 컨테이너 내부에 필요한 모든 것을 갖추고 있으며 어디서나 실행할 수 있습니다. 도커 컨테이너 기술은 기본 호스트 운영 체제 커널 리소스를 직접 사용합니다. 

도커와 가상 머신 간의 기타 유사점은 무엇인가요?

가상화 기술로서 도커와 가상 머신(VM)은 몇 가지 유사점을 가지고 있습니다.

이미지

도커 컨테이너와 가상 머신은 모두 이미지에서 생성됩니다. 각 이미지는 가상화된 환경의 청사진 역할을 합니다. 이미지를 사용하면 사용자는 환경을 매번 구성하지 않고도 일관된 환경을 만들고 공유할 수 있습니다.

이미지는 애플리케이션을 실행하는 데 필요한 모든 시스템 리소스를 지정합니다. 예를 들어 VM 이미지는 운영 체제 백업을 생성하는 반면 도커 컨테이너 이미지는 애플리케이션 환경 백업을 생성합니다.

버전 관리

도커 컨테이너 이미지와 가상 머신 이미지 모두 버전 관리를 통해 시간 경과에 따른 환경 구성 변경을 추적할 수 있습니다.

도커의 버전 관리란 시간이 지남에 따라 도커 이미지의 변경 사항을 추적하고 관리하는 기능을 말합니다. 이를 통해 개발자는 애플리케이션의 여러 버전을 추적하고, 필요한 경우 이전 버전으로 롤백하고, 여러 버전의 애플리케이션을 동시에 배포할 수 있습니다. 

마찬가지로 가상 머신의 버전 관리란 시간이 경과함에 따라 가상 머신 이미지의 변경 사항을 추적하고 관리하는 프로세스를 말합니다. 가상 머신 버전 관리는 업데이트 및 패치와 같은 가상 하드웨어 또는 운영 체제 구성의 변경 사항을 추적합니다.

이동성

가상 머신과 도커는 모두 서로 다른 유형의 기본 아키텍처에 대해 서로 다른 애플리케이션 구성을 개발해야 하는 어려움을 해결하도록 설계되었습니다. 도커와 VM 이미지는 모두 서로 다른 접근 방식을 취하지만 온프레미스든 클라우드에서든 아키텍처 간에 이동성이 매우 뛰어납니다. 

주요 차이점: 도커와 가상 머신

가상 머신(VM)과 도커는 서로 다른 환경에서 애플리케이션을 실행하는 데 따르는 문제를 해결합니다. 그러나 약간 다른 이유와 다른 접근 방식으로 문제를 해결합니다.

목표

가상 시스템은 원래 단일 물리적 시스템에서 여러 운영 체제를 실행할 수 있도록 설계되었습니다. 목표는 사용자가 기본 하드웨어로부터 격리된 가상 환경을 만들 수 있도록 하는 것입니다. VM은 하드웨어 세부 정보를 추상화하여 다양한 하드웨어 아키텍처에서 애플리케이션을 보다 쉽게 실행하고 하드웨어 리소스를 더 효율적으로 사용할 수 있도록 합니다.

반면 도커는 격리되고 재현 가능한 환경에서 애플리케이션을 패키징하고 실행할 수 있는 가볍고 이동성이 뛰어난 방법을 제공하도록 설계되었습니다. 도커는 운영 체제 세부 정보를 추상화하여 개발, 테스트 및 프로덕션과 같은 다양한 환경에 애플리케이션 배포 시의 문제를 해결합니다. 소프트웨어 환경 업데이트를 관리하고 어디서나 환경 일관성을 유지하는 것은 매우 어려울 수 있습니다. 수백 개의 애플리케이션을 실행하거나 애플리케이션을 수백 개의 마이크로서비스로 분해하는 조직의 경우 특히 그렇습니다. 도커는 컨테이너화를 통해 이 문제를 해결합니다. 

최종 제품

도커는 Docker사가 소유하고 운영하는 오픈 소스 컨테이너 플랫폼의 이름입니다. Podman과 같은 대체 플랫폼이 있지만 인기가 훨씬 적습니다. 도커는 컨테이너화의 대명사입니다. 컨테이너는 최종 사용자가 사용할 수 있는 부분인 아티팩트입니다.

가상 머신 자체는 최종 사용자가 사용할 수 있는 부분입니다. 이 기술은 특정 브랜드와 관련이 없습니다. 온프레미스 데이터 센터에 VM을 배포하거나 API를 통해 관리형 클라우드 서비스로 액세스할 수 있습니다.

아키텍처

가상 머신은 자체 커널 및 호스트 운영 체제를 애플리케이션과 라이브러리 및 기타 바이너리 파일과 같은 종속성과 함께 실행합니다. 하이퍼바이저는 하드웨어(호스트 머신 또는 서버)와 가상 머신 간에 조정합니다. 인스턴스화 중에 설명된 물리적 하드웨어 리소스를 독점적으로 사용할 수 있도록 가상 머신에 할당합니다. 단일 하이퍼바이저로 관리되는 강력한 단일 서버에 여러 가상 머신이 존재할 수 있으며, 각 가상 머신에서 수백 개의 애플리케이션이 실행될 수 있습니다.

도커 컨테이너에는 종속성만 포함됩니다. 소프트웨어 도커 엔진은 도커의 가상화를 지원합니다. 물리적 시스템이든 가상 머신이든 관계없이 실행 중인 컨테이너와 기본 운영 체제 간의 조정을 제공합니다.

도커를 통한 고급 가상화 관리를 위해서는 Kubernetes를 사용하세요. 자세한 내용은 Kubernetes와 도커의 차이점은 무엇인가요?를 읽어보세요.

리소스 공유

가상 머신과 도커 컨테이너는 모두 리소스 멀티플렉싱 또는 가상화된 인스턴스 간의 리소스 공유를 사용합니다.

가상 머신은 하드웨어에 미리 일정량의 리소스를 요청하며 가상 머신이 실행되는 한 계속해서 해당 양만큼 사용합니다. 

반면 도커 컨테이너는 온디맨드 방식으로 리소스를 사용합니다. 가상 머신처럼 특정 양의 물리적 하드웨어 리소스를 요구하지 않고, 단일 운영 체제 커널에서 필요한 리소스만 요청합니다. 여러 컨테이너가 동일한 운영 체제를 공유합니다. 도커 컨테이너는 커널 리드와 직접 리소스를 공유하며 VM에 비해 시스템 리소스를 적게 사용할 수 있습니다. 

보안

도커 컨테이너는 커널을 호스트 운영 체제와 공유하므로 리소스를 적게 소비하기 때문에 커널에 취약점이 있으면 위험에 노출됩니다. 그러나 도커는 많은 고급 보안 제어 기능도 제공합니다.

반대로 VM은 전체 운영 체제를 실행하므로 애플리케이션을 실행할 때 격리 수준이 더 높아집니다. VM은 운영 체제에 엄격한 보안 조치가 마련되어 있는 한 더 뛰어난 보안 기능을 제공합니다.

사용 시기: 도커와 가상 머신

도커 컨테이너는 Linux 아키텍처에서 실행되며 네임스페이스 및 제어 그룹(cgroups)과 같은 Linux 커널 관련 기능이 필요합니다. 개발자는 Linux 기반 가상 머신에서 도커 플랫폼을 실행하는 경우가 많습니다. 도커는 애플리케이션 코드를 어디서나 실행되는 컨테이너에 패키징합니다. 환경 업데이트는 컨테이너에서 한 번만 수행됩니다. 애플리케이션 환경을 업데이트할 필요가 없습니다. 

예를 들어, AWS에서 인스턴스를 가동하고 도커로 사전 구성된 Amazon Machine Image(AMI)로 즉시 로드할 수 있습니다. 

 

하지만 가상 머신(VM) 또는 도커를 사용하여 애플리케이션을 배포할지 구체적으로 결정하는 경우에는 애플리케이션의 실행 요구 사항에 따라 달라집니다.

가상 머신 사용 시기

다음과 같은 요구 사항이 있는 애플리케이션을 실행하는 경우 가상 컴퓨터를 사용하는 것이 가장 좋습니다. 

  • 운영 체제별 종속성
  • 많은 하드웨어 리소스 요구 사항
  • 운영 체제에서 다양한 제어를 설정해야 함
  • 최신 운영 체제에서 더 이상 실행되지 않는 레거시 애플리케이션
  • 단일 기반 물리적 인프라를 사용할 수 있는 다양한 운영 체제 요구 사항

Docker를 사용하는 경우

다음과 같은 요구 사항이 있는 애플리케이션을 실행할 때는 도커를 사용하는 것이 가장 좋습니다. 

  • 경량 리소스 요구 사항 또는 마이크로서비스 아키텍처
  • 클라우드 기반 서버를 포함한 분산된 물리적 인프라 환경
  • 빠른 배포 주기(Dockerfile이 VM 구성보다 관리하기 쉽기 때문)
  • 빠른 확장성 요구 사항

차이점 요약: 도커와 VM

 

도커 컨테이너

VM

무엇인가요?

도커는 도커 컨테이너를 만들고 실행하는 소프트웨어 플랫폼입니다. 도커 컨테이너는 사용자 프로세스가 실행되는 운영 체제의 일부인 사용자 공간 인스턴스의 에뮬레이션입니다.

운영 체제를 실행하는 물리적 시스템(가상 하드웨어 포함)을 에뮬레이션한 것입니다.

가상화

컨테이너는 애플리케이션 코드에서 운영 체제 세부 정보를 추출합니다.

VM은 애플리케이션 코드에서 하드웨어 세부 정보를 추출합니다.

목표

하드웨어 세부 정보를 추상화하고 하드웨어 활용도를 높입니다.

애플리케이션 환경 관리를 개선하고 여러 환경에서 일관성을 유지합니다.

관리 주체:

도커 엔진은 운영 체제와 도커 컨테이너 간에 조정합니다.

하이퍼바이저는 머신의 물리적 하드웨어와 가상 머신 간에 조정합니다.

아키텍처

기본 호스트 커널과 리소스를 공유합니다.

자체 커널과 운영 체제를 실행합니다.

리소스 공유

온디맨드

가상 머신 이미지의 구성 요구 사항에 설정된 고정된 양

AWS는 애플리케이션 배포 요구 사항을 어떻게 지원할 수 있나요?

Amazon Web Services(AWS)는 가상 머신(VM) 및 도커 관리를 위해 특별히 설계된 다양한 서비스를 제공합니다.

  • Amazon Elastic Cloud Compute(Amazon EC2)는 다양한 유형의 안전하고 안정적이며 확장 가능한 인스턴스를 600개 이상 제공합니다. Amazon Machine Image(AMI) 템플릿을 로드하면 완전히 지정된 개발, 테스트 또는 프로덕션 환경 서버를 몇 분 만에 사용할 수 있습니다.
  • Amazon Elastic Container Service(Amazon ECS)는 컨테이너식 애플리케이션의 손쉬운 배포 및 크기 조정을 지원하는 완전관리형 컨테이너 오케스트레이션 서비스입니다. 고객은 Virtual Private Cloud(VPC) 내 프라이빗 도커 이미지 레지스트리에 액세스하거나 VPC 외부에서 액세스할 수 있는 레지스트리에 액세스하도록 컨테이너 인스턴스를 구성할 수 있습니다.
  • Amazon Elastic Container Registry(Amazon ECR)를 사용하면 어디서나 컨테이너를 쉽게 저장, 공유 및 배포할 수 있습니다. Amazon ECR은 도커 명령줄 인터페이스(CLI)와 통합되어 개발 및 생산 워크플로를 간소화합니다. 예를 들어, 개발 머신에서 도커 CLI를 사용하여 컨테이너 이미지를 Amazon ECR로 푸시할 수 있습니다. 또한 Amazon 컨테이너 오케스트레이터가 프로덕션 배포를 위해 직접 가져올 수 있습니다.
  • AWS Fargate는 물리적 서버나 가상 머신을 관리할 필요 없이 컨테이너를 배포하고 관리할 수 있는 서버리스 서비스입니다.

지금 바로 계정을 생성해 AWS에서 애플리케이션 개발을 시작하세요.