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로 격리만 할 뿐 같은 커널 사용