Container와 VM의 비교

Ray.H.Li
5 min readSep 25, 2019

개요

컨테이너를 도입하고자 할때 가장 먼저 알아야할 것은 가상머신(Virtual Machine, VM)과의 비교입니다. 어차피 집중해야될 대상은 어플리케이션이 잘 동작하는 것이고 내가 개발한 서비스가 어느 아키텍처에 적당할지 판단해야하기 때문입니다.

가상머신은 먼저 운영체제(예: 리눅스, 유닉스 등)를 설치하고 각종 프로그램을 설치하고 개발한 어플리케이션을 올리죠. 컨테이너의 경우는 나중에 더 자세히 소개하겠지만 도커로 배포한다는 가정하에 Dockerfile에 선언하고 생성된 도커 이미지를 동작시킵니다. 그런데 서로 어떻게 다르고 어떤 특징들이 있는지 정리하고자 합니다.

가상머신(Virtual Machine, VM)

클라우드 서비스 형태로는 기본 엔진(AWS: EC2, GCP: GCE 등)으로 제공 되며 일반적으로는 독자적으로 구성하여 운영합니다. 전가상화의 느린 속도를 개선하기 위해 현재는 반가상화 방식으로 일정 퍼포먼스를 제공하나 리얼 머신에 비해서 아직도 속도가 느린편입니다.

더 쉽게 설명을 하면 VMware, VirtualBox와 같이 Host OS위에 Guest OS를 가상화 하는 방식입니다. 예전에는 Guest OS 전체를 가상화하였습니다. 사용법이 간단하지만 무겁고 느려서 운영환경에 적용하기는 어려웠습니다. 그래서 현재는 Xen과 같은 반가상화 방식으로 구성되고 있습니다.

https://wiki.xenproject.org/wiki/Xen_ARM_with_Virtualization_Extensions_whitepaper

Container

이와 같이 가상화하는 방식은 무겁고 성능 문제가 발생하기에 프로세스를 격리하는 방안이 등장 하였습니다. 오래전부터 리눅스 환경은 chroot라고 하여 파일시스템에서 루트 디렉토리를 변경하는 명령어를 제공하였습니다. 즉 jail과 같은 환경이 생성되는 것이죠. (루트 디렉토리를 변경을 활용하여 격리) 그러나 여기에 들어갈 실행 파일과 라이브러리를 준비해야하고 설정 방법이 복잡합니다.(복잡하면 사람들이 잘 활용하지 않습니다.) 그래서 등장한 것이 LXC(Linux Container)라는 것을 제공하였습니다.

LXC 구조

LXC는 가상화된 공간을 제공합니다. 그리고 강력한 API와 간단한 도구들을 통해서 사용자가 쉽게 어플리케이션 컨테이너를 생성할 수 있게 하였습니다. 하드웨어 자원들을 cgroups을 통해 할당하고 namespace를 활용하여 프로세스나 IPC 등을 격리시켜 별로의 공간을 만드는 형태입니다. 도커도 기존에는 LXC를 기반으로 구현하였습니다.

Container vs Virtual Machine(VM)

위에서 언급한바와 같이 VM은 하이퍼바이저 위에 Guest OS가 올라가는데 그 위에 Binary와 라이브러리 등을 모두 구성해야 하기에 무겁고 성능저하가 발생합니다. (오버헤드 발생) 그런데 도커의 경우에는 하이퍼바이저가 필요 없고 도커엔진만 있으면 그 위에 어플리케이션과 바이너리 및 라이브러리가 포함된 컨테이너만 올리면 되는 구성입니다. 정리하면 OS의 자원인 커널을 공유하지만 어플리케이션 단위로 추상화하여 서로 격리하는 형태입니다. 즉 OS overhead가 없으니 Start Time도 빠르고 자원 효율성도 높습니다. 그리고 가장 큰 장점중의 하나로 Host OS가 어느 것이든지 상관없이 도커 엔진만 있으면 배포될 수가 있습니다. 이런 사항을 확장하면 멀티 클라우드, 하이브리드 환경을 구축할 수 있겠죠.

고려사항

지금까지 열심히 컨테이너에 대한 약(?)을 팔았는데 무조건적으로 컨테이너가 정답 일까요? 그건 아니겠죠. 아시겠지만 모든 것에는 정답은 없습니다. 그러면 컨테이너 환경을 구축하기 전에 어떤 사항을 고려해야할까요?

먼저 보안적인 이슈입니다. 컨테이너는 커널을 공유하고 있습니다. 즉 논리적으로 격리한 개념입니다. 당연히 물리적으로 격리한 것에 비해서 보안이 취약할 수 밖에 없습니다. 그리고 컨테이너는 MSA(Microservice Architecture)와 최적화되었을 때 빛을 봅니다. 기존에 있던 스타일의 애플리케이션을 담게되면 여러 조건들에 의해서 더 비효율적으로 동작하게 됩니다. (현 문서에서는 다루지 않음) 즉, 개발자의 노력과 시간을 들여서 컨테이너를 만들어야 효과를 본다는 것입니다.

IT 산업군을 보면 여러가지 편의성에 의해 Cloud 인프라 위에 컨테이너 환경을 구축하게 됩니다. 이와 같은 경우에는 위의 비교 내용과는 다른 관점으로 봐야합니다. 그 이유는 컨테이너가 베어메탈 위에 동작하는 것이 아니라 VM위에서 동작하기 때문이죠. 인프라 자원의 유동성과 효율성을 같이 고려해서 선택해야 합니다.

정리

지금까지 Container와 VM에 대한 소개 및 비교를 하였습니다. 인프라의 현대화를 위해 많은 산업군에서 컨테이너를 도입하고 있지만 100% 정답은 아닙니다. 즉, 컨테이너는 마법이 아닙니다. 도입하기 전에 많이 생각해보고 충분히 설계를 한 이후에 진행을 해야 효과적인 결론을 얻을 수 있을 것입니다.

--

--