-
도커(docker). 컨테이너 vs 가상머신(Virtual Machine)SE General 2023. 11. 21. 00:37반응형
컨테이너와 VM(Virtual Machine) 모두 물리 서버의 리소스를 격리시켜 한정된 환경을 제공하는데 사용됩니다.
그렇기에 여러 부분 비슷한 특성을 보이면서도, 특징적으로 다른 부분들이 존재하는데요.
이번 글에서는 2가지를 비교하며 이해해보도록 하겠습니다.
어떻게 다른가?
먼저, 컨테이너와 VM 모두 실행될 host가 필요합니다. 이러한 host는 노트북, 데이터 센터의 bare metal 서버, 퍼블릭 클라우드의 인스턴스 등에 해당됩니다.
먼저, 가상화를 통해 3개의 앱을 실행한다고 가정해보겠습니다.
그러면 위 이미지의 좌측과 같이, 물리 서버에 하이퍼바이저를 띄우고 하이퍼바이저가 물리 서버의 리소스(CPU, RAM, storage, network card 등)를 나누어 VM에게 할당하고 패키징합니다. 이러한 소프트웨어 구조체인 VM에 운영체제를 설치하고 앱을 실행하게 됩니다. 각 VM 내부에서는 실제 물리 서버의 운영체제와 같이 동작합니다.
만약 이러한 앱들을 컨테이너에 기반해 실행한다면 구조는 위 이미지의 오른쪽과 같습니다.
서버가 실행되고 운영체제가 실행됩니다. 이러한 컨테이너 모델에서 host의 운영체제는 모든 하드웨어 리소스를 사용합니다. 이후 Docker와 같은 컨테이너 엔진을 설치합니다. 그러면 컨테이너 엔진이 운영체제 리소스(process tree, filesystem, network stack 등)를 쪼개어 컨테이너라고 불리는 가상 운영체제에 할당하고 패키징합니다. 각 컨테이너 내부에서는 실제 물리 서버의 운영체제와 거의 같이 동작합니다 (일부 다른 부분이 있긴 합니다. 특정 컨테이너가 host의 하드웨어에 접근해 미치는 영향이 타 컨테이너도 받는 등 [1]).
크게보면, 하이퍼바이저는 하드웨어 가상화입니다. 그렇기에 물리 서버의 하드웨어 리소스를 나누어 VM이라는 가상 레이어에 할당합니다.
반면 컨테이너는 운영체제 가상화입니다. 그렇기에 운영체제 리소스를 컨테이너라는 가상 레이어에 할당합니다.
기존에 있던 가상화 대신 컨테이너화한 이유는 무엇인가?
가상화는 컨테이너화보다 오래전부터 사용되온 기술입니다 (하이퍼바이저란? 참조). 그렇다면 왜 기존에 존재하는 가상화 대신 컨테이너화라는 방법론이 따로 발생했는지 생각해볼 필요가 있습니다. 그 부분을 위해 먼저 가상화가 어떻게 동작하는지 좀 더 자세히 살펴보겠습니다.
가상화에서는 low-lever 하드웨어 리소스를 나누어 VM에 할당합니다. 각 VM은 가상 CPU, 가상 RAM, 가상 디스크 등을 가지고 있는 소프트웨어 구조체인데요. 그렇기에 각 VM는 그러한 VM 리소스를 관리하기 위해 운영체제를 필요로 합니다.
그러나 이 부분에서 아쉽게도 운영체제는 특성마다 조금씩 다른 부하와 오버헤드를 동반합니다. 예로, 모든 운영체제는 CPU, RAM과 스토리지를 소비합니다. 또한, 어떤 운영체제는 라이센스가 필요하고 특성에 맞는 운영을 위해서 인프라와 운영인력도 필요합니다. 이렇게 각 VM은 애플리케이션 운영에 쓰일 수 있는 리소스를 조금씩 소비합니다.
이러한 가상화 구성과는 다르게 컨테이너화 구성은 공유된 하나의 운영체제 상에서 동작합니다. 그렇기에 하나의 물리 서버, 하나의 운영체제에서 수백개의 컨테이너를 실행하는 것이 가능합니다. 이것은 물리 서버 리소스는 한 개 운영체제 분량의 CPU, RAM, 하나의 라이센스만이 소비됨을 의미합니다.
고려할 다른 부분 중 한 가지는 애플리케이션 실행에 소요되는 시간입니다. 컨테이너는 오직 애플리케이션만 실행하면 되기에, VM 보다 훨씬 빠르게 실행 가능합니다.
초기의 컨테이너화는 보안적으로 여러 이슈가 문제점으로 나타났지만, 점점 많은 고도화가 진행되면서 현재는 다수가 컨테이너 형태로 애플리케이션 운영 및 배포하게 되었습니다.
Reference
[1] https://www.atlassian.com/microservices/cloud-computing/containers-vs-vms
[2] Docker Deep Dive, Nigel Poulton
반응형'SE General' 카테고리의 다른 글
컨텍스트를 이해하며 알아보는 Nginx 내부구조 (0) 2024.01.07 컨텍스트를 이해하며 알아보는 JMeter 내부구조 (0) 2024.01.05 콘웨이의 법칙(Conway's Law) : '자세'를 잡지못한 조직이 '프로덕트'라는 힘을 쓸 수 없는 이유 (0) 2023.11.26 도커(docker) 내부구조(internal) (0) 2023.11.19 콜드 스타트 이슈 - 어떻게 네트워크 프로덕트를 성장시킬 것인가? (0) 2023.11.12 코딩 실력을 복리로 늘리는 최고의 방법 (0) 2023.09.27 OAuth 2.0 for Native Apps, RFC-8252 (번역) (0) 2023.09.03 주니어 개발자에게 추천하는 책 TOP 12 (0) 2023.07.23