본문 바로가기

기술면접

VM VS 컨테이너

반응형

IT 직군에서 면접 볼 때 기술 질문으로 자주 나오는 질문인 VM과 컨테이너에 차이를 한번 알아보겠습니다. 

 

가장 기본적인 형태의 대답이라고 한다면 

 

VM은 Hypervisor 위에 하드웨어를 가상화한 후 OS들이 독립적으로 생성된다. 
컨테이너는 커널부분은 호스트 OS와 공유하면서 프로세스를 격리화 시켜 OS 수준의 가상화를 제공한다

 

간단한 답변이지만 이속에는 많은 내용들이 포함되어 있습니다. 하나하나 분석해 보도록 하겠습니다. 


 

우선 가장 핵심적인 차이점을 보겠습니다.

 

VM은 호스트OS와 실제로 독립되어있다

 

VM은 하드웨어를 가상화시킵니다. 각 VM들은 호스트 OS와 별개의 가상화된 하드웨어 자원을 가지고 있습니다. 그래서 호스트 OS 또는 게스트 OS에서 단독으로 일어나는 장애가 다른 VM 또는 호스트 OS에 영향을 끼치지 않습니다. 

 

컨테이너는 호스트OS와 독립되어 있는 것처럼 보이게 만든 것이지 실제로 호스트 OS와 독립되어 있지 않다.

 

컨테이너는 하드웨어를 가상화하지 않고 공유합니다. 컨테이너는 실제로 호스트OS에서 생성된 프로세스입니다. VM에서 프로세스 목록을 확인하더라도 게스트 OS에 대한 내역을 확인할 수 없지만 컨테이너에서 프로세스를 확인해 보면 컨테이너가 프로세스 단위로 생성되어 있음을 알 수 있습니다.

 

VM

Host OS -> Hypervisor -> 하드웨어 가상화 -> Guest OS -> process

 

컨테이너

Host OS -> container engin -> process 

 

컨테이너가 VM에 비교 매우 심플한 구조입니다. 


그럼 컨테이너는 프로세스임에도 불구하고 어떻게 VM 처럼 보이는 것인지에 대해 알아보겠습니다. 

 

호스트 OS와 독립되어 있는 것처럼 보이게 만든 것

 

바로 프로세스 격리화 시키는 기술을 통해 가능합니다. 리눅스에서는 namespace와 cgroup이 바로 그것들입니다. 

 

namespace - 격리화된 공간을 의미 

 

네임스페이스의 종류는 UTS 네임스페이스, IPC 네임스페이스, PID 네임스페이스, NS 네임스페이스, NET 네임스페이스, User 네임스페이스 가 있는데 몇 가지를 통해 네임스페이스의 의미를 간단히 살펴보겠습니다. 

리눅스 VM 하나를 살펴보겠습니다. 호스트 OS와 다른 hostname을 가지고 있습니다. VM의 hostname을 변경한들 호스트OS의 hostname이 바뀔순 없습니다. 호스트OS의 PID 10번과 VM의 PID 10번은 같은 프로세스가 아닐 것입니다. 마찬가지로 호스트OS에서 계정을 하나 생성한들 VM에도 동일하게 생성되지 않습니다. 이 둘은 독립된 개체이기 때문이죠. 

 

그럼 호스트OS 입장에서 하나의 프로세스에 불구한 컨테이너가 호스트OS와 독립되어 있는 것처럼 보이게 만들기 위해서는 VM처럼 호스트 OS와 별개의 hostname, PID, User 목록 등을 가지고 있어야 할 것입니다. 이 항목들을 호스트OS와 독립된 프로세스만의 격리된 공간을 바로 네임스페이스라고 합니다. 

 

cgroup - 프로세스에서 사용 가능한 CPU, 메모리, 네트워크 대역폭, 디스크 I/O 등을 그룹 단위로 제어하는 리눅스 커널의 기능

VM은 하드웨어를 가상화한다고 했습니다. VM이 실행되기 위해서는 CPU, 메모리 등의 자원이 필요하기 때문이죠. 컨테이너도 마찬가지로 하드웨어 자원이 필요합니다. 하지만 하드웨어 가상화를 하지 않습니다. 대신 cgroup기능을 통해 호스트 OS로부터 자원을 할당받습니다. 


이번에는 컨테이너를 왜 써야 하는지에 대해 알아보겠습니다. 

 

속도와 효율 - 하드웨어를 가상화하지 않기 때문에 빠르게 실행 가능합니다. 
상태와 의존성 - 컨테이너들은 독립된 공간에서 실행되기 때문에 다른 컨테이너에 영향을 주지 않습니다. 

 

서버 코드화로 인한 표준화- dockerfile로 인해 서버를 코드화 해놓았기 때문에 작업 내역을 추적 가능하고 언제든지 재사용 가능합니다. 

 

다수의 서버에 하나의 앱을 설치하려고 합니다. 그런데 특정 서버에서 설치가 되지 않습니다. 부랴부랴 에러 메시지를 구글링해 이것저것 시도하며 겨우 해결했습니다. 그리고 다시 하나의 앱을 설치하려 합니다. 이전에 했던 어떤 작업들 때문에 설치가 되지 않습니다. 다시 구글링을 통해 이것저것 시도하다 겨우 해결했습니다. 이후 해당 작업을 했던 직원은 퇴사했습니다. 

 

이제 이들 서버들은 시간이 가면 갈수록 엄청난 차이가 날것입니다. 심지어 이전에 서버를 운영했던 직원이 퇴사하면서 어떤 작업들이 수행되었는지 추적도 쉽지 않습니다. 이러한 현상을 눈송이 서버(Snowflake Servers)라고 합니다. 모든 눈송이 서버들이 모두 각기 다른 모양을 가지고 있기 때문이죠.

 

서버 코드화로 인해서 작업 내역들이 그대로 기록되며, 여차하면 컨테이너를 다시 올리면 되기 때문에 운영적인 측면에서 매우 장점이 있습니다. 


마지막으로 기술면접에서 VM과 컨테이너의 차이에 대한 질문을 받는다면

 

  • VM은 하드웨어를 가상화해 그 위에 게스트 OS들이 독립적으로 생성된다.
  • 컨테이너는 호스트 OS와 커널을 공유하면서 namespace와 cgroup을 통해 프로세스를 격리화시킨다.
  • 컨테이너는 하드웨어를 가상화하지 않기 때문에 속도가 빠르고 다른 컨테이너들에게 영향을 끼치지 않는다.
  • 컨테이너는 서버 코드화를 통해 서버의 표준화가 가능하다.

같이 답하면 될 것 같습니다. 


 

해당 포스팅은 아래의 글들을 참조했습니다.

https://www.44bits.io/ko/keyword/linux-container#컨트롤-그룹cgroups

https://daaa0555.tistory.com/464

 

VM(가상머신) 과 Container(컨테이너)의 차이

# VM vs Container # VM 공통적으로 하나의 서버가 있고 한서버에는 어떤 운영 체제가 있건 HostOS (맥 OS, 리눅스, 마이크로소프트 윈도우) 가 올라간다. VM의 경우 호스트OS에 의해 VM을 가상화 시켜주는

daaa0555.tistory.com

 

반응형

'기술면접' 카테고리의 다른 글

포워드 프록시 VS 리버스 프록시  (0) 2022.09.18