가상화란?
가상화(Virtualization)는 물리적인 컴퓨팅 리소스를 논리적으로 분리하여 하나의 물리적 장비에서 여러 환경을 실행할 수 있게 하는 기술이다. 가상화를 통해 서버, 스토리지 장치, 데스크탑 시스템과 같이 물리적 형태로만 이용 가능했던 리소스를 디지털 형식으로 추상화할 수 있다. 이를 통해 대규모 시스템의 리소스를 효율성이 향상되고 공유가 간편한 더 작은 크기의 부분으로 세분화함으로써 하드웨어 리소스를 더 효율적으로 사용할 수 있다.
가상화의 일반적인 용도 중 하나는 다른 운영체제로 설계된 애플리케이션을 특정 하드웨어 없이 실행할 수 있게 해주는 것이다. 이를 가능하게 하는 핵심요소는 하이퍼바이저(Hypervisor)와 가상 머신(Virtual Machine)이다
하이퍼바이저(Hypervisor)
하이퍼바이저는 물리적 하드웨어와 가상머신 사이에서 자원을 관리하는 소프트웨어 계층.
운영체제 위에서 직접 실행되거나, 물리적 하드웨어 위에서 동작하여 가상머신이 하드웨어를 공유하고 독립적으로 실행할 수 있도록한다.
기능: 자원 할당, 가상 머신 관리, 하드웨어 에뮬레이션 제공, 가상 머신 격리.
가상화 유형
전가상화(Full Virtualization)
물리적 하드웨어 위에 하이퍼바이저(Hypervisor) 설치 → 그 위에 게스트 OS(Guest OS) 설치.
호스트 OS 없음: 물리적 운영 체제가 필요하지 않으며, 하이퍼바이저가 직접 하드웨어를 제어
- 게스트 OS는 수정이 필요 없음 (기존 OS 그대로 설치 가능).
- 하이퍼바이저가 하드웨어 자원을 완전히 에뮬레이션.
- 하드웨어 가속이 없으면 성능이 떨어짐.
반가상화(Paravirtualization)
물리적 하드웨어 위에 하이퍼바이저(Hypervisor) 설치 → 그 위에 수정된 게스트 OS(Guest OS) 설치.
게스트 OS 수정 필요: 게스트 OS는 하이퍼바이저와 협력하도록 수정된 드라이버 필요.
- 하이퍼바이저와 게스트 OS가 직접 통신하여 하드웨어 접근 속도가 향상됨.
- 성능이 더 빠름, 하드웨어 가속이 없어도 효율적임.
- 하지만 게스트 OS를 수정해야 하므로 범용 운영 체제를 지원하기 어려움.
가상 머신(Virtual Machine, VM)
가상 머신은 소프트웨어로 구현된 컴퓨터. 운영 체제, 애플리케이션, 데이터 등을 포함하여 물리적 컴퓨터처럼 동작하며, 하이퍼바이저 위에서 실행.
가상 머신의 구성 요소
- 가상 CPU (vCPU)
- 가상 메모리 (vRAM)
- 가상 디스크 (vDisk)
- 가상 네트워크 인터페이스 (vNIC)
가상 머신의 작동 원리
- 부팅 과정: 하이퍼바이저는 가상 머신 이미지를 로드하여 물리적 하드웨어 자원을 가상 자원으로 변환
- 가상화 명령어 실행: CPU 명령어가 하이퍼바이저로 전달되며, 하드웨어 가속 기술(Intel VT-x, AMD-V 등)을 통해 가상 머신의 성능을 최적화
- 입출력(I/O) 관리: 하드 디스크, 네트워크 등 모든 입출력은 하이퍼바이저가 관리하여 물리적 장치에 전달
도커(Docker)의 등장
도커 컨테이너는 애플리케이션과 필요한 모든 실행환경을 격리된 환경에서 실행할 수 있는 가상화 기술
기존 가상화방식은 커널을 여러개두고 하이퍼바이저가 중개 및 변환하는 방식으로 가상화를 구현해, 하드웨어 에뮬레이션 오버헤드가 발생했다. 하지만 하나의 os 커널에서 논리적인 실행환경을 분리하는 기술이 등장하면서 컨테이너 방식의 가상화가 등장했다. 컨테이너는 호스트 운영 체제의 커널을 공유하기 때문에 변환 오버헤드가 적고 가볍고 빠르다.
전가상화와 반가상화의 한계
- 각 가상 머신은 독립된 운영 체제(OS)를 실행하므로 CPU, 메모리, 디스크 사용량이 큼
- 가상 머신은 부팅 시간이 길고 스토리지 사용량이 큼
- 가상 머신 이미지 크기가 커서 개발 환경과 배포 환경 간 이식성이 떨어짐
Docker 컨테이너의 주요 특징
- 컨테이너(Container) 기반 가상화: 가상 머신은 하드웨어를 가상화하지만 Docker는 운영 체제를 가상화하여 가볍고 빠른 환경 격리를 제공
- 운영 체제(OS) 공유: 컨테이너는 동일한 커널을 사용하고 게스트 OS가 필요 없음. CPU와 메모리 사용량이 적고 운영체제 부팅과정이 필요 없으므로 실행이 빠름.
- 이식성: "한 번 빌드하면 어디서나 실행"할 수 있는 컨테이너 이미지를 제공.
- 격리: 각 컨테이너는 독립된 프로세스 공간에서 실행되며, 다른 컨테이너나 호스트 OS와 분리되어 충돌방지 및 보안성 향상
- 이미지 기반 : 도커 이미지에 컨테이너 실행에 필요한 애플리케이션과 모든 종속성을 포함. 이미지 생성 후 변경이 불가능하고 새로운 이미지를 빌드해야 한다.
- 버전 관리 : 도커 이미지는 버전관리가 가능하며 롤백도 지원
Docker 컨테이너 | 가상머신(VM) | |
가상화 대상 | 애플리케이션과 실행 환경 | 전체 운영 체제(OS + 앱) |
커널 공유 여부 | 호스트 OS 커널 공유 | 독립된 OS 포함 |
크기(이미지 용량) | 작음 (수백 MB) | 큼 (수 GB 이상) |
부팅 속도 | 빠름 (몇 초) | 느림 (몇 분) |
자원 사용량 | 적음 (CPU, 메모리 효율적) | 많음 (자원 과다 사용) |
사용 사례 | 마이크로서비스, DevOps | 복잡한 서버 애플리케이션 운영 |
가상화는 물리적 자원을 효율적으로 관리하기 위한 기술로, 무겁고 느린 하이퍼바이저 기반의 가상화 방식에서 가볍고 빠른 도커 컨테이너 방식으로 발전해왔다. 이를 기반으로 Kubernetes 와 같은 컨테이너 오케스트레이션 도구가 등장했는데 이는 다음시간에 계속해 알아보자.
'개발 환경 및 운영 > Kubernetes' 카테고리의 다른 글
Kubernetes의 Persistent Volume과 Persistent Volume Claim (0) | 2025.01.25 |
---|---|
Kubernetes의 네트워크 리소스: Ingress (with ALB) (0) | 2025.01.07 |
Kubernetes의 서비스(Service) (1) | 2025.01.01 |
Kubernetes의 구성요소 알아보기 (Pod, ReplicaSet, Deployment) (1) | 2024.12.23 |
Docker에서 Kubernetes로 (1) | 2024.12.19 |