가상 머신과 컨테이너의 차이: 가상화하는 계층·커널·시작 속도·격리 강도·용도 비교

둘 다 한 대의 컴퓨터 위에서 여러 애플리케이션을 서로 격리해 실행하는 방식이지만, 가상화하는 계층이 다릅니다. 가상 머신은 하이퍼바이저가 CPU·메모리·디스크·네트워크 등의 하드웨어를 가상으로 만들고, 그 위에서 가상 머신마다 커널을 포함한 OS 전체를 실행합니다. 컨테이너는 호스트 OS의 커널을 공유한 채, 네임스페이스와 cgroups 같은 커널 기능으로 프로세스가 볼 수 있는 것과 쓸 수 있는 자원을 나눕니다. 컨테이너는 OS를 부팅하지 않으므로 가볍고 시작도 빠른 반면, 격리 강도와 실행할 수 있는 OS의 종류에서는 가상 머신이 앞섭니다. 클라우드에서는 가상 머신 위에서 컨테이너를 실행하는 식으로 둘을 조합해 쓰는 것이 일반적입니다.

비교 항목가상 머신컨테이너
가상화하는 계층하드웨어. 하이퍼바이저가 CPU·메모리·디스크·네트워크 장치를 가상으로 만들어 나누어 준다OS. 호스트 커널 위에서 프로세스가 볼 수 있는 것(프로세스 ID, 네트워크, 파일 시스템 등)과 쓸 수 있는 자원을 나눈다
OS 커널가상 머신마다 자신의 커널을 포함한 OS(게스트 OS)를 실행한다호스트 커널을 모든 컨테이너가 공유한다. 컨테이너 이미지에는 커널이 들어 있지 않다
실행할 수 있는 OS호스트와 다른 종류의 OS도 실행할 수 있다(Linux 호스트 위에서 Windows를 실행하는 등)호스트 커널에서 동작하는 것으로 한정된다. Linux 컨테이너에는 Linux 커널이 필요하다
이미지 크기OS 전체를 포함하므로 일반적으로 GB 단위가 된다애플리케이션과 필요한 라이브러리뿐이므로 일반적으로 가상 머신보다 훨씬 작다
시작 속도OS 부팅부터 시작하므로 수십 초에서 몇 분이 걸리는 경우가 많다프로세스를 시작하기만 하므로 빠르며, 일반적으로 몇 초 안에 동작하기 시작한다
격리 강도강하다. 하드웨어 수준에서 나누므로 게스트 OS 커널의 문제가 다른 가상 머신에 미치기 어렵다가상 머신보다 약하다. 커널을 공유하므로 커널 취약점이 악용되면 호스트나 다른 컨테이너에 영향이 미칠 수 있다
자원 효율게스트 OS마다 메모리와 CPU를 쓰므로 한 대에서 실행할 수 있는 수가 적은 편OS가 중복되지 않으므로 같은 자원으로 더 많이 실행할 수 있다
주요 용도종류가 다른 OS의 공존, 서버 통합, IaaS의 가상 머신, 강한 격리가 필요한 환경마이크로서비스, CI/CD에서의 테스트와 배포, Kubernetes를 이용한 대규모 운영, 개발 환경과 운영 환경을 맞추는 것

수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.

상황별 선택 기준

가상 머신
호스트와 다른 종류의 OS를 실행하고 싶을 때, 커널 버전과 설정을 자유롭게 고르고 싶을 때, 다른 사용자와 같은 물리 서버를 쓰는 경우처럼 강한 격리가 필요할 때 적합합니다.
컨테이너
같은 애플리케이션을 여러 개 빠르게 시작·정지하고 싶을 때, 개발부터 운영까지 같은 이미지로 실행하고 싶을 때, 작은 서비스를 많이 한 대에 모아 실행하고 싶을 때 적합합니다.

자주 묻는 질문

컨테이너가 있으면 가상 머신은 필요 없나요?

용도에 따라 다릅니다. Linux 애플리케이션을 실행하기만 한다면 대부분 컨테이너로 충분합니다. 반면 다른 종류의 OS를 실행할 때, 커널을 바꾸고 싶을 때, 강한 격리가 필요할 때는 가상 머신이 필요합니다. 클라우드에서는 사업자가 준비한 가상 머신 위에서 컨테이너를 실행하는 경우가 많아, 둘은 서로를 대체한다기보다 조합해서 쓰는 것입니다.

Windows나 macOS PC에서 Linux 컨테이너가 동작하는 이유는 무엇인가요?

Linux 컨테이너는 Linux 커널이 필요합니다. 그래서 Windows나 macOS에서 Linux 컨테이너를 실행하는 도구는 뒤에서 가벼운 Linux 가상 머신을 띄우고, 그 안에서 컨테이너를 실행합니다. 컨테이너가 호스트 커널을 공유한다는 성질은 그대로이며, 이 경우의 호스트는 가상 머신 안의 Linux입니다.

