
이미지를 보면 PC에서 또다른 PC에 접속한 것 같이 보인다. 신기하긴 한데 왜 하는 걸까?
Docker를 이해하기 앞서 가상화에 대한 이해가 필요하다.
가상화 기술은 물리적 컴퓨팅 환경 내부에 논리적인 컴퓨팅 환경을 만들 수 있는 기술이다.
쉽게 설명하자면 하나의 컴퓨터에서 여러 대의 컴퓨터를 실행할 수 있는 기술이다.

컴퓨터에서 한 개 이상의 프로그램으로 웹 서비스를 제공할 수 있지만 엔터프라이즈 차원에서의 서버 운영은 그렇지 않다. 보통 파일 서버, 데이터베이스 서버, 웹 서버, 웹 어플리케이션 서버 등 최소 네 개 이상의 서버로 사용자에게 서비스를 제공한다.
그럼 서버 네 대를 구입해서 사용하면 되는 것이지 왜 굳이 가상화를 사용하는거야? 라는 의문이 생길 수 있다.
가상화는 경제적인 장점을 제공한다. 요즘은 하드웨어의 성능은 빠르게 발전하고 소프트웨어의 크기는 작아지고 있다. 때문에 기업 입장에서는 낮은 사양의 컴퓨터를 여러 대 사용하는 것보다 높은 사양의 컴퓨터를 한 대 사용하는 것이 설치 공간, 설치 비용, 서버 운영 등 여러 방면에서 훨씬 경제적이다.
기기가 여러 대라면 그만큼 전기 사용량도 늘어난다. 이러한 이유 때문에 가상화 기술을 써서 하나의 하드웨어를 효율적으로 사용하는 것이 엔터프라이즈 환경에서는 필수가 되었다.
기업 운영 환경에서 운영 중인 환경이 멈추는 것은 아주 치명적이다. 가상화는 하나의 물리적 OS에서 실행 중인 여러 개의 논리적 OS가 독립적으로 동작하도록 하여 이를 해결한다.
만약 평소 우리가 사용하는 컴퓨터처럼 윈도우 OS 하나를 설치하고 그 위에서 프로그램을 4개 실행한다면 리소스 각 프로그램에 서로에게 영향을 줄 위험이 생긴다. 예를 들어 하나의 프로그램 사용량이 갑자기 급증해서 리소스를 모두 소모하게 되면 나머지 프로그램에도 그 여파가 전이될 수 있다. 때문에 소프트웨어를 하나의 OS에서 운영하는 것은 안정적이지 못하다.
가상화 기술을 사용하면 한 대의 컴퓨터에서 여러 대의 논리적인 OS 환경을 만들 수 있으며 가상으로 만들어진 컴퓨터에는 사용자 마음대로 리소스를 직접 분배할 수 있다. 즉 사용자가 하나의 논리적 OS가 사용할 수 있는 물리적 OS의 리소스의 상한 선을 정해 줄 수 있는것이다.
이를 통해 한 대의 프로그램에서 에러가 발생해도 다른 프로그램에는 영향을 주지 않고, 프로그램 하나에 버그가 생겨 리소스 사용량이 급증해도 논리적 OS 한대의 사용량은 제한되어 있기 때문에 하나의 환경 문제로 끝나게 된다.
앞서 살펴본 것처럼 가상화 기술을 사용하면 한 대의 컴퓨터를 사용하여 경제적이지만 사용자는 마치 여러 대의 컴퓨터를 운영하는 것처럼 가상 환경을 사용해 안전하게 소프트웨어를 운영할 수 있다.
이러한 가상화 기술의 종류는 두 가지가 있다. 첫 번째는 하이퍼바이저 가상화, 두 번째는 컨테이너 가상화이다. 이번 포스트에서는 전통적인 가상화 방식인 하이퍼바이저에 대해 다룬다.

하이퍼바이저 가상화는 전통적인 가상화 방식으로 컴퓨터에 설치되는 프로그램이다.
하이퍼바이저를 사용해 가상 OS를 만들면 지정해 놓은 CPU나 메모리만큼 컴퓨터의 격리된 공간을 만들 수 있다. 실행 전에는 스토리지의 저장 용량만 차지하고 있다가, 실행을 하면 CPU와 메모리를 사용하며 실행된다.
물리적 서버에 설치되는 OS는 호스트 OS라고 한다. 이 호스트 OS에 하이퍼바이저를 설치해 가상환경을 구성하고 호스트 OS의 자원을 격리해 새로운 OS를 실행한다. 이렇게 실행되는 OS를 게스트 OS라고한다. 게스트 OS는 호스트 OS의 리소스를 나눈 논리적 공간으로 가상 머신이라고 부른다. 가상 머신에서는 웹 서버, WAS, DB 서버 등의 프로그램을 프로세스로 실행해 운영한다.
정리하면, 엔터프라이즈 운영 환경에서는 물리적 서버에 호스트 OS를 설치해 하이퍼바이저를 설치한 다음 가상 머신을 만들어 게스트 OS를 실행한다. 그리고 이 게스트 OS에서 실제 실행을 원하는 프로세스를 운영한다.

프로세스는 정상 실행되기 위해 CPU와 메모리와 같은 리소스를 사용해야 한다. 하지만 프로세스가 하드웨어인 CPU와 메모리 등의 리소스에 접근하기 위해서는 반드시 OS를 거쳐야한다. 왜냐하면 OS에는 소프트웨어가 하드웨어 리소스에 안정적으로 접근할 수 있도록 도와주는 커널이 설치되어 있기 때문이다.
커널은 하드웨어에 대한 사용 요청을 대신 전달해 주는 시스템 콜이라는 표준을 정의해 놓았다. 그래서 프로세스들은 커널에 시스템 콜을 보내 하드웨어의 자원을 사용할 수 있는 것이다.
OS는 윈도우, 리눅스, macOS 등 다양한데, 이 OS들은 각기 다른 커널을 사용한다. 그러므로 당연히 시스템 콜도 다르며 이 OS들 간의 통신은 다른 국적을 가진 외국인 3명이 대화를 하는 것과 같다.
이미지처럼 가상 머신을 사용하여 윈도우 호스트 OS에서 게스트 OS로 리눅스 또는 macOS를 실행해야 한다면, 게스트 OS의 커널은 실제적으로 물리적인 하드웨어가 없기 때문에 호스트 OS인 윈도우 OS의 커널로 리소스를 사용해야한다. 하지만 다른 시스템 콜을 가지는 다른 OS 끼리는 통신이 불가능하다고 하였는데 가능한걸까?
이 부분을 하이퍼바이저가 대신해준다. 하이퍼바이저는 가상 환경에서 호스트 OS와 게스트 OS의 통역 역할을 한다. 그래서 하이퍼바이저를 사용하면 호스트 OS에서 다른 종류의 게스트 OS를 가상화하여 사용할 수 있다.
다음 포스트에서는 컨테이너, 도커!