하나의 물리적인 베어메탈 머신을 여러 머신으로 가상화 하여 분리하는 방식은 크게 VM(가상 머신)과 컨테이너 가상화로 구분된다.
VM은 베어메탈 서버에 설치된 호스트 OS와 커널의 공유하지 않으며 구성 요소 프로세스 뿐만 아니라 시스템 프로세스 전체를 실행하게 된다. 때문에 가상화된 환경 위에 애플리케이션을 구동하기 위해서는 애플리케이션 구동에 필요한 리로스 뿐 아니라 VM을 생성하고 실행하기 위해 많은 추가적인 컴퓨팅 리소스가 필요하다.
또한 VM을 새롭게 구동할 때 시스템 서비스를 새롭게 구성하는 부팅 과정이 필요하며 이는 일반적으로 시간을 소요한다.
컨테이너는 반면에 호스트 OS의 커널을 공유하며 단순히 호스트OS에서 실행되는 하나의 격리되어있는 프로세스로서 동작한다. 즉, 구동하는 애플리케이션이 사용하는 컴퓨팅 리소스 외에 추가로 들어가는 부하가 거의 없다고 볼 수 있다.
커널을 호스트와 공유하기 때문에 시스템 부팅 과정이 필요하지 않으며 컨테이너에서 실행되는 프로세스는 즉시 시작된다.
일반적으로 VM은 자체적으로 오버헤드가 발생하기 때문에 하나의 애플리케이션 모듈 당 하나의 VM을 사용하기 보다는 각 VM마다 연관에 의한 그룹으로 애플리케이션 모듈들을 묶어서 배포하게 된다. 컨테이너의 경우에는 보통 하나의 애플리케이션 모듈마다 하나의 가상화된 컨테이너를 갖게 된다.
위에서 설명한 것처럼 컨테이너 가상화에는 추가적인 리소스 부하가 없기 때문에 동일한 하나의 물리적 베이메탈 머신에서 더 많은 에플리케이션을 가상화하여 구동할 수 있게 된다.
그렇다면 컨테이너 가상화가 무조건 더 유리한 것일까? 그렇지는 않다. VM의 경우 각각의 가상 머신이 독립된 리눅스 커널을 사용한다. 즉, OS가 완전히 격리되어 있다고 볼 수 있다. 반면에 컨테이너의 경우 모든 컨테이너가 Host OS의 동일한 커널을 사용하기 때문에 보안 위험이 발생할 수 있다. 심한 경우, 가상화된 컨테이너가 Host OS까지 간섭할 수 있게 된다.
실제 업무 운영 환경에서는 거대한 베어메탈 서버를 VM으로 일부 가상화 하고, 각각의 VM 위에 보안 관계에 따라 컨테이너를 배포한다. 간단하게 예를 들면, 클라우드 서비스를 제공하는 업체가 있고 이를 사용하는 회사가 A, B, C가 있다고 가정해 보자. 클라우드 업체는 거대한 베어메탈 서버를 3개의 VM으로 가상화 시키고 각 회사의 애플리케이션을 각 VM에 컨테이너로 배포하는 식이다.