❗ 하이퍼바이저 가상화와 컨테이너 가상화
가상화 기술에는 베어메탈, 하이퍼바이저, 컨테이너가 있다. 이번 글에서는 하이퍼바이저와 컨테이너에 대해 다루겠다.
✔ 하이퍼바이저 가상화
하나의 물리 서버에 가상 머신을 만들어 사용하는 것이다. 물리 서버는 호스트 서버, 가상 서버는 게스트 서버라고 부른다. Virtual Box와 VMware가 하이퍼바이저 가상화를 한다.
장점
- 운영 체제 독립성: 운영 체제에 상관없이 서로 다른 OS(VM)를 동시에 실행할 수 있다.
- 커널 격리: 각 가상 머신은 고유한 운영 체제를 실행하고, 독립적인 커널을 사용하므로 커널 수준에서 완전하게 격리된다. 보안적으로 더 나을 수 있다.
- 다양한 호환성: 서로 다른 운영 체제에서 실행해야 하는 애플리케이션이 많은 경우 하이퍼바이저가 더 효율적일 수 있다.
- 리눅스와 윈도우 운영 체제가 둘이 필요한 경우가 궁금했는데 이럴 때에는 컨테이너 말고 가상 머신 사용이 필수적인 듯하다.
단점
- 무거움: 하이퍼바이저 방식은 각 VM이 독립된 운영 체제를 실행하므로, 메모리와 CPU 오버헤드가 크다. 각각의 VM이 자체 커널과 시스템 서비스를 실행해야 하므로 더 많은 리소스를 사용한다.
- 느린 부팅 시간: 가상 머신은 운영 체제 전체를 부팅해야 하므로 시간이 오래 걸린다.
- 자원 효율성 낮음: 각각의 VM이 자체 운영 체제를 실행하므로, 가상 머신 간 자원을 공유할 수 없다.
하이퍼바이저의 역할
가상 머신에 필요한 리소스들을 할당하고 관리한다.
가상 머신이 2 개 있다고 치자. 가상 머신 1은 MAC이고, 가상 머신 2는 Linux, 호스트 서버는 윈도우이다. 각 운영 체제마다 다른 시스템 콜을 사용한다. 하이퍼바이저는 호스트 서버와 가상 머신 중간에서 시스템 콜을 변환하는 역할을 한다. 가상 머신은 호스트 서버의 리소스를 사용하기 때문이다. 즉 Linux 가상 머신에서 시스템 콜을 하면 하이퍼바이저는 호스트 서버의 운영 체제인 윈도우 시스템 콜로 변환하여 커널에 접근할 수 있도록 한다.
✔ 컨테이너 가상화
하이퍼바이저 없이 커널의 자체 기술을 사용하는 가상화이다.
장점
- 경량성: 컨테이너는 하이퍼바이저 가상화보다 가볍다. 최소한의 리소스만 사용하며, 호스트 OS의 커널을 공유한다.
- 빠른 부팅: 전체 운영 체제를 부팅할 필요 없이 애플리케이션만 격리해 실행하므로 부팅 시간이 빠르다.
- 자원 효율성: 각각의 컨테이너는 별도의 게스트 운영 체제를 실행하지 않으므로 오버헤드가 적다. 메모리와 CPU를 효율적으로 사용한다.
단점
- 커널 의존성: 서로 다른 운영 체제를 실행하려면 호스트 커널을 가상화해야 하는 추가적인 레이어가 필요하다. 예를 들어, Windows에서 리눅스 컨테이너를 실행하려면 WSL2, LinuxKit 같은 가상화 계층이 필요하다.
- 커널 격리 부족: 모든 컨테이너가 호스트 운영 체제의 커널을 공유하기 때문에 격리 수준이 하이퍼바이저보다 낮다. 만약 커널에 취약점이 있다면, 컨테이너 간의 격리도 위협받을 수 있다.
도커
도커는 컨테이너 가상화를 더 편리하게 사용할 수 있게 돕는 소프트웨어이다. 도커 컨테이너 엔진을 사용한다.
컨테이너
프로세스가 실행되는 공간을 격리한다. 두 개의 프로세스가 실행 중이면, 그 공간을 격리해서 하나의 운영 체제에 하나의 프로세스만 실행되는 것처럼 만든다. 그 공간을 컨테이너라고 한다. 운영 체제의 윗단만을 격리하여 사용하기 때문에 가볍고 빠르다.
컨테이너 가상화의 가장 큰 특징은 커널 공유이다. 모든 컨테이너들이 하나의 커널을 공유한다. 하이퍼바이저라는 중간 다리가 없어졌으니 더 효율적이다.
✔ 컨테이너 VS 하이퍼바이저
오버헤드
컨테이너 < 하이퍼바이저
오버헤드가 적은 것은 하드웨어 리소스 요청이 더 효율적으로 이루어진다는 뜻이다.
부팅 속도
컨테이너 <<< 하이퍼바이저
컨테이너는 애플리케이션만 딸깍, 하이퍼바이저는 운영체제까지 재부팅.
유지 보수
컨테이너 >> 하이퍼바이저
유지 보수에는 여러 항목이 고려되겠지만 하이퍼바이저보다는 컨테이너가 관리가 쉽다고 생각한다. 운영 체제 업데이트나 버전 관리가 필요할 때, 컨테이너는 한 번의 업데이트만으로 모든 컨테이너에 적용할 수 있는데 하이퍼바이저 가상화는 가상 머신마다 업데이트를 해 줘야 하기 때문에 번거로운 면이 있다.
반대로 생각해 보면 컨테이너가 공유하는 하나의 커널에 이상이 생겼을 경우 모든 컨테이너들에게 영향이 미친다. 이럴 때는 어떻게 관리하는지 추가로 공부해 봐야겠다.
❗ 정리
하이퍼바이저 가상화는 새로운 운영 체제의 가상 머신을 하나 더 만드는 것이고, 컨테이너 가상화는 실행 중인 프로세스 단위로 격리하여 가상화하는 것으로 이해했다. 컨테이너 가상화가 더 작은 단위로 쪼개지므로 관리하기 쉽고 실행 속도도 빠를 수밖에.. 함수도 최대한 작은 기능으로 쪼개서 여러 코드에 재사용할 수 있게 설계하라고 배우는데, 컨테이너 가상화도 비슷하다.
'Docker · Git' 카테고리의 다른 글
[Docker] 메타 데이터 수정하기, 덮어쓰기 (0) | 2024.09.19 |
---|---|
[Docker] Docker inspect 명령어 (컨데이너와 이미지 세부 정보 조회) (0) | 2024.09.12 |
[Docker] 도커 이미지와 컨테이너의 차이 (0) | 2024.09.12 |
[Docker] nginx 컨테이너 실행, 종료하기 (0) | 2024.09.12 |
[Docker] 도커 실습 환경 구축 - iTerm2, Homebrew, Git, Docker Desktop 설치 (0) | 2024.09.10 |