Docker와 VM 차이 — 컨테이너 vs 가상머신 구조·성능·선택 기준 비교


“VM이랑 Docker가 비슷한 거 아닌가요?” 개발을 처음 배우는 분들이 가장 많이 하는 질문 중 하나입니다. 둘 다 ‘격리된 환경에서 앱을 실행한다’는 목표는 같지만, 작동 방식은 근본적으로 다릅니다. Docker VM 차이를 제대로 모르면 Docker를 써야 할 때 VM을 쓰거나, 그 반대의 선택을 하게 됩니다. 이 글에서는 VM과 Docker의 구조적 차이부터 성능·보안·이식성 비교, 실전에서 어느 것을 선택해야 하는지의 기준까지, 코드 한 줄 없어도 이해할 수 있도록 쉬운 비유와 함께 완벽하게 정리합니다.


목차

  1. VM(가상머신)이란? — 내 컴퓨터 안에 또 다른 컴퓨터를 만드는 기술
  2. Docker(컨테이너)란? — OS는 공유하고 앱만 격리하는 기술
  3. VM vs Docker 구조 핵심 차이 — 단독주택 vs 아파트 비유
  4. 성능·용량·속도 실제 차이 비교
  5. 보안·격리·이식성 관점에서의 차이
  6. 언제 VM을, 언제 Docker를 써야 하는가 — 실전 선택 기준

1. VM(가상머신)이란? — 내 컴퓨터 안에 또 다른 컴퓨터를 만드는 기술

가상머신의 개념

가상머신은 쉽게 말해, 내 컴퓨터 안에 또 하나의 컴퓨터를 만드는 기술입니다. 실제로는 하드웨어가 하나뿐이지만, 소프트웨어적으로 가상의 하드웨어를 만들어내서 그 위에 완전히 별도의 운영체제(OS)를 설치하고 실행합니다. Kareit

우리가 윈도우 컴퓨터에서 VMware나 VirtualBox를 설치해 리눅스를 돌려본 경험이 있다면, 그것이 바로 VM입니다. 화면 안에 또 다른 화면이 뜨고, 그 안에서 완전히 별개의 운영체제가 돌아가는 것입니다.

VM을 가능하게 하는 핵심 소프트웨어 — 하이퍼바이저

가상머신은 하드웨어를 가상화하여 하나의 서버에서 여러 개의 독립적인 운영체제(OS)를 실행하는 기술입니다. VM은 하이퍼바이저(Hypervisor)라는 소프트웨어 위에서 동작합니다. Kareit

하이퍼바이저는 실제 하드웨어(CPU, RAM, 디스크, 네트워크)를 여러 VM에 나눠주는 관리자 역할을 합니다. 각 VM은 마치 자신이 진짜 하드웨어를 독점하는 것처럼 동작합니다.

VM의 레이어 구조를 정리하면 이렇습니다.

┌─────────────────────────────────────┐
│  App A    │  App B    │  App C      │  ← 애플리케이션
├───────────┼───────────┼─────────────┤
│ Guest OS  │ Guest OS  │ Guest OS    │  ← 각 VM마다 독립 OS
│ (Ubuntu)  │ (CentOS)  │ (Windows)  │
├───────────┴───────────┴─────────────┤
│         Hypervisor (하이퍼바이저)    │  ← VM 관리자
├─────────────────────────────────────┤
│         Host OS (호스트 OS)          │  ← 실제 컴퓨터의 OS
├─────────────────────────────────────┤
│         Hardware (하드웨어)          │  ← 실제 물리 서버
└─────────────────────────────────────┘

VM의 장점과 단점

VM은 각 가상 머신이 완전히 독립된 OS를 가지기 때문에 격리 수준이 매우 높습니다. 한 VM에서 무슨 일이 일어나도 다른 VM에 영향을 주지 않습니다. 다른 VM에서 돌아가는 운영체제를 완전히 다르게 설정할 수 있고, 보안 측면에서도 커널 레벨까지 완전히 분리됩니다.

단점은 무겁다는 것입니다. 가상머신은 호스트 운영체제 위에 올라가지만 독립된 운영체제를 따로 가져야 합니다. OS 하나만 해도 수 GB를 차지하고, 부팅에 수십 초~수 분이 걸립니다. VM 3개를 만들면 OS도 3개가 필요합니다. Kareit


2. Docker(컨테이너)란? — OS는 공유하고 앱만 격리하는 기술

Docker의 핵심 아이디어

Docker는 가상머신과 다르게 하나의 운영체제(OS)에서 여러 개의 컨테이너를 실행하는 기술입니다. 가장 결정적인 차이는 게스트 OS가 없다는 것입니다. 모든 컨테이너는 호스트 OS의 커널을 공유해서 사용합니다. MolitMolit

