VM vs Docker

topics 400-인프라 & 아키텍처
types 실습

VM vs Docker

핵심: 에뮬레이션 vs 커널 공유


구조 비교

graph TB
    subgraph VM
        hw1[하드웨어]
        hyper[하이퍼바이저]
        gos1[게스트 OS]
        gos2[게스트 OS]
        app1[앱]
        app2[앱]
        
        hw1 --> hyper
        hyper --> gos1
        hyper --> gos2
        gos1 --> app1
        gos2 --> app2
    end
graph TB
    subgraph Docker
        hw2[하드웨어]
        hos[호스트 OS + 커널]
        docker[Docker Engine]
        c1[컨테이너]
        c2[컨테이너]
        
        hw2 --> hos
        hos --> docker
        docker --> c1
        docker --> c2
    end

OSI 7계층 비교

계층              VM                  Docker
─────────────────────────────────────────────
7. 응용           ✅ 에뮬레이션        ✅ 그대로 사용
6. 표현           ✅ 에뮬레이션        ✅ 그대로 사용
5. 세션           ✅ 에뮬레이션        ✅ 그대로 사용
4. 전송 (TCP)     ✅ 에뮬레이션        ✅ 호스트 커널 공유
3. 네트워크 (IP)  ✅ 가상 NIC          ✅ veth (커널 처리)
2. 데이터링크     ✅ 가상 NIC          ✅ veth (커널 처리)
1. 물리           ❌ 하이퍼바이저 처리  ❌ 호스트 그대로

핵심 차이

VM     = L2~L4까지 가상 하드웨어로 에뮬레이션
         → 게스트 OS가 전체 네트워크 스택 보유

Docker = L2~L4 호스트 커널이 처리
         → 컨테이너는 커널 공유, namespace로 격리만

동작 비교

VM (하이퍼바이저 에뮬레이션)

게스트 OS: "NIC에 패킷 보내야지"
    ↓
가상 NIC 드라이버 (게스트 OS 안)
    ↓
하이퍼바이저: "아, 패킷 보내려는구나"
    ↓ (가로채서 해석)
호스트 커널
    ↓
물리 NIC
  • 게스트 OS가 진짜 하드웨어인 줄 알고 I/O 명령 실행
  • 하이퍼바이저가 그 명령을 가로채서(trap) 에뮬레이션
  • 명령 하나하나 해석해야 해서 느림

Docker (커널 직접 처리)

컨테이너 프로세스: "패킷 보내야지"
    ↓
시스템 콜 (send())
    ↓
호스트 커널 네트워크 스택 (공유)
    ↓
veth → docker0 브릿지 → 물리 NIC
  • 컨테이너가 시스템 콜 하면 호스트 커널이 바로 처리
  • 중간 해석 과정 없음
  • namespace로 격리만 할 뿐 같은 커널 사용