[Docker] 1. Virtualization
가상화 (Virtualization) : 컴퓨터 자원 (Computer Resource)의 추상화
- 하드웨어 종속성 배제 : 물리적인 하드웨어 자원을 논리적인 단위로 나누고 이를 통합해 가상의 자원을 활용
리소스 가상화 (Resource Virtualization) : 컴퓨터 내 특정 자원만을 추상화
- (가상의) 메인 메모리 : 가상 메모리 (
Virtual Memory) - (가상의) 저장 장치 : 클라우드 (
Cloud) - (가상의) 그래픽 카드 :
vGPU - (가상의) 네트워크 : 가상 사설 네트워크 (
Virtual Personal Network)
플랫폼 가상화 (Platform Virtualization) : 여러 개의 프로세스을 구동할 수 있는 플랫폼을 추상화
- 에뮬레이션 (
Emulation) : 다른 컴퓨터 프로세서를 위해 쓰인 운영체제와 응용 프로그램을 실행 - 하드웨어 수준 가상화 (
H/W-level Virtualization) : 하드웨어 플랫폼 위의 하이퍼바이저를 통해 가상 머신을 관리함 -
운영체제 수준 가상화 (
O/S-level Virtualization) : 운영체제의 커널이 각각의 격리된 프로세스를 동작시킴 -
에뮬레이터 (
Emulator) : 모든 하드웨어 자원의 동작을 소프트웨어로 대체- 애뮬레이터 안의 응용 프로그램은 물리 하드웨어가 아닌 인터프리터 프로그램을 통해 실행 (
JVM)- 인터프리터 프로그램은 가상 머신에서 명령을 수행할 때마다 물리 CPU가 처리할 바이너리 코드 갱신
- 물리 CPU는 에뮬레이터를 실행하기 위한 바이너리 코드를 해석해 이를 대신 실행
- 장점 : 아키텍쳐가 전혀 다른 하드웨어 역시 가상화할 수 있음 (vs 하이퍼바이저 : 가상화할 수 없음)
- 단점 : 물리 CPU 내에서 직접 실행할 때보다 비효율적임
- 애뮬레이터 안의 응용 프로그램은 물리 하드웨어가 아닌 인터프리터 프로그램을 통해 실행 (
-
하이퍼바이저 (
Hypervisor) : 다수의 가상 머신을 생성, 실행, 제어하는 논리적 플랫폼으로써의 프로세스- 하이퍼바이저 안의 응용 프로그램은 물리 하드웨어를 하이퍼바이저에 의해 제한적으로 사용
-
하드웨어 가상 머신 (
H/W Virtual Machine) : 하이퍼바이저에 의해 생성된 가상 환경 -
Type 1. 호스팅 (
Hosting) : 하이퍼바이저가 일반 프로그램과 같이 운영체제의 소프트웨어 계층에서 실행- 장점 : 가상의 하드웨어를 구동하기에 호스트 운영 체제에 큰 제약이 없음
- 단점 : 호스트 위에 게스트를 구동하는 방식이기에 비교적 큰 오버헤드 가짐 /
GPU Passthrough미지원
-
Type 2. 네이티브 (
Native) : 하이퍼바이저를 하드웨어에 직접 임베디드되어 실행- 장점 : 별도의 호스트가 없어 오버헤드가 적음 / 하드웨어를 직접 제어하기에 효율적인 자원 사용 가능
- 단점 : 자체적인 가상 머신에 대한 관리 기능이 없기에, 이를 위한 별도의 컴퓨터나 콘솔이 필요
-
전가상화 (
Full-Virtualization) : 하이퍼바이저에서 명령을 번역- 게스트가 요청한 명령은 하이퍼바이저가 실행한 관리용 가상 머신
DOM을 통해 하드웨어에 접근 - 하이퍼바이저가 각 가상 머신들의 모든 명령을 번역하여 실행하고, 이에 맞게 자원을 할당해야 함
- 게스트가 요청한 명령은 하이퍼바이저가 실행한 관리용 가상 머신
-
반가상화 (
Para-Virtualization) : 게스트 가상 머신에서 명령을 번역- 게스트 가상 머신이 하이퍼 콜 (
Hyper Call)을 통해 하이퍼바이저에 명령을 직접 요청 - 게스트 가상 머신의 운영 체제가 하이퍼 콜을 요청할 수 있게 커널을 수정해야 함
- 게스트 가상 머신이 하이퍼 콜 (
컨테이너 (Container) : 소프트웨어 패키지 (Software Package)의 추상화
- 컨테이너는 프로세스가 동작하는 격리된 사용자 공간 인스턴스
- 하나의 응용 프로그램과 그 응용 프로그램의 동작을 위한 라이브러리로 구성
- 운영체제의 커널은 여러 개의 격리된 컨테이너를 갖추어 각각의 개별적인 서버처럼 동작시킴
- 컨테이너를 사용하는 이유?
- 가상머신보다 공간을 적게 차지하며, 재가동성 또한 가상머신보다 좋다.
- 어플리케이선과 동일한 환경 세트로 개발되기에, 테스트에서 프로덕션까지의 이식성 및 일관성에 용이하다.
- 동적으로 리소스를 사용할 수 있어, 별도의 리소스를 할당할 필요가 없다.
- 서버의 밀도를 늪일 수 있다. 즉, 서버 내의 리소스를 과다하게 사용하지 않는 선에서 최적화가 가능하다.
- 하나의 커널에서 동작하기에, 업데이트 및 패치 작업 등을 한번만 수행하면 모든 컨테이너에 적용된다.
-
리눅스 컨테이너 (
Linux Container) : 리눅스에서 제공하는 운영체제 레벨의 컨테이너 기술- 커널 레벨의 격리된 (
isolated) 공간만 제공할 뿐, 개발 및 서버 운영에 필요한 부가 기능 부족
- 커널 레벨의 격리된 (
운영체제 A에만 가능한 a, 운영체제 B에만 가능한 b, 운영체제 C에만 가능한 c을 동시에 실행한다고 가정한다면,
- 에뮬레이션 : 응용 프로그램 ×3 ⊂ 에뮬레이트 운영체제 ×3 ⊂ 에뮬레이터 ×3 ⊂ 호스트 운영체제 ⊂ 하드웨어
- Type 1. 호스팅 : 응용 프로그램 ×3 ⊂ 게스트 운영체제 ×3 ⊂ 하이퍼바이저 ⊂ 호스트 운영체제 ⊂ 하드웨어
- Type 2. 네이티브 > 전가상화 : 응용 프로그램 ×3 ⊂ 게스트 운영체제 ×3 ⊂ DOM ⊂ 하이퍼바이저 ⊂ 하드웨어
- Type 2. 네이티브 > 반가상화 : 응용 프로그램 ×3 ⊂ 수정된 게스트 운영체제 ×3 ⊂ 하이퍼바이저 ⊂ 하드웨어
- 운영체제 수준 가상화 : 컨테이너 프로세스 ×3 ⊂ 컨테이너 관리 소프트웨어 ⊂ 운영체제 ⊂ 하드웨어
- Q.
MacOS에서 도커로 윈도우 컨테이너를 실행하는 경우엔? : 응용 프로그램을 실행할 때 (O) 운영 체제를 실행할 때 (X)- 윈도우 컨테이너 ⊂ 가상 머신 (호스팅) ⊂ 컨테이너 관리 소프트웨어 ⊂ 운영체제 ⊂ 하드웨어