커널(Kernel)은 운영체제의 핵심 부분으로, 하드웨어와 소프트웨어 사이의 통역사 역할을 합니다. Docker의 컨테이너들은 이 커널을 공유하면서도, 서로 다른 앱이 충돌하지 않도록 격리(Isolation)합니다.

이 격리는 리눅스 커널의 두 가지 핵심 기술로 구현됩니다.

  • Namespace: 프로세스·네트워크·파일시스템을 각 컨테이너마다 독립된 공간으로 분리합니다. 컨테이너 안에서는 자신만의 세계가 있는 것처럼 보입니다.
  • Cgroups(Control Groups): CPU, 메모리 등 자원 사용량을 컨테이너별로 제한하고 관리합니다.

Docker의 레이어 구조

┌──────────────────────────────────────┐
│ Container A  │ Container B  │ Cont C │  ← 컨테이너 (앱 + 라이브러리만)
│ (App + Libs) │ (App + Libs) │ ...    │
├──────────────────────────────────────┤
│         Docker Engine                │  ← 컨테이너 관리자
├──────────────────────────────────────┤
│         Host OS (커널 공유)           │  ← 하나의 OS
├──────────────────────────────────────┤
│         Hardware                     │  ← 실제 물리 서버
└──────────────────────────────────────┘

VM과 비교하면 Guest OS 레이어가 통째로 사라진 것이 보입니다. OS를 중복으로 여러 개 올리지 않아도 되기 때문에 훨씬 가볍습니다.

Docker 이미지와 컨테이너의 관계

Docker를 처음 배울 때 헷갈리는 개념이 이미지(Image)와 컨테이너(Container)의 차이입니다.

  • Docker 이미지: 앱을 실행하기 위한 모든 것(코드, 라이브러리, 설정)을 담은 읽기 전용 템플릿입니다. 붕어빵 틀에 비유할 수 있습니다.
  • Docker 컨테이너: 이미지를 실행한 인스턴스입니다. 붕어빵 틀로 찍어낸 붕어빵입니다.

같은 이미지로 컨테이너를 수십 개 만들 수 있고, 모두 동일한 환경에서 실행됩니다.

dockerfile

# Dockerfile — 이미지를 만드는 설계도
FROM node:18-alpine       # 베이스 이미지
WORKDIR /app              # 작업 디렉토리
COPY . .                  # 소스 복사
RUN npm install           # 의존성 설치
EXPOSE 3000               # 포트 노출
CMD ["node", "app.js"]    # 실행 명령

VM보다 훨씬 가볍고 빠르며, 환경을 코드로 정의한 Dockerfile 하나로 동일한 환경을 어디서든 재현할 수 있습니다. 이것이 “내 컴퓨터에서는 되는데 서버에서는 안 돼요” 문제를 Docker가 해결하는 원리입니다. Kareit


3. VM vs Docker 구조 핵심 차이 — 단독주택 vs 아파트 비유

가장 직관적인 비유

VM은 집 한 채(🏠)와 같아서 각 집마다 전기, 수도, 가스 등 모든 인프라를 따로 가져야 합니다. Docker는 아파트(🏢)와 같아서 한 개의 큰 건물(OS)에서 여러 가구(컨테이너)가 공유하여 사용합니다. Kareit

VM (단독주택):

  • 각 집마다 수도 파이프, 전선, 가스관이 따로 있습니다
  • 이웃집에서 무슨 일이 일어나도 내 집에 영향 없습니다
  • 집을 짓는 데 시간이 오래 걸리고 비용이 많이 듭니다
  • 각 집의 구조를 완전히 다르게 지을 수 있습니다

Docker (아파트):

  • 전체 건물이 수도·전기를 공용으로 사용합니다(OS 커널 공유)
  • 각 호실은 벽으로 격리되어 있지만 완전히 독립된 건물은 아닙니다
  • 입주하는 데 몇 초밖에 안 걸립니다
  • 같은 건물 구조(OS 커널)를 사용해야 하는 제약이 있습니다

구조 차이가 만드는 실질적 결과

이 구조 차이 하나가 성능, 용량, 속도, 보안에 걸쳐 완전히 다른 특성을 만들어냅니다.

구분VMDocker
OS 포함 여부각 VM마다 완전한 Guest OS 포함Host OS 커널 공유, Guest OS 없음
크기수 GB (OS 포함)수십~수백 MB (앱+라이브러리만)
시작 속도수십 초 ~ 수 분수 초 이내
격리 수준커널 레벨 완전 격리프로세스 레벨 격리
리소스 효율낮음 (OS 오버헤드)높음
이식성낮음 (OS 의존)높음 (이미지로 어디서든 동일)
핵심 기술하이퍼바이저Namespace + Cgroups

4. 성능·용량·속도 실제 차이 비교

