베어메탈?
하이퍼바이저?
컨테이너?
베어메탈 (Baremetal)
--
일반적으로 한 컴퓨터에서 각자 프로그램들을 실행시키는 방식과 비슷하다.
컴퓨터(서버)를 하나 구하고 해당 (하드웨어)서버에 OS를 설치 후 여러 소프트웨어들을 실행시키는 방식이다.
(DB 서버, 웹 서버, 웹 애플리케이션 서버 등)
이 베어메탈 방식은 기업에서 사용하기에는 적합하지 않다.
위 그림처럼 하나의 서버에 프로그램 4개를 실행시킨다고 해보자.
윈도우 OS를 실행하면 기본으로 CPU 1 Core와 메모리 8 GB가 사용된다.
총 5 Core / 40 GB RAM을 사용하게 된다.
여기까지는 메모리도 넉넉하게 남아있고 서버를 사용하기에는 문제가 없다.
오히려 하나의 OS에서 프로그램들을 실행하여 관리하니 편하다.
다만 하나의 OS에서 프로그램들을 실행하여 관리하는 것이 단점이 될 수가 있다.
실행도중 하나의 프로그램에서 오류가 발생하면 같은 OS에서 실행 중인 다른 프로그램에도 영향을 줄 수가 있게 된다.
그리고 예상치 못하게 하나의 프로그램 사용량이 갑자기 급증하게 되면 리소스를 모두 소모하게 되므로
실행 중인 나머지 프로그램들도 정상적으로 동작하지 않을 위험이 있다.
그래서 기업에서는 운영 중인 환경이 멈추게 되는 것은 아주 큰 장애로 이어질 수 있기 때문에
베어메탈 방식 운영은 적합하지 않은 것이다.
그래서 가상화 환경을 사용하는 하이퍼바이저 또는 컨테이너 방식을 사용한다.
--
가상화 환경
--
가상화 환경이란
OS안에 가상의 OS를 설치하여 사용하는 환경으로
간단하게 설명하자면 컴퓨터안에 또 하나의 컴퓨터를 설치하는 것이다.
위 그림처럼 하나의 OS에서 여러 개의 가상 환경을 만들 수가 있다.
가상환경을 만들 때에는 사용자가 직접 각 OS마다 리소스를 부여할 수 있다.
다만 가상 환경 개수 만큼 각자 OS의 개수도 증가하므로
리소스를 부여할 때 가상환경에 설치한 OS의 리소스도 고려해서 부여해야 한다.
이렇게 가상환경들이 논리적으로 분리되어 있기 때문에 베어메탈에서 발생한 문제들을 근본적으로 해결할 수 있다.
즉, 하나의 프로그램에서 오류가 발생했거나 리소스 사용량이 급증하여도 분리된 다른 프로그램에 영향을 주지 않기 때문에 모든 서버가 다운되는 경우를 막을 수 있다.
더 확실하게 하드웨어 서버를 여러 대를 구매하여 하드웨어 서버 하나당 하나의 프로그램을 실행시키는 것은?
그러면 복잡하게 가상화 기술을 사용하지 않아도 되고 좋을 텐데?
시간이 지날수록 하드웨어 성능들은 빠르게 발전하고 소프트웨어의 리소스 크기는 줄어들고 있다.
낮은 사양의 컴퓨터 여러 대 사용하기 vs 높은 사양의 컴퓨터 한 대 사용하기
가격, 컴퓨터 설치 공간, 인력, 운영, 배선 등
여러 가지로 높은 사양의 컴퓨터 한 대에 가상화 환경을 구축하여 사용하는 것이 훨씬 경제적이다.
--
하이퍼바이저 (Hypervisor)
--
하이퍼바이저는 가상화 환경을 구축하는 것 중에 하나이며
컴퓨터에 설치되는 프로그램으로 OS의 프로그램으로 실행해서 가상화 환경을 관리할 수 있다.
하이퍼바이저를 이용해서 가상 OS를 만들거나 가상 OS를 실행 및 종료할 수 있다.
- 호스트 OS : 물리적인 서버에 설치되는 OS
- 게스트 OS : 호스트 OS의 자원을 (논리적) 분리 후 생성한 새로운 OS(가상환경)
- 가상 머신 : 게스트 OS를 일반적으로 부르는 용어
정리
- 서버에 호스트 OS 설치
- 가상화를 구축하기 위해 호스트 OS에 하이퍼바이저 프로그램 설치
- 하이퍼바이저를 이용해서 각 리소스들을 할당하여 가상 머신 생성
- 각 가상 머신에 게스트 OS를 실행 후 게스트 OS에서 서버 운영
--
하이퍼바이저 동작 원리
--
일반적으로 프로세스가 정상적으로 실행되기 위해서는 CPU나 메모리 같은 리소스를 사용해야 한다.
그리고 프로세스가 하드웨어(리소스)를 사용하기 위해서는 OS를 통해서만 사용할 수 있다.
OS는 하드웨어를 사용하기 위해서 커널(Kernal)이라는 도구가 설치되어 있다.
커널을 통해서 요청을 보내는 이유는
하드웨어의 리소스를 사용하는 것이 아주 복잡하고 조심히 다뤄야 하기 때문이다.
그래서 커널은 하드웨어에 리소스 사용 요청을 대신 전달해 주는 System Call이라는 표준을 정해놓았다.
(중요한 업무를 처리하는 소통 창구)
즉, 프로세스들은 커널에 System Call을 보내서 하드웨어의 자원을 사용할 수 있게 되는 것이다.
[윈도우, 리눅스, 맥]OS 마다 다른 종류의 커널을 사용한다.
그래서 System Call도 각 OS마다 다르다.
가상화 기술을 사용해서 호스트 OS에서는 윈도우OS를 사용하고 게스트OS에서는 리눅스OS를 사용한다면?
게스트OS에 있는 커널은 실제로 물리적인 하드웨어가 없기 때문에
리소스를 사용하려면 호스트OS의 커널로 리소스를 사용 요청을 보내야 한다.
하지만 호스트OS와 게스트OS의 종류가 다르기 때문에 호스트OS는 게스트OS에서 받은 System Call을 처리할 수 없다.
(OS가 같으면 처리 가능)
이때 하이퍼바이저가 다른OS 커널 간의 System Call을 서로 이해할 수 있게 통역해 주는 역할을 수행해 준다.
위 그림처럼
하이퍼바이저를 사용하면 격리된 공간을 만들면서
호스트OS와 다른 종류의 게스트OS도 사용할 수 있게 되는 것이다.
대표적인 하이퍼바이저 프로그램들
- VirtualBox : 오픈소스이기 때문에 테스트 or 학습 환경에서 많이 사용되는 하이퍼바이저
- VmWare : 일반적으로 기업에서 많이 사용하는 하이퍼바이저
- Red Hat : 일반적으로 기업에서 많이 사용하는 하이퍼바이저
--
컨테이너 (Container)
--
컨테이너 가상화는 가상화 기술 중 하나로
리눅스 커널이 제공하는 LXC라는 자체 격리 기술을 이용하여 사용할 수 있다.
(즉, 리눅스 환경에서만 사용할 수 있다.)
컨테이너 방식을 사용하면 가볍고, 빠르기 때문에
현대 애플리케이션 운영 환경에서는 하이퍼바이저 방식보다 컨테이너 방식을 더 선호되는 가상화 기술이다.
하이퍼바이저 가상화에서는
하이퍼바이저라는 소프트웨어가 격리된 공간을 만들어 주었지만
컨테이너 가상화는
리눅스 커널에서 제공하는 LXC 기술을 사용하여 커널의 자체 기능만으로 격리된 공간을 만들 수 있다.
위 그림처럼 LXC 기술을 사용해서 만들어진 각각의 격리된 공간을 컨테이너라고 부른다.
즉, 컨테이너는 호스트 OS의 커널을 공유해서 사용한다.
LXC(Linux Container) 기술은
커널의 네임스페이스(Namespace)와 C그룹쓰(Cgroups)라는 기능을 활용한다.
Namespace는
- 프로세스
- 하드 드라이브
- 네트워크
- 사용자
- 호스트 네임
처럼 리소스를 나누는 기준의 역할을 한다.
Cgroups는 프로세스가 사용하는
- 메모리
- CPU
- 하드 디스크
- 네트워크
처럼 리소스의 사용량을 배분하는 기술이다.
하이퍼바이저 가상화와 컨테이너 가상화의 특징 및 차이점
하이퍼바이저
- 호스트OS와 게스트OS의 커널이 독립적으로 존재하고 하이퍼바이저라는 소프트웨어가 중간에서 커널 간의 통신을 지원해 준다.
- 그러다 보니 각 System Call들이 하이퍼바이저를 거쳐가기 때문에 단계가 늘어가게 된다. (오버헤드가 큼)
- 커널이 독립적으로 있어서 커널을 실행하는 데 있어서 시간이 더 필요해진다.
컨테이너
- 호스트OS의 커널을 그대로 공유해서 사용하기 때문에 하이퍼바이저 보다 오버헤드가 적다.
- 오버헤드가 적다는 것은 하드웨어 리소스 사용 요청이 더 효율적으로 이루어진다는 것이다.
- 자체적인 커널이 없고 호스트OS의 커널을 공유하기 때문에 커널을 실행하는 시간 자체가 없어진다.
- 호스트 OS의 커널을 공유하기 때문에 호스트OS와 다른 종류의 OS는 실행할 수 없다는 단점이 있다.
이러한 이유로
컨테이너 가상화는 하이퍼바이저보다 훨씬 더 부팅 속도가 빠르다는 장점이 있어서
오버헤드가 적고 부팅 속도가 빠른 점이 모던 애플리케이션의 요구사항을 충족시킬 수 있었다.
보안적인 측면에서는
커널을 독립적으로 가지고 있는 가상 머신(하이퍼바이저)이 더 뛰어나다.
커널 자체적으로 제공하는 가상화 기술은 사용자가 직접 컨트롤하기 어렵기 때문에
이 컨테이너 기상화 기술을 편리하게 사용하기 위해서 만들어진 도커를 사용한다.
즉, 도커는 컨테이너 가상화를 구축하기 위한 소프트웨어라기보다는 컨테이너 가상화 기술을 활용할 수 있게 도와주는 보조 도구이다.
--
참고 및 출처
'Docker' 카테고리의 다른 글
이미지 관리 + 컨테이너 실행 및 삭제하기 (명령어) (0) | 2024.06.08 |
---|---|
이미지란? (0) | 2024.06.07 |
Docker 명령어 정리 (0) | 2024.06.07 |
Docker란? (0) | 2024.06.04 |
[Docker 시작 전] 서버란? (0) | 2024.05.30 |