Docker & VM

도커(Docker)와 가상머신(Virtual Machine) 비교

천방지축 개발노트 2020. 10. 2. 11:51

도커(Docker = Docker Engine)란??

 

docker logo

저는 어떠한 IT용어를 접하면 제일 먼저 사전적 의미를 찾아보는 편인데요, 그래서 찾아보니 도커(Docker)란 '부두(항만) 노동자'를 의미함을 알게 됐었습니다. '부두 노동자'라.. IT용어인데 왠 항구와 관련된 말이 나올까요?? 도커는 2013년에 출시된 기술로 컨테이너 기반의 오픈소스 가상화 플랫폼이라고 정의됩니다.

그리고 결론부터 말하자면 '컨테이너(Container)'라는 것은 플랫폼에 상관없이 Application을 실행할 수 있는 기술을 의미합니다. 즉, 우리는 말 그대로 도커를 이용하여 각종 Application들을 어떤 환경에서든 자유롭게 사용할 수 있습니다. 또한 도커의 로고인 '컨테이너를 싣고 운반하는 고래'처럼 Docker(부두 노동자)는 DockerHub(항구)를 통해 여러 Application들을 전 세계에 나르며 버전 관리와 배포를 도와줍니다.

 

 

도커(Docker)와 Immutable Infrastructure Paradigm

처음에 사람들은 물리서버를 개인이 직접 운영 → 호스팅 서비스를 이용하기 시작 → 호스트 서버 구입과 설치에 시간과 돈, 비용이 많이 드는 문제가 발생 → 가상화가 발전하면서 클라우드 환경으로 변화 → 가상서버를 임대 → 서버의 수가 많아짐 → 개인이 일일이 환경 셋팅하기 힘들어짐 → Immutable Infrastructure Paradigm 탄생

먼저 사전적으로 '불변의 구조'라고 해석되는 Immutable Infrastructure는 OS(Ubuntu, CentOS, Windows, MAC 등...)와 서비스 환경(어플리케이션, 소스코드, 시스템 툴, 시스템 라이브러리 등의 서버에 설치하는 것들)을 각각 분리하여 이해하고 분리한 것들 중 서비스 환경(서비스 인프라) 부분을 이미지화(실행파일화)하여 배포한 뒤 가급적 변경하지 않고 사용하는 것을 의미합니다. 서비스 환경의 업데이트는 서비스 환경을 변경하는 것이 아닌 이미지(Image)를 교체하는 식으로 이루어집니다.

그리고 도커(Docker)는 호스트OS와 서비스 운영 환경(서버 프로그램, 소스코드, 컴파일된 binary파일)를 분리한다는 패러다임과 한 번 설정한 운영 환경은 변경하지 않는다(Immutable)는 위 개념을 기반으로 탄생한 도구입니다.

 

 

컨테이너(Container)와 가상 머신(VM, Virtual Machine) 비교

컨테이너와 가상 머신은 리소스 분리 및 할당 이점이 유사하지만, 컨테이너는 하드웨어 대신 운영 체제를 가상화하기 때문에 다르게 작동합니다.

docker containerized application
컨테이너(Container)
가상 머신
가상 머신(Virtual Machine)

 

1) 컨테이너(Container)

도커 공식 문서에 따르면, 컨테이너는 코드 및 종속성을 함께 패키징(Packaging)하는 Application계층의 추상화라고 정의됩니다. 그리고 이 말은 여러 종류의 컨테이너가 동일한 시스템(내PC 등)에서 실행되고 OS커널을 다른 컨테이너와 공유할 수 있으며, 각 컨테이너는 사용자 공간에서 분리된 프로세스로 실행된다는 의미를 가집니다.

추가적으로, 컨테이너는 VM보다 메모리 공간을 적게 차지하고(컨테이너 이미지의 크기는 일반적으로 수십 MB/s), 더 많은 Application을 처리할 수 있으며 더 적은 수의 VM 또는 운영 체제(OS)를 필요로 합니다.

 

위 말을 다시 풀어 설명하자면, 위 사진에서 도커(Docker)의 구조를 보면 하나의 HostOS(Host Operating System)위에 Docker를 설치하여 그 위에 각각의 서비스(Application) 환경들을 설치/운영하는 형태입니다. 따라서 Application들은 각각 OS를 설치하는 것이 아니라 하나의 HostOS위에서 자원만 공유하기 때문에 상대적으로 매우 가벼우며 Docker가 설치된 환경이라면 이미지(Image)가 사용 가능하기 때문에 어디서든 사용 가능하다는 장점이 있습니다. 즉, 컨테이너란 프로세스 단위의 분리 독립된 환경(공간) 안의 가상공간이라고 할 수 있습니다.

 

 

2) 가상 머신(VM, Virtual Machine)

가상 머신은 하나의 서버를 여러 서버로 전환하는 물리적인 하드웨어의 추상화라고 정의됩니다. 하이퍼바이저(Hypervisor) 기법을 통해 단일 시스템에서는 여러 VM을 실행할 수 있지만, 각 VM에는 운영 체제(OS), 애플리케이션, 필요한 Binary 및 Library의 전체 복사본이 포함되어 있습니다. 따라서 이 복사본은 수십 GB를 차지하기 때문에 VM의 부팅 속도 또한 느려질 수 있다는 특징이 있습니다.

 

다시 말해, 가상머신은 Hypervisor를 이용해 하나의 호스트OS에서 여러 개의 OS를 사용하는 방법이며, 위 사진에서의 VM구조와 같이 기반(Infrastructure)인 HostOS 위에 각각의 VM. 즉, GuestOS(Guest Operating System)를 하나씩 설치하는 형태입니다. 이처럼 각각의 가상머신은 하나의 독립된 커널 공간을 가진 완전한 컴퓨터를 생산하는 식의 환경을 구성합니다. 따라서, VM은 각각의 운영체제(OS)를 포함하기 때문에 용량이 굉장히 무겁다는 의미입니다. 하지만 단점만 있는 것은 아닙니다. 다른 GuestOS와 분리 독립된 공간과 자원을 할당받아 사용되기 때문에, 보안성 측면에서 효율적이라고 할 수 있습니다.

 


다음 글에서는 Docker의 개념 중 컨테이너(Container)와 이미지(Image)에 대한 개념을 정리해보도록 하겠습니다.