같은 가상화인데 무엇이 다른가
가상머신(VM)과 컨테이너는 모두 하나의 물리 서버에서 여러 격리된 환경을 구동하는 가상화 기술이다. 하지만 격리의 방식과 수준이 근본적으로 다르다. 이 차이를 이해하면 어떤 상황에 VM을 쓰고, 어떤 상황에 컨테이너를 쓰는 것이 적합한지 판단할 수 있다.
가상머신의 구조
VM은 하이퍼바이저 위에 완전한 운영체제(게스트 OS)를 포함한다. 각 VM은 자체 커널, 시스템 라이브러리, 애플리케이션을 독립적으로 갖추고 있다. 하이퍼바이저가 물리 하드웨어를 추상화하여 각 VM에 가상 CPU, 가상 메모리, 가상 디스크를 제공한다. 격리 수준이 매우 높아 하나의 VM에서 커널 패닉이 발생해도 다른 VM에 영향을 주지 않는다. 다만 각 VM마다 전체 OS를 포함하므로 디스크 점유량이 크고(수 GB~수십 GB), 부팅 시간이 수십 초에서 수 분까지 걸린다.
컨테이너의 구조
컨테이너는 호스트 OS의 커널을 공유한다. 리눅스 커널의 namespaces와 cgroups 기능을 활용하여 프로세스 단위의 격리를 구현한다. namespaces는 프로세스가 볼 수 있는 자원의 범위(파일 시스템, 네트워크, PID 등)를 분리하고, cgroups는 각 컨테이너가 사용할 수 있는 CPU, 메모리, I/O의 양을 제한한다. 게스트 OS가 없으므로 컨테이너 이미지는 수십 MB 수준으로 가볍고, 시작 시간도 수 초 이내다. 성능 비교 VM은 하드웨어를 가상화하는 오버헤드가 존재한다. CPU 가상화는 VT-x, AMD-V 같은 하드웨어 지원으로 오버헤드가 크게 줄었지만, I/O 가상화에서는 여전히 네이티브 대비 성능 저하가 발생한다. 컨테이너는 커널을 직접 공유하므로 가상화 오버헤드가 거의 없다. 네이티브에 근접하는 성능을 보여주며, 같은 물리 서버에서 VM보다 훨씬 많은 수의 컨테이너를 구동할 수 있다. 보안과 격리 수준 격리 수준은 VM이 월등히 높다. VM은 각자 독립된 커널을 사용하므로 하나의 VM이 해킹당해도 다른 VM의 커널에 접근할 수 없다. 컨테이너는 커널을 공유하므로 커널 취약점이 발견되면 모든 컨테이너가 동시에 위험에 노출된다. 이 때문에 멀티테넌트 환경에서 서로 신뢰할 수 없는 워크로드를 격리할 때는 VM이 더 안전한 선택이다. gVisor나 Kata Containers 같은 프로젝트가 컨테이너의 격리 수준을 높이려는 시도를 하고 있지만, VM 수준의 격리에는 아직 못 미친다. 실무에서의 선택 기준 마이크로서비스 아키텍처, CI/CD 파이프라인, 빠른 스케일링이 필요한 환경에서는 컨테이너가 압도적으로 유리하다. 이미지 빌드, 배포, 롤백 사이클이 빠르고, Kubernetes 같은 오케스트레이션 도구와 결합하면 수백 개의 컨테이너를 자동으로 관리할 수 있다. 서로 다른 OS를 구동해야 하거나, 높은 보안 격리가 필수인 환경에서는 VM이 적합하다. 실무에서는 두 기술을 배타적으로 선택하기보다 VM 위에서 컨테이너를 운영하는 구조도 흔하다. #컨테이너 #가상머신 #Docker #VM #하이퍼바이저 #namespaces #cgroups #Kubernetes #서버가상화 #클라우드
답글 남기기