기업은 하나의 물리 서버를 보다 효율적으로 사용하기를 원합니다. 이런 필요에 의해 ‘서버 가상화 기술’이 발전하게 되었고, 오늘날 우리에게 익숙한 VM과 컨테이너가 탄생하게 되었습니다.
VM과 컨테이너는 모두 가상화 기술이 적용된 결과물이라는 점에서 공통점이 있습니다. 다만, 어떤 가상화 소프트웨어를 사용하는지, 어떤 시스템 레벨을 가상화하는지에 차이가 있습니다.
1. VM (Virtual Machine)
VM은 ‘하이퍼바이저’를 이용해 하드웨어 자원을 가상화하는 방식 또는 그 결과물을 말합니다. 따라서 VM을 이해하기 위해서는 먼저 하이퍼바이저를 알아야 합니다.
하이퍼바이저는 호스트 시스템에서 다수의 게스트 OS를 구동할 수 있게 하는 소프트웨어입니다. 하드웨어를 가상화하면서 하드웨어와 각각의 VM을 모니터링하는 중간 관리자 역할을 하는 것이 하이퍼바이저(i.e Virtual Machine Monitor)입니다.
하이퍼바이저는 두 가지 유형으로 분류됩니다.
Type1. 네이티브 or 하이퍼바이저형(native/bare-metal or Hypervisor)
하이퍼바이저가 하드웨어 바로 위에서 실행되는 방식입니다.
하이퍼바이저가 하드웨어를 직접 제어하기 때문에 자원을 효율적으로 사용할 수 있고, 별도의 호스트OS가 없으므로 오버헤드가 적지만 여러 하드웨어 드라이버를 세팅해야 하므로 설치가 어렵습니다.
대표적으로는 Xen, 마이크로소프트 Hyper-V, KVM이 네이티브 하이퍼바이저에 속합니다.
네이티브형 하이퍼바이저는 전가상화, 반가상화 방식으로 세분화할 수 있습니다.
하이퍼바이저를 통해 가상 머신 내의 게스트 OS가 호스트 시스템을 활용한다는 점은 같지만, 하드웨어와 인터랙션하는 방식에 차이가 있습니다.
1-1) 전 가상화(Full Virtualization)
- 게스트 OS를 호스트 시스템과 완전히 분리하여 실행
- 게스트 OS는 하드웨어 자원을 요청하기 위해, 반드시 하이퍼바이저가 중재 해야 함
전 가상화는 하드웨어를 모두 가상화하는 방식입니다.
게스트 OS가 하이퍼바이저에게 하드웨어 시스템 제어를 요구하면, 하이퍼바이저는 하드웨어에게 해당 요구 사항을 전달합니다.
각 게스트 OS는 ‘DOM 0’라는 관리 머신을 거쳐 하이퍼바이저와 통신하므로, CPU와 RAM처럼 I/O가 잦은 자원을 컨트롤 하기에는 번거롭습니다. 이런 한계를 개선하기 위해 반가상화 방식이 출현하게 되었습니다.
1-2) 반가상화(Para Virtualization)
- 게스트 OS를 일부 수정하여 필요한 하드웨어 자원을 직접 요구할 수 있음
반 가상화 방식은 하드웨어를 완전히 가상화하지 않습니다.
대신 게스트 OS의 커널을 일부 수정해 하드웨어와 인터랙션할 수 있도록 합니다.
OS를 수정해야 하므로 게스트 OS가 윈도우일 경우 별도의 Tool을 이용해야 해서 번거로움이 있습니다.
대표적인 반가상화 방식 소프트웨어인 Xen에서 게스트 OS는 Hyper Call이라는 명령어를 통해 하드웨어에 필요한 자원을 바로 하이퍼바이저에 전달하고, 하이퍼바이저는 바로 하드웨어를 제어합니다.
즉, 각각의 게스트 OS는 필요한 자원을 직접 요청할 수 있는 능력이 있으므로 모든 요청을 ‘DOM 0’ 가 한꺼번에 처리하여 하드웨어를 제어하는 전가상화 방식에 비해 성능이 좋습니다.
Type2. 호스트형(hosted)
호스트형 하이퍼바이저는 일반적인 소프트웨어처럼 호스트 OS 위에서 실행됩니다.
하드웨어 자원을 VM 내부의 게스트 OS에 에뮬레이트 하는 방식이기 때문에 네이티브 방식에 비해 오버헤드가 크지만, 게스트 OS 종류에 대한 제약이 없고 데스크톱뿐 아니라 노트북에서도 운영할 수 있습니다.
대표적으로는 VMware server, VMware Workstation, Virtual box가 있습니다.
하이퍼바이저에 의해 구동되는 VM은 각 VM별로 독립된 가상의 자원을 할당받습니다. VM은 논리적으로 분리되어 있어서 한 VM에 오류가 발생해도 다른 VM으로 확산되지 않는다는 장점이 있습니다.
2. 컨테이너
최근 가상화 기술의 축은 하이퍼바이저 기반의 가상화에서 컨테이너 기반 가상화로 이동하고 있습니다.
컨테이너 기술은 LXC(Linux Container)에서부터 출발합니다. LXC는 호스트 OS에서 프로세스 간 벽을 만드는 기술로, 네임 스페이스와 cgroup을 조합한 형태입니다.
- 네임 스페이스: 리눅스 시스템 자원을 묶어 프로세스에 할당하는 방식으로, 하나의 프로세스 자원을 관리하는 기능. IBM에서 개발.
- cgroup: CPU, 메모리 등 프로세스 그룹의 시스템 자원 사용량을 관리하여 특정 애플리케이션이 자원을 과다하게 사용하는 것을 제한. Google에서 개발.
이처럼 격리된 고유 영역에서 애플리케이션을 실행하는 것을 의미하는 컨테이너는 애플리케이션의 실행에 필요한 라이브러리와 바이너리, 기타 구성 파일을 ‘이미지’ 단위로 빌드하여 패키지로 배포합니다.
실행에 필요한 모든 환경이 준비되어 있으므로 어떤 환경에서도 애플리케이션을 오류 없이 동작시킬 수 있는 것이 가장 큰 특징입니다.
그림처럼 컨테이너는 하이퍼바이저와 게스트 OS가 필요하지 않으므로 더 가벼운 것이 두번째 특징입니다. 일반적으로 컨테이너에는 OS가 포함되지 않아 크기가 수십 MB에 불과하고, 운영체제 부팅이 필요 없으므로 서비스를 시작하는 시간도 짧습니다. 크기가 작기 때문에 컨테이너 복제와 배포에도 용이합니다.
애플리케이션을 실행할 때에도 물리 서버에서 애플리케이션 하나를 실행하는 것과 마찬가지로, 호스트 OS 위에 애플리케이션의 실행 패키지인 ‘이미지’를 배포하기만 하면 됩니다.
반면, VM은 항상 게스트 OS가 포함되므로 보통 수 GB에 해당하고, 애플리케이션을 실행할 때에도 먼저 VM을 띄우고 자원을 할당한 다음, 게스트 OS를 부팅하여 애플리케이션을 실행시켜야 합니다.
이처럼 VM에 비해 컨테이너는 애플리케이션을 실행, 배포하는 과정이 가볍기 때문에 하나의 물리 서버에서 더 많은 애플리케이션을 구동시킬 수 있습니다.