컨테이너의 격리를 강화하는 방법이 있나요?

컨테이너 안의 프로세스를 관리자(root)가 아닌 권한으로 실행하고, 불필요한 권한을 제거하고, 쓸 수 있는 시스템 콜을 제한하는 등의 방법으로 공격받았을 때의 영향을 줄일 수 있습니다. 더 강한 격리가 필요할 때는 컨테이너마다 가벼운 가상 머신을 준비해 그 안에서 컨테이너를 실행하는 방식도 있습니다.

하이퍼바이저의 타입 1과 타입 2는 어떻게 다른가요?

타입 1(베어메탈형)은 하드웨어 위에서 직접 동작하고, 그 위에서 가상 머신을 실행합니다. 여분의 계층이 없어 성능과 격리가 뛰어나며 서버와 클라우드에서 쓰입니다. 타입 2(호스트형)는 일반 OS 위에서 애플리케이션으로 동작하며, 손쉽게 쓸 수 있어 PC에서의 개발과 테스트에 자주 쓰입니다.

이해도 확인

하이퍼바이저의 유형에 대한 설명으로 올바른 것은?

  1. A하드웨어 위에서 직접 동작하는 유형과 일반 OS 위에서 애플리케이션으로 동작하는 유형이 있다
  2. B반드시 일반 OS 위에서 애플리케이션으로 동작하며 하드웨어 위에서 직접 동작하지는 않는다
  3. C유형에 따른 차이는 없으며 모두 하드웨어를 사용하지 않고 소프트웨어만으로 동작한다
정답과 해설 보기

정답: A. 하드웨어 위에서 직접 동작하는 유형과 일반 OS 위에서 애플리케이션으로 동작하는 유형이 있다

하이퍼바이저에는 하드웨어 위에서 직접 동작하며 OS를 관리하는 유형(타입 1, 베어메탈형)과 Windows나 Linux 같은 일반 OS 위에서 애플리케이션으로 동작하는 유형(타입 2, 호스트형)이 있습니다. 타입 1은 불필요한 계층이 없어 성능과 격리가 뛰어나 서버와 클라우드에서, 타입 2는 손쉽게 쓸 수 있어 PC에서의 개발이나 시험에 자주 사용됩니다. 둘 다 CPU의 가상화 지원 기능 등 하드웨어를 이용합니다.

컨테이너와 가상 머신의 차이로 올바른 것은?

  1. A컨테이너는 각각 독자적인 OS 커널을 가지고, 가상 머신은 커널을 공유한다
  2. B컨테이너는 하이퍼바이저 위에서 동작하고, 가상 머신은 OS 기능만으로 동작한다
  3. C컨테이너는 커널을 공유하고, 가상 머신은 독자적인 OS를 실행한다
정답과 해설 보기

정답: C. 컨테이너는 커널을 공유하고, 가상 머신은 독자적인 OS를 실행한다

컨테이너는 하나의 OS 커널을 공유하면서 파일 보임 방식, 프로세스, 네트워크, 사용할 수 있는 자원 등을 그룹별로 나누어 격리하는 방식입니다. OS를 통째로 부팅하지 않으므로 가볍고 시작도 빠릅니다. 가상 머신은 하이퍼바이저 위에서 각각 독자적인 커널을 포함한 OS를 실행하므로, 무거운 대신 격리가 강하고 다른 종류의 OS도 실행할 수 있습니다. 커널을 공유하는 것은 컨테이너 쪽이며, 설명이 반대로 되어 있는 선택지에 주의해야 합니다.

Linux의 컨테이너를 실현하는 커널 기능 중 네임스페이스(namespaces)와 cgroups(컨트롤 그룹)의 역할의 조합으로 올바른 것은?

  1. A네임스페이스: 프로세스에서 보이는 것(프로세스 ID, 네트워크, 마운트 등)을 나눈다, cgroups: CPU나 메모리 등 자원의 사용량을 제한·측정한다
  2. B네임스페이스: CPU나 메모리 등 자원의 사용량을 제한·측정한다, cgroups: 프로세스에서 보이는 것(프로세스 ID, 네트워크, 마운트 등)을 나눈다
  3. C네임스페이스: 컨테이너마다 별도의 커널을 부팅하여 서로를 격리한다, cgroups: 컨테이너마다 가상의 CPU를 만들어 하드웨어를 모방한다
정답과 해설 보기

정답: A. 네임스페이스: 프로세스에서 보이는 것(프로세스 ID, 네트워크, 마운트 등)을 나눈다, cgroups: CPU나 메모리 등 자원의 사용량을 제한·측정한다