시작 속도 — 초 vs 분

Docker 컨테이너는 이미 커널이 실행 중인 Host OS 위에서 프로세스 하나를 시작하는 것에 불과합니다. 이 때문에 몇 초 안에 준비됩니다. VM은 전원 버튼을 눌러 컴퓨터를 부팅하는 것과 같습니다. BIOS부터 OS 부팅 과정 전체를 거쳐야 하므로 수십 초에서 수 분이 소요됩니다.

클라우드 환경에서 갑자기 트래픽이 몰려 서버를 10대 더 늘려야 한다고 생각해보세요. Docker는 몇 초 만에 10개의 컨테이너를 띄울 수 있지만, VM은 수 분이 걸립니다. 이것이 Docker가 스케일 아웃(서버 수를 늘려 대응)에 압도적으로 유리한 이유입니다.

용량 — GB vs MB

Node.js 웹 앱 하나를 실행하는 환경을 만든다고 가정하면 VM은 Ubuntu OS(최소 1~2GB) + Node.js + 앱 코드를 모두 포함해야 합니다. 총 2~4GB 이상이 됩니다. Docker는 node:18-alpine 베이스 이미지(약 50MB) + 앱 코드와 라이브러리만 담으면 됩니다. 총 100~200MB 수준입니다.

서버 하나에 올릴 수 있는 앱 수도 달라집니다. 32GB RAM 서버에 VM은 몇 개, Docker는 수십~수백 개가 올라갈 수 있습니다.

성능 오버헤드

반가상화 방식으로 일정 퍼포먼스를 제공하나 실제 머신에 비해서 아직도 속도가 느린 편입니다. VM은 하이퍼바이저가 모든 하드웨어 접근을 중간에서 가로채고 번역하는 오버헤드가 존재합니다. Docker는 Host OS의 커널을 직접 사용하기 때문에 실제 머신 성능에 거의 근접합니다. 컴퓨팅 집약적인 작업(머신러닝, 데이터 처리 등)에서 이 차이가 더 크게 나타납니다. Kareit


5. 보안·격리·이식성 관점에서의 차이

보안과 격리 — VM이 더 강하다

VM은 커널 레벨에서 완전히 격리됩니다. 한 VM이 악성 코드에 감염되더라도 같은 호스트의 다른 VM에 영향을 주기 매우 어렵습니다. 보안상 가장 강한 격리가 필요한 환경(금융, 의료, 멀티테넌트 클라우드)에서 VM이 여전히 선호되는 이유입니다.

Docker 컨테이너는 Host OS의 커널을 공유하기 때문에, 이론적으로 컨테이너 탈출(Container Escape) 취약점이 존재할 수 있습니다. 일반적인 비즈니스 환경에서는 충분히 안전하지만, 완전한 격리가 필요한 환경에서는 주의가 필요합니다.

이식성 — Docker가 압도적으로 유리

컨테이너와 비교해 VM은 OS, 애플리케이션, 라이브러리에 의존하게 되어 VM의 이식성이 크게 저하됩니다. VM 이미지는 보통 수십 GB에 달해 이동하고 공유하기 불편합니다. Daishin

Docker 이미지는 Docker Hub(도커의 GitHub 같은 이미지 저장소)에 올려두면 전 세계 어디서든 docker pull 이미지명 한 줄로 동일한 환경을 즉시 실행할 수 있습니다. 개발자 로컬, CI/CD 파이프라인, 스테이징 서버, 프로덕션 서버 — 모두 동일한 환경이 보장됩니다.

Windows/macOS에서 Docker를 사용할 때의 특이점

Docker는 리눅스 커널을 공유하는 방식이기 때문에, 리눅스가 아닌 환경에서는 약간의 보정이 필요합니다.

윈도우나 macOS는 근본적으로 리눅스 커널을 쓰고 있지 않으므로, 해당 운영체제의 경우 리눅스 커널을 VM의 형태로 실행시키는 하이퍼바이저(Hyper-V, LinuxKit, HyperKit)를 자체적으로 구동합니다. 윈도우용 또는 macOS용 Docker는 하이퍼바이저 위의 리눅스 커널을 사용하는 것입니다. Daishin

즉, Windows나 Mac에서 Docker Desktop을 설치하면 내부에 경량 리눅스 VM이 자동으로 돌아가고, 그 위에서 컨테이너가 실행됩니다. 사용자는 이 VM을 신경 쓸 필요가 없습니다.


6. 언제 VM을, 언제 Docker를 써야 하는가 — 실전 선택 기준

Docker를 선택해야 하는 경우

① 마이크로서비스 아키텍처 구축

여러 개의 작은 서비스(API 서버, 인증 서버, DB, 메시지 큐 등)를 독립적으로 배포하고 관리해야 할 때 Docker + Docker Compose 또는 Kubernetes가 표준입니다.

