도커 : Docker 와 VM의 차이

David kim·2022년 1월 6일
8

도커

목록 보기
2/8
post-thumbnail
post-custom-banner

도커 vs 기존 가상화(VM)

도커가 있기 이전부터 가상화 기술은 존재했었다. 당연히 도커는 기존의 가상화 기술을 기반으로 만들어졌다. 기존의 가상화 기술을 알아보고 도커와 비교해 본다면 도커를 조금 더 이해할 수 있을 것이다.

기존 가상화(VM)

가상화 이전의 시대에서는 하나의 서버에 하나의 어플리케이션만 구동시켰다고 한다. 이렇다 보니 하나의 서버에 남는 자원이 많았다. 이런 비효율성을 극복하기 위해 등장한 기술이 가상화 기술이다. 그 중 하이퍼바이저 기반의 가상화가 가장 많이 이용되었다. 하이퍼바이저는 논리적으로 분할된 공간에서 VM 이라는 독립된 가상환경을 만들고 호스트 시스템에서 VM에 깔린 게스트OS를 구동 및 모니터링하는 역할을 한다. 간단히 정리해 본다면,

VM : 분할 공간에서의 가상환경, Virtual Machine
호스트 시스템 : 서버의 OS
게스트 OS : VM 의 OS
하이퍼바이저 : 게스트OS를 구동 및 모니터링

논리적으로 구분된 공간에서 독립된 가상의 하드웨어를 할당 받은 VM들은 서로에게 어떤 영향도 미치지 않는다. 즉, 1개의 가상환경에서의 Error 가 다른 가상환경에 영향을 미치지 않는다. 이러한 장점으로 가상화 사용하게 되었다.

도커와 VM의 차이

그렇다면 도커와 VM의 차이는 무엇일까?
도커
간단하게 이야기 해본다면 바로 게스트OS의 유무라고 할 수 있다. VM에는 위에서 언급한 Guest OS가 깔린다. 하지만 도커의 컨테이너는 그렇지 않다. 컨테이너에는 Guest OS를 설치하지 않는다. 이는 자원의 효율성 측면에서 차이가 난다. VM는 하나씩 늘 때마다 OS를 위한 자원을 할당해주어야 하는 반면에 도커는 어플리케이션을 구동하는데 필요한 모든 패키지만 있으면 컨테이너를 구동시킬 수 있다.

도커는 어떻게 동작하나?

도커의 컨테이너는 호스트 OS의 커널을 공유한다. 커널이란 하드웨어 자원을 관리하고 하드웨어와 프로세스 사이의 인터페이스 역할을 수행하는 OS의 핵심 구성 요소중 하나이다. 커널을 컴퓨팅 자원을 가상화하고 이를 프로세스에 할당한다.
Redhat은 커널을 다음과 같이 설명하고 있다.

설명하자면 다음과 같습니다. 커널은 강력한 경영진(하드웨어)을 위해 일하는 바쁜 비서입니다. 비서의 할 일은 직원 및 대중(사용자)으로부터 수신되는 메시지 및 요청(프로세스)을 경영진에게 전달하고, 어디에 무엇이 저장되어 있는지 기억(메모리)하고, 특정한 시간에 누가 경영진을 얼마 동안 만날 수 있는지 결정하는 것입니다.

결과적으로 하나의 커널을 공유하고 있기 때문에 호스트 시스템에서도 컨테이너 내부의 프로세스를 볼 수 있다. 즉, 내가 만약 MySQL을 도커 컨테이너로 시작한다면 도커가 아닌 호스트의 일반 셸에서 프로세스를 검색해 본다면 (ps-e |grep MySQL) MySQL 프로세스를 발견할 수 있다.

하나의 커널 그리고 독립된 공간

호스트 프로세스에서 컨테이너 프로세스를 볼 수 있다면 이것은 독립된 공간이라고 할 수 있을까? 도커는 어떻게 독립된 공간을 만들어낼까. 이는 리눅스 커널의 Cgroup(control groups) 과 네임스페이스 기능을 이용해서 구현되어 있다. 위의 기능을 통해서 다른 프로세스 사이에 벽을 만든다. (자세한 내용은 참조[3]에서 볼 수 있다.) 그래서 혹자[4]는 위(도커와 VM의 차이)에서 설명된 그림이 틀렸다고 한다. 도커 컨테이너는 커널을 공유하고 있고 커널에서 자원과 프로세스 결리가 이루어지므로 그림은 다음과 같아야 한다고 말한다.

하지만 책의 관점으로는 위 그림은 틀렸다. 왜냐하면 도커 컨테이너들은 리눅스 커널을 사용한다. 만약 Host OS 가 macOS/Windows 라면 어떻게 컨테이너를 분리할 수 있을까? Docker Engine 은 또다른 하나의 VM 이다. VM은 Guest OS를 갖고 있다. Docker의 Guest OS가 바로 리눅스가 되고 이 위에 쌓이는 컨테이너에는 더이상 Guest OS가 깔리지 않으며 리눅스 커널의 기능으로 각 컨테이너들은 격리가 된다. 그래서 좀 더 정확한 그림을 가져와 본다면

위와 같은 그림이 가장 도커를 잘 설명한 그림이 아닐까. Docker 는 그 자체로는 VM 이기 때문에 하이퍼바이저를 포함하고 있고 실제 환경(PC)과 가상 환경(도커)의 관계에서는 Guest OS 이고 도커와 컨테이너의 관계에서는 Host OS 인 리눅스가 설치되어 있다. 해당 컨테이너에는 VM Host와는 달리 OS가 설치되어 있지 않다.

참고
[1] 따라하며 배우는 도커와 CI 환경, 위키북스, 안재원
[2] what-is-the-linux-kernel
[3] understanding-the-docker-internals
[4] docker-is-not-a-hypervisor
profile
데이터 엔지니어
post-custom-banner

0개의 댓글