컨테이너는 호스트의 커널 위에서 동작하는 보통의 프로세스에 두 가지 구조로 격리를 적용한 것입니다. 네임스페이스는 프로세스 ID, 네트워크, 마운트(파일 시스템이 보이는 방식), 호스트 이름 등을 그룹별로 나누어, 컨테이너 안의 프로세스에는 자기 몫만 보이게 합니다. cgroups는 프로세스 그룹이 사용할 수 있는 CPU 시간이나 메모리의 양을 제한하고 사용량을 측정합니다. 둘 다 커널의 기능이므로 컨테이너는 별도의 커널을 부팅하지 않으며, 하드웨어를 모방하지도 않습니다.

  1. Linux 호스트에서 Docker를 사용하여, 호스트와는 다른 배포판을 바탕으로 한 이미지로 컨테이너를 시작하고, 그 안에서 uname -r(커널의 릴리스를 표시하는 명령)과 cat /etc/os-release(배포판 정보를 표시하는 명령)를 실행했다. 결과의 설명으로 올바른 것은?
  2. 컨테이너 이미지와 컨테이너의 관계에 대한 설명으로 올바른 것은?
  3. 이뮤터블 인프라스트럭처의 사고방식에 따른, 운영 서버의 소프트웨어 업데이트 방법으로 적절한 것은?

클라우드와 컨테이너의 기초 문제 풀기

주요 용어 설명

컨테이너(Container)
애플리케이션과 그 실행에 필요한 라이브러리나 설정을 묶어, 호스트 OS의 커널을 공유하면서 다른 프로세스로부터 격리하여 실행하는 실행 단위. Linux에서는 프로세스 ID·네트워크·마운트 등이 보이는 방식을 나누는 네임스페이스와, CPU나 메모리의 사용량을 제한하는 cgroups로 실현된다. OS를 통째로 부팅하는 가상 머신보다 가볍고 시작도 빠르지만, 커널을 공유하므로 호스트와 다른 종류의 OS 커널은 실행할 수 없다. 컨테이너는 컨테이너 이미지로부터 만들어지며, Docker나 Kubernetes 등으로 생성·관리된다.
컨테이너 이미지(Container Image)
컨테이너를 만드는 바탕이 되는 읽기 전용 템플릿. 애플리케이션의 실행 파일, 라이브러리, 설정 등의 파일을 레이어로 나누어 겹치고, 시작할 명령 등의 설정을 붙인 것으로, OS의 커널은 포함하지 않는다. Dockerfile 등으로부터 만들어지며, 레지스트리에 보관하여 배포한다. 리포지토리 이름과 태그(예: web:1.4)로 지정하는 것 외에, 내용으로부터 계산한 다이제스트(sha256:…)로 고유하게 지정할 수 있다. 같은 레이어는 여러 이미지가 공유한다.
하이퍼바이저(Hypervisor)
한 대의 컴퓨터 위에서 여러 가상 머신을 동작시키기 위한 소프트웨어. 각 가상 머신의 OS에 CPU, 메모리, 장치를 나누어 주고 서로 격리한다. 가상 머신 모니터라고도 한다.
Docker
컨테이너 이미지의 작성(빌드), 레지스트리와의 이미지 주고받기, 컨테이너의 시작과 관리를 수행하기 위한 대표적인 소프트웨어 일체. Dockerfile에 쓴 명령으로 이미지를 만들고, docker run으로 컨테이너를 시작한다. -p에 의한 포트 공개, 볼륨이나 바인드 마운트에 의한 데이터 보존, 네트워크 설정 등을 수행할 수 있다. 이미지와 컨테이너의 형식은 OCI(Open Container Initiative) 사양으로 표준화되어 있어, Docker 이외의 도구로도 같은 이미지를 다룰 수 있다.
Kubernetes
다수의 머신(노드)으로 이루어진 클러스터 위에서 컨테이너를 배치하고, 개수를 유지하고, 업데이트하고, 접속 대상을 제공하기 위한 오케스트레이션 기반. 이용자는 Deployment나 Service 등의 리소스로 '바람직한 상태'를 선언하고, 컨트롤러가 실제 상태를 관찰하여 선언에 가깝게 만든다(조정, reconcile). 최소 단위는 Pod로, Pod가 사라지면 자동으로 다시 만들어지며, 롤링 업데이트나 부하에 따른 자동 스케일링도 수행할 수 있다. 줄여서 K8s라고도 쓴다.
이뮤터블 인프라스트럭처(Immutable Infrastructure)
한 번 만든 서버(가상 머신이나 컨테이너)에는 변경을 가하지 않고, 업데이트가 필요할 때는 변경을 넣은 이미지로 새로운 것을 만들어 교체하고 이전 것은 폐기한다는 운용의 사고방식. 모든 서버가 같은 이미지로 만들어지므로, 수작업의 차이가 쌓여 서버마다 구성이 어긋나는 것을 막을 수 있으며, 이전 이미지로 돌리면 간단히 원래 상태로 되돌릴 수 있다. 로그나 데이터처럼 남길 것은 서버 밖의 스토리지나 데이터베이스에 둔다.

관련 비교