가상화 기술이 왜 등장했는지,
Hypervisor 와 Docker의 기술이 어떻게 다른지 정리해봅니다.
1. 가상화 기술 발달 이전.
-
메인프레임(Mainframe) 중심 시대
- 1960~1970년대, IBM 등 회사의 메인프레임이 기업의 주력 컴퓨팅 자원이었고, 한 대의 컴퓨터(메인프레임)에서 여러 사용자가 터미널을 통해 함께 작업함.
- 물리 머신 한 대가 매우 고가이면서도 고성능이었기 때문에, ‘시분할(Time-sharing)’이나 ‘멀티태스킹’을 통해 최대한 효율적으로 자원을 활용하려는 시도가 존재함.
- 이 시절에는 “서버 한 대 = 하나의 운영체제(OS)”라는 단순 구조가 일반적이었고, 어플리케이션들도 해당 OS에 직접 설치되는 형태가 보편적이었음.
-
하나의 물리 서버에 하나의 운영체제 + 여러 소프트웨어가 공존
- 서버 크기가 클수록 하드웨어 자원(메모리, CPU 등)이 남아돌거나, 반대로 특정 애플리케이션이 과도하게 자원을 점유해 다른 애플리케이션에 영향을 미치는 문제 발생.
- 특정 어플리케이션 버전이나 라이브러리가 서버 내 다른 어플리케이션과 충돌을 일으키기도 함.
이러한 문제들을 해결하기 위해, 하나의 서버 위에서 여러 개의 독립적인 실행 환경을 운영하려는 요구가 점차 커지게 됨.
2. 하이퍼바이저(Hypervisor)
- 하이퍼바이저란?
- 호스트 시스템에서 다수의 Guest OS를 구동할 수 있게하는 소프트웨어임
- Host OS가 없는 경우는 native 또는 bare metal 이라 한다.
- 하드웨어를 가상화하면서 하드웨어와 각각의 VM을 모니터링하는 중간관리자임.
- VM마다 자체 운영체제를 설치할 수 있으므로, 서로 다른 OS(Windows, Linux, etc.)나 서로 다른 애플리케이션 스택을 공존시킬 수 있음.
- 호스트 시스템에서 다수의 Guest OS를 구동할 수 있게하는 소프트웨어임
하이퍼바이저에 의해 구동되는 VM은 각 VM마다 독립된 가상 하드웨어 자원을 할당 받으며 VM 내부에서 실행되는 모든 것은 호스트 운영체제, 하이퍼바이저와 독립되어 있다 (Guest OS 위). 논리적으로 분리되어 있기에 다른 VM의 오류가 퍼지지 않는다.
하지만 하이퍼바이저 기반의 VM환경을 위해 새로운 프로세스를 실행하고, 이 특정 VM만을 위한 커널을 부팅하고, 운영 체제 프로세스 세트를 시작하기에 이것은 응용 프로그램만 포함하는 컨테이너보다 VM의 크기를 훨씬 크게 만든다.
비교적 사용법은 간단할 수 있지만 오버헤드가 필연적으로 클 수 밖에 없다.
2. 도커(Docker)
- 도커란?
- 도커(Docker) 는 리눅스 컨테이너 기술(Linux Namespaces, cgroups 등)을 활용하여 이를 컨테이너(Container) 형태로 실행한다
- 컨테이너는 Guest OS가 필요하지 않으므로 더 가볍다
- VM의 경우 VM을 띄우고 자원을 할당하고, Guest OS를 부팅하여 실행해야 했다면, 도커는 하나의 컨테이너를 패키지항 이미지를 배포하면 하기만 하면 된다.
- 도커 컨테이너는 호스트의 커널을 공유하므로, VM보다 부팅 속도가 빠르고 오버헤드가 적다.
- 각각의 컨테이너는 격리되어 있지만, 동일한 Host 커널을 공유한다.
- 컨테이너에서 docker version 커맨드를 입력하면, host의 OS와 동일한 것을 볼 수 있음
도커는 컨테이너를 격리시키기 위해 LXC (Linux의 CGroup, Namespace)등의 기술을 활용한다. 즉, 프로세스를 격리하고(NameSpace) 프로세스에 필요한 컴퓨팅 자원을 독립적으로 할당하여(Cgroup) 완벽히 격리된 가상환경을 구축한다.
결론
- 호랑이 담배 피던 시절, 서버 한 대에 하나의 OS에서 여러 애플리케이션이 공존하면서 충돌·자원 낭비 문제가 발생했다.
- 이를 해결하기 위해 하이퍼바이저 기반 가상화가 등장하여, 한 물리 서버에서 여러 Guest OS(가상머신)를 구동할 수 있게 됐고 각각 독립된 OS를 갖춰 보안 격리와 유연성이 뛰어났지만, 커널 전체를 부팅해야 해 무겁고 오버헤드가 컸다.
- 도커 컨테이너는 호스트 커널을 공유하고, 필요한 라이브러리/파일만 포함해 가벼우며 빠른 기동과 배포가 가능했다.