개발 일기

[Docker] 가상화(Virtualization) 및 Virtual Machine과 Container 차이 본문

DevOps/Docker Kubernetes

[Docker] 가상화(Virtualization) 및 Virtual Machine과 Container 차이

개발 일기장 주인 2024. 5. 14. 01:21

메타 코딩님 강의 도커 공식 다큐먼트를 참고했습니다.

 

이전 프로젝트에서 나는 EC2에 코드를 git clone해서 직접 관련 의존성 MYSQL 등 하나하나 다 설치하는 식으로 배포를 했다. 그러나 이것은 너무나 무식한 배포 방식 이였다. 그래서 Docker와 Kubernetes를 도입해보기 위해 우선 도커의 기본이 되는 가상화의 개념부터 차근차근 정리해 보겠다.

 

가상화(Virtualization) 개념

가상화 기술이란 물리적인 하드웨어 자원(CPU,Memory 등)을 논리적인(추상화) 리소스로 제공하기 위한 기술이다. 하드웨어에서 물리적인 개념을 추상화하여 숨기고, 사용자에게는 논리적인(추상적인) 개념으로 리소스를 제공하여 사용자가 실제 컴퓨터와 같이 작동하는 것처럼 보이도록 한다. 이러한 가상화 기술은 하나의 물리적 하드웨어 리소스 위에서 여러 운영 체제(OS)를 동시에 실행할 수 있도록 해준다.

 

 인텔이 개발한 x86 아키텍처에서는 한 대의 x86 서버에서 한 개의 운영 체제만을 실행할 수 있었다. 이는 각 운영 체제를 전용 물리적 서버에서 실행해야 했기 때문에, 여러 개의 운영 체제를 실행해야 할 경우에는 그만큼의 별도 서버가 필요했다. 이로 인해 여러 운영 체제를 실행하기 위해서는 많은 비용과 유지 보수의 문제가 발생했.

그러나 가상화 기술의 등장으로 이러한 제약이 해결됐다. 가상화 기술을 사용하면 동일한 x86 서버 위에 여러 개의 가상 머신을 생성하여 각각의 가상 머신에서 리눅스, 윈도우 등 독립적으로 다양한 운영 체제를 실행할 수 있다. 이는 물리적 서버를 여러 개 구매하고 유지 보수하는 번거로움을 줄여주고, 리소스를 효율적으로 활용할 수 있도록 해줬다.

호스트 운영체제는 물리적 서버에 설치된 OS, 게스트 운영체제는 가상머신(VM)에 설치된 OS이다.

가상화 도입 전과 도입 후

컨테이너 형 가상화 방식

 

Traditional Deployment

  • 애플리케이션을 물리 서버에서 실행
  • 한 물리 서버에서 여러 애플리케이션의 리소스 한계를 정의할 방법이 없었기에, 리소스 할당의 문제 발생
  • 물리 서버 하나에서 여러 애플리케이션을 실행하면, 리소스를 과다 사용하는 인스턴스가 다른 애플리케이션의 성능 저하 유발하고 그렇다 해서 서로 다른 여러 물리 서버에서 각 애플리케이션을 실행하는 것은 리소스가 충분히 활용되지 않으며, 유지 비용 과다

Virtualizaed Deployment

  • 단일 물리 서버의 CPU에서 여러 가상 머신(VM)을 실행
  • VM간에 애플리케이션을 분리하고 애플리케이션의 정보를 다른 애플리케이션에서 자유롭게 액세스 할 수 없으므로, 일정 수준의 보안성을 제공
  • 리소스를 보다 효율적으로 활용할 수 있으며, 쉽게 애플리케이션을 추가하거나 업데이트할 수 있고 하드웨어 비용을 절감할 수 있어 더 나은 확장성 제공
  • 가상화를 통해 일련의 물리 리소스를 폐기 가능한(disposable) 가상 머신으로 구성된 클러스터로 구성 가능
  •  가상머신은 가상화된 하드웨어 상에서 자체 운영체제를 포함한 모든 구성 요소를 실행하는 하나의 완전한 머신
  • VMware라는 가상화 툴을 써봤는데 이와 같이 Host OS위에 Guest OS를 추가로 실행시키는 것이다. 즉, OS위에서 하나 이상의 OS들을 또 실행시키는 것이다. 이때 OS사이에 Hypervisor라는 것이 이를 가능하게 해준다.
  • 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 HyperVisor를 거치므로 성능 손실이 크고
  • VM에서 Guest OS를 사용하기 위한 라이브러리, 커널 등을 포함하므로 배포 시 용량도 많이 먹는다.

Container Deployment

  • 컨테이너는 VM과 유사하지만 격리 속성을 완화하여 애플리케이션 간에 운영체제(OS)를 공유하므로 각각의 컨테이너는 보다 가볍다.
  • 각 컨테이너는 VM과는 다르게 Guest OS를 포함하지 않고 Hypervisor이 아닌 Container Runtime을 통해 구현된다.
  •  도커 컨테이너를 예로 가상화된 공간을 생성할 때 리눅스 자체 기능을 사용하여 프로세스 단위의 격리 환경을 만드므로 성능 손실 없다
  • VM과 달리 커널을 공유해서 사용하므로, 컨테이너에는 라이브러리 및 실행파일만 있으므로 용량이 작다.
  • 컨테이너를 이미지로 만들었을 때 배포하는 시간이 가상 머신에 비해 빠르며, 사용할 때의 성능 손실 또한 거의 없다.

Virtual Machine과 Container의 차이 정리

위에서 언급했듯이 Virtualized Deployment는 호스트OS 위에서 게스트OS들을 돌리는데 이렇게 각각 OS를 동작시키기 위해 큰 리소스를 먹게 된다. 즉, 오버헤드가 크다. 그래서 얘를 앱을 구동하기 위해 필요한 최소한의 라이브러리(ex. JVM) 등을 포함한 묶음으로 처리하여 VM과는 다르게 게스트 OS가 각 묶음 마다 빠진다. 즉, 각각의 묶음은 각각의 Guest OS를 사용하는 것이 아니라 모두 Host OS를 사용하게 된다. 

VM은 Hypervisor가 이를 가능케 했다면 이 컨테이너는 Hypervisor가 빠지고 도커(Docker)라는 구현 기술을 통해 가능케 된다.

가상 머신 컨테이너
  • 하드웨어 레벨 가상화
  • 가상 하드웨어 환경 위에 게스트 OS 설치
  • 구현 기술: 하이퍼바이저
  • VMware, Linux KVM, Xen,  QEMU
  • OS 레벨 가상화
  • 컨테이너 엔진으로 어플리케이션 실행 환경 격리
  • 구현 기술: 도커

 

장점

  • 속도 빠름(기존 물리 시스템과 거의 유사)
  • 이미지 생성 및 공유가 쉬움
  • 단일 어플리케이션 구동을 위한 최소한의 환경만 구분

단점

  • 가상머신 방식처럼 다양한 OS를 사용할 수 없음
  • 보안적으로 완전히 격리되지 않음

 

참고: IT위키