② 빠른 개발·배포 사이클이 필요할 때

Docker는 코드 변경 후 이미지 빌드 → 컨테이너 실행까지 수십 초 안에 이루어집니다. CI/CD 파이프라인과 결합하면 코드 커밋 후 수 분 안에 프로덕션 배포가 가능합니다.

③ “내 환경에서는 되는데 서버에서 안 돼요” 문제를 해결하고 싶을 때

Docker 이미지에는 앱 실행에 필요한 모든 의존성이 패키징되어 있어, 어디서 실행하든 완전히 동일한 환경이 보장됩니다.

④ 리소스 효율을 높이고 싶을 때

하나의 서버에 수십 개의 서비스를 동시에 올려야 한다면 VM보다 컨테이너가 훨씬 효율적입니다.

yaml

# docker-compose.yml — 여러 서비스를 한 번에 정의
version: '3'
services:
  web:
    image: my-app:latest
    ports:
      - "3000:3000"
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secret
  redis:
    image: redis:alpine

VM을 선택해야 하는 경우

① 완전한 OS 격리가 필요할 때

보안 요구사항이 매우 높거나, 서로 다른 고객의 워크로드를 한 서버에서 완전히 격리해야 하는 멀티테넌트 환경에서 VM의 완전 격리가 필요합니다.

② 다른 운영체제에서 실행해야 할 때

리눅스 서버에서 Windows 서버 환경을 실행하거나, macOS 앱을 테스트해야 한다면 VM이 필요합니다. Docker는 Host OS와 다른 커널을 가진 OS를 실행할 수 없습니다.

VM은 모놀리식 워크로드 패키징에 사용되는 기존 방식으로, 기존·레거시·모놀리식 워크로드 수용에 가장 적합합니다. Daishin

③ 레거시 시스템 운영

기존에 VM으로 운영 중인 레거시 시스템을 Docker로 전환하는 데 비용과 위험이 크다면, 계속 VM을 사용하는 것이 현실적인 선택입니다.

실전에서는 VM + Docker를 함께 쓴다

컨테이너와 VM은 각각 용도가 있습니다. 실제로 많은 컨테이너 배포는 특히 클라우드에서 컨테이너를 실행할 때 하드웨어에서 직접 실행하지 않고 호스트 운영체제로 VM을 사용합니다. Hanmiglobalamc

AWS, GCP, Azure 같은 클라우드 환경을 실제로 보면 이런 구조입니다.

물리 서버 (데이터센터)
    └── 하이퍼바이저
        ├── VM (EC2 인스턴스)         ← VM이 여기까지
        │   ├── Docker Engine
        │   │   ├── Container (웹앱)  ← Docker가 여기서
        │   │   ├── Container (DB)
        │   │   └── Container (Redis)
        └── VM (또 다른 EC2 인스턴스)

AWS EC2(VM) 위에 Docker를 설치하고 컨테이너를 돌리는 구조가 현업 표준입니다. VM은 클라우드 기반 격리를, Docker는 앱 수준의 경량 격리와 이식성을 담당합니다. 두 기술은 경쟁이 아니라 보완 관계입니다.

한눈에 정리 — 선택 기준표

상황선택
빠른 배포·스케일링이 필요하다✅ Docker
개발 환경을 코드로 관리하고 싶다✅ Docker
마이크로서비스 아키텍처✅ Docker
CI/CD 파이프라인 구축✅ Docker
완전한 OS 격리가 필요하다✅ VM
다른 OS에서 실행해야 한다✅ VM
레거시·모놀리식 앱 운영✅ VM
클라우드 인프라 기반 격리✅ VM + Docker

결론

Docker VM 차이를 한 줄로 압축하면 이렇습니다. VM은 OS까지 통째로 가상화하는 단독주택, Docker는 OS 커널을 공유하며 앱만 격리하는 아파트입니다. VM은 완전한 격리와 다른 OS 실행이 강점이고, Docker는 가볍고 빠른 이식성과 배포 효율이 강점입니다. 현업에서는 클라우드 VM 위에 Docker를 올리는 조합이 사실상 표준입니다. Docker를 처음 배운다면 오늘 로컬에 Docker Desktop을 설치하고 docker run hello-world 한 줄을 직접 실행해보는 것이 이 모든 개념을 몸으로 이해하는 가장 빠른 방법입니다.


ℹ️ 참고 안내 본 글은 Docker 개념과 VM 비교에 관한 일반적인 교육·정보 목적으로 작성되었습니다. Docker의 세부 기능과 보안 설정은 Docker 공식 문서(docs.docker.com)를 참고하시기 바랍니다. 실무 환경에서는 Docker Compose, Kubernetes 등 오케스트레이션 도구를 함께 학습하는 것을 권장합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다