개발일기

(5)컨테이너 가상화 (쉬운 도커) 본문

서버 & 클라우드/도커

(5)컨테이너 가상화 (쉬운 도커)

한둥둥 2025. 12. 7. 21:39

 

1. 왜 컨테이너 가상화가 더 선호될까?

 

모던 애플리케이션에서는 **“가볍고 빠른 실행”**이 핵심 요구사항이다.

서비스 기능이 자주 바뀌고, 배포·확장이 잦기 때문에 인프라도 그만큼 빠르게 뜨고, 적은 자원으로 많이 돌릴 수 있어야 한다.

 

컨테이너 가상화는 바로 이 점에서 하이퍼바이저 기반 가상머신(VM) 보다 유리하다.

 

 



2. 하이퍼바이저 가상화 방식

  • 구조:
    • 물리 서버 위에 Host OS
    • 그 위에 Hypervisor가 올라감
    • Hypervisor 위에 Guest OS + 앱이 각각 독립적으로 존재
  • 특징:
    • Guest OS마다 자체 커널을 가진다.
    • 시스템 콜이 Guest OS → Hypervisor → Host OS → 하드웨어를 거치기 때문에
      • 요청 경로가 길다 → 오버헤드 큼
      • VM 부팅 시 OS 부팅 시간이 필요 → 시작 속도 느림
    • 대신 커널 자체가 완전히 분리되어 있어
      • 보안·격리 측면에서는 상대적으로 더 강하다.
      • Host OS와 다른 종류의 OS도 올릴 수 있다. (예: Windows 위에 Linux VM)

 

3. 컨테이너 가상화(LXC, Docker)의 핵심



컨테이너는 하이퍼바이저 없이, Host OS의 커널을 그대로 공유하면서

프로세스 수준에서 격리하는 방식이다.

 

 

(1) 사용하는 커널 기능

  • Namespace
    • 프로세스, 파일시스템, 네트워크, 사용자, 호스트네임 등의 리소스를
    • 각 컨테이너별로 따로 가진 것처럼 보이게” 격리해 주는 기능.
  • cgroups(Control Groups)
    • 각 컨테이너(프로세스 그룹)마다
      • CPU
      • 메모리
      • 디스크 I/O
      • 네트워크 대역폭
      • 같은 리소스 사용량을 제한·관리하는 기능.

 

이 두 가지 기능(LXC 기반)을 조합해서 만든 격리된 실행 공간을 우리가 컨테이너라고 부른다.

 

 

4. 컨테이너 방식의 장점



1) Host OS 커널을 공유 → 오버헤드 감소

  • 컨테이너는 자체 커널이 없다.
  • 모든 컨테이너가 Host OS의 커널을 공유하므로
    • 시스템 콜이 곧바로 Host OS 커널로 전달
    • Hypervisor 레이어를 거치지 않음
  • 결과적으로:
    • 오버헤드가 적다
    • 하드웨어 리소스를 더 효율적으로 사용할 수 있다.

 

2) 부팅 속도 매우 빠름

  • VM:
    • Guest OS 부팅 필요 → 수 초 ~ 수십 초
  • 컨테이너:
    • OS를 새로 켜는 게 아니라,
    • 이미 떠 있는 커널 위에 프로세스를 새로 실행하는 개념
    • 보통 수 ms ~ 수 초 수준으로 기동 가능
  • 이 덕분에:
    • 오토스케일링, 롤링 업데이트, 블루/그린 배포 등
    • 모던 배포 전략에 최적화되어 있다.

 

5. 컨테이너 방식의 단점 (상대 비교)

  • 보안/격리 측면
    • 모든 컨테이너가 Host OS 커널을 공유하므로
    • 이론적으로는 커널 취약점 등에 더 민감할 수 있다.
  • OS 다양성 제약
    • Host OS가 Linux라면 컨테이너도 기본적으로 Linux 환경이어야 한다.
    • 하이퍼바이저 VM처럼
    • “Host는 Windows, Guest는 Linux” 이런 조합은 어렵다.

 

6. 한 줄 정리

  • 하이퍼바이저 가상화
    • 각 VM이 독립 커널 보유
    • → 부팅 느림, 오버헤드 큼, 보안·격리 강함, 이기종 OS 가능
  • 컨테이너 가상화
    • Host OS 커널 공유 + namespace/cgroups로 격리
    • → 부팅 빠름, 오버헤드 적음, 자원 효율 좋음, 모던 앱·배포에 최적

그리고 Docker이런 커널 기반 가상화(LXC)를 개발자가 쉽게 쓰도록 추상화한 도구라고 이해하면 된다.