베어메탈, 가상화 그리고 컨테이너 환경

강아G·2022년 9월 3일
0

글또

목록 보기
8/10
post-thumbnail

0. 들어가며

오늘은 베어메탈과 가상화, 그리고 컨테이너 환경에 대해 알아보려고 한다.
하나같이 생소한 단어들인데 아래에서 조금 더 알아보자.

1. 베어메탈

1-1. 정의 및 특징

베어메탈이란 간단하게 말하자면 가장 일반적인 환경이다.
즉, 하나의 OS 위에 바로 앱이 올라간 상태를 뜻한다.
베어메탈 환경에선 1개의 OS가 모든 하드웨어 자원을 관리하게 되는데,
그림으로 보자면 아래와 같다.

1-2. 장점

그럼 이 베어메탈 환경의 장점은 무엇일까?
가장 큰 장점은 속도가 빠르다는 점이다.
왜냐하면 실제 하드웨어에 OS를 직접 구동시키기 때문이다.

1-3. 단점

그렇다면 단점은 무엇일까?
베어메탈 환경의 특징에서 유추해볼 수 있듯 하나의 OS를 사용하는 게 문제가 된다.
즉, 여러 OS를 사용하려면 그에 맞는 하드웨어가 필요하다.
자연스럽게 자원(CPU나 메모리)간 격리가 불가능하고, 어플리케이션의 자동 확장 역시 어려워진다.
이러한 단점을 극복하기 위해 아래의 가상화 환경과 컨테이너 환경이 등장하게 되었다.

2. OS 가상화 환경

2-1. 정의 및 특징

가상화 환경이란 가상화 층을 구현하여 물리 머신으로부터 가상 환경을 분리하고, 가상 머신(VM)을 생성한다.
보통 가상화 층을 구현할 때는 Hypervisor라는 가상화 관리 툴을 사용한다.
이렇게 생성된 가상 머신은 물리적 머신과 동일한 역할 및 기능을 수행하지만, CPU와 메모리 같은 물리적 머신의 컴퓨팅 리소스를 사용한다.
그림으로 보자면 아래와 같다.

2-2. 장점

이런 가상화 환경의 장점은 자원을 격리해서 사용할 수 있다는 것이다.
즉, 위에서 언급한 베어메탈 환경의 단점을 어느정도 보완할 수 있다.
그리고 남는 컴퓨팅 리소스를 최대한 사용할 수 있어서 경제적이기도 하다.

2-3. 단점

다만 Hypervisor 및 게스트 OS의 부하 문제가 단점으로 꼽힌다.
그림을 보면 알 수 있듯 앱은 Hypervisor와 게스트 OS 위에서 돌아가게 되는데,
이 부분으로 인해 무겁고 느려진다.
또한, 기종이 다른 VM의 경우 기술간 호환성이 문제되기도 한다.

3. 컨테이너 환경

3-1. 정의 및 특징

그렇다면 컨테이너 환경은 어떨까?
우선 컨테이너 환경이란 커널을 공유하는 방법으로 호스트 OS 하나에서 여러 앱을 띄우는 것이다.
여기서 커널이란 운영체제의 핵심 기능부로, 컴퓨터 자원을 관리하는 역할을 한다.
사진으로 보자면 아래같은 구조이다.

우리는 shell과 같은 시스템프로그램을 이용해서 커널을 움직이게 하고,
컴퓨터로 하여금 사용자와 상호작용하도록 할 수 있다.

3-2. 장점

그럼 이 컨테이너 환경의 장점은 무엇일까?
우선 베어메탈 환경과 달리, 자원을 격리할 수 있을 것이다.
개인적으로 가장 큰 장점이라고 생각하는 것은 디펜던시, 환경 설정 등 개발할 수 있는 환경을
그대로 컨테이너 안에 넣을 수 있어서 어디서든, 누구든 동일한 환경에서 접근할 수 있다는 것이다.
말 그대로 컨테이너 상자에 자원을 차곡차곡 정리해두고, 언제든 또 누구든 그대로 사용할 수 있게 된다.
그 외에도 표준 컨테이너 기술로 호환성을 제공하고, 자동 확장 기능을 제공하기도 한다.

3-3. 단점

다만 단점으로는 베어메탈 환경보다는 느릴 수밖에 없다.
가상화 환경처럼 hypervisor나 게스트 OS를 거치진 않지만,
어쨌거나 호스트 OS 위에 도커 엔진을 띄워야 한다.
그래서 이론적으로는 베어메탈 > 컨테이너 > 가상화 환경 순서대로 속도가 빠를 수밖에 없다.

또 다른 문제는 물리 서버 한 대에 여러 대의 서버를 띄우는 방식이므로,
호스트 서버에 문제가 생기면 전 컨테이너에 영향을 미칠 수밖에 없다는 것이다.

4. 가상화 환경과 컨테이너 환경 비교하기

지금까지 베어메탈, 가상화, 컨테이너 환경에 대해 알아보았다.
개인적으로는 가상화 환경과 컨테이너 환경이 헷갈려서 좀 더 조사해보았는데,
간단히 설명하자면 이렇다.


위의 사진을 보면 알 수 있듯이,
왼쪽의 가상화 환경은 호스트 OS 위에 게스트 OS 전체를 가상화해서 사용한다는 것이다.

이와 달리 오른쪽의 컨테이너 환경은 OS 레벨은 공유하고, 앱 레벨에서 각각 격리해서 실행한다.
컨테이너 환경에선 원론적으로 하나의 OS만 구동할 수 있다는 뜻이다.
그래서 하나의 서버에 여러 개의 컨테이너를 실행해도 서로 독립적으로 실행할 수 있게 되는 것이다.

5. 느낀점

사실 프론트엔드 개발자로서 인프라 지식을 얼마나 알아야 하는 건지는 늘 고민했었다.
그리고 사실 지금도 그렇긴 하다.

하지만 실제로 업무(혹은 토이 프로젝트라도)에서 배포를 진행해보니,
인프라에 대해 얕게라도 알고 있어야겠단 생각이 들었다.
그래야 배포시 문제가 생기더라도 해결할 여지가 있고,
아는 만큼 유용하게 사용할 수 있기 때문이다.

그런 의미에서 나중엔 컨테이너 환경의 대표 주자인 도커(컴포즈)를 사용해보며,
거기에 대해 포스팅을 해볼 예정이다. 😃

profile
G는 무슨 G?

0개의 댓글