Docker

도커와 기존 가상화 기술과의 차이

sejin2 2024. 5. 11. 16:10

도커와 기존의 가상화 기술과의 차이를 통해 컨테이너를 이해해보도록 한다.

가상화 기술이 나오기 전에는, 
한 대의 서버를 하나의 용도로만 사용하고 남는 서버의 공간은 그대로 방치하였다.
하나의 서버에 하나의 운영체제, 하나의 프로그램만을 운영하여 안정적이지만 매우 비효율적으로 사용하였다.

하이버바이저 기반의 가상화의 등장으로,
논리적으로 공간을 분할하여 VM이라는 독립적인 가상 환경의 서버를 이용할 수 있게 되었다.
하이퍼바이저는 호스트시스템에서 다수의 게스트 OS를 구동할 수 있게 하는 소프트웨어, 그리고 하드웨어를 가상화하면서 하드 웨어와 각각의 VM을 모니터링하는 중간관리자이다. 
따라서 비효율적인 부분을 보완하고, 다수의 게스트 OS도 구동이 가능해졌다.

하이퍼 바이저에 대해 살펴보면, 네이티브 하이퍼바이저와 호스트형 하이퍼바이저가 있다. 

네이티브 하이퍼바이저는 하이퍼바이저가 하드웨어를 직접 제어하기에 자원 효율적으로 사용이 가능하며, 별도의 호스트 OS가 없으므로 오버헤드가 적다. 하지만 여러 하드웨어 드라이버를 세팅해야하므로 설치가 어렵다.

호스트형 하이퍼바이저는 일반적인 소프트웨어처럼 호스트 OS위에서 실행되며 하드웨어 자원을 VM 내부의 게스트 OS에 에뮬레이트 하는 방식으로 오버헤드가 크다. 하지만 게스트 OS 종류에 대한 제약이 없고 구현이 다소 쉽다. 
따라서 일반적으로 많이 이용하는 방법이다. 

하이퍼바이저에 의해 구동되는 VM은 각 VM마다 독립된 가상 하드웨어 자원을 할당 받는다. 
논리적으로 분리되어 있어 한 VM에 오류가 발생해도 다른 VM으로 퍼지지 않는다는 장점이 있다.
이러한 기술을 토대로 도커 컨테이너 기술이 나온 것이다. 

VM과 비교했을 때 컨테이너는 하이퍼바이저와 게스트 OS가 필요하지 않으므로 더 가볍다.
어플리케이션을 실행할 때는 컨테이너 방식에서는 호스트 OS위에 어플리케이션의 실행 패키지인 이미지를 배포하기만 하면 되는데, VM은 어플리케이션을 실행하기 위해서 VM을 띄우고 자원을 할당한 다음, 게스트 OS를 부팅하여 어플리케이션을 실행해야해서 훨씬 무겁고 복잡한 실행을 해야 한다.

공통점

: 도커 컨테이너와 가상 머신은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법이다.

차이점

: 격리된 환경을 얼마나 격리시키는가의 차이

도커 컨테이너에서 돌아가는 애플리케이션은 컨테이너가 제공하는 격리 기능 내부에 샌드박스가 있지만, 여전히 같은 호스트의 다른 컨테이너와 동일한 커널을 공유한다. 결과적으로, 컨테이너 내부에서 실행되는 프로세스는 호스트 시스템에서 볼 수 있다. 예를 들어, 도커와 함께 몽고DB 컨테이너를 시작하면 호스트의 일반 쉘에 ps-e grep 몽고를 실행하면 프로세스가 표시된다. 또한 컨테이너가 전체 OS를 내장할 필요가 없는 결과 매우 가볍고 일반적으로 약 5-100MB이다.

가상 머신과 함께 VM 내부에서 실행되는 모든 것은 호스트 운영 체제 또는 하이퍼바이저와 독립되어 있다. 가상 머신 플랫폼은 특정 VM에 대한 가상화 프로세스를 관리하기 위해 프로세스를 시작하고, 호스트 시스템은 그것의 하드웨어 자원의 일부를 VM에 할당한다. 그러나 VM과 근본적으로 다른 것은 시작 시간에 이 VM 환경을 위해 새롭고 이 특정 VM만을 위한 커널을 부팅하고 운영체제 프로세스 세트를 시작한다는 것이다. 이것은 응용 프로그램만 포함하는 일반적인 컨테이너보다 VM의 크기를 훨씬 크게 만든다. 이러한 방법은 비교적 사용법이 간단할 수 있지만 굉장히 느리다.

각각의 프로그램들이 컨테이너 안에 격리가 되어있고, 하드디스크 안에서도 격리가 되어있다.

위에서처럼 컨테이너를 격리시킬 수 있는 이유는 Cgroup과 네임스페이스를 이용해서이다.
Cgroup과 네임스페이스는 리눅스 환경에서 사용되는 것이다.
근데 어떻게 도커에서 쓸 수 있을까???

cmd 창에서 docker version 명령어를 입력한 수 서버 정보를 보면,

현재 나는 윈도우를 사용하고 있는데, 서버 정보가 리눅스로 되어있는 것을 볼 수 있다. 

구조를 살펴보면, 도커가 돌아갈 때 리눅스 환경에서 돌아가는 것이다.
따라서 Cgroup과 네임스페이스를 사용할 수 있는 것이다.

 

 

도표 출처 및 공부 내용 : 인프런 - 따라하며 배우는 도커와 CI환경 ( John Ann ) 

'Docker' 카테고리의 다른 글

컨테이너들 나열하기  (0) 2024.05.12
도커 이미지 내부 파일 구조 보기  (0) 2024.05.11
도커의 사용 흐름  (0) 2024.05.11
윈도우에 도커 설치하기  (0) 2024.05.11
도커 이미지와 도커 컨테이너의 정의  (0) 2024.05.11