서버는 주로 네트워크 상에서 클라이언트가 무언가를 요청했을 때
그에 대한 응답을 보내주는 컴퓨터를 의미한다.
좀 더 좁혀서 표현하자면 컴퓨터 하드웨어에서 실행 중인 소프트웨어를 의미한다.
그렇다면 이런 서버를 운용하는 방식에는 무엇이 있을까?
주로 아래 3가지로 나눌 수 있다.
베어메탈은 서버 하드웨어를 사고, 그 위에 직접 서버용 소프트웨어를 설치하는 방식을 의마한다.
이외에 하이퍼바이저/컨테이너 방식은 가상화 기술을 사용한 것이다.
그렇다면 가상화 기술이란 무엇일까?
가상화 기술 은 아래와 같은 개념이다.
대충 의미는 알았다.
그러면 하이퍼바이저는 무엇일까?
컴퓨터에 설치되는 프로그램이며,
Host PC 위에 가상의 PC (= Guest OS) 를 생성 및 실행할 수 있고
CPU, MEM, 스토리지 같은 Host PC 의 리소스를 Guest OS 에 분배하고 할 수 있다.
이렇게 분배된 리소스는 Host PC 와 격리되어서 사용된다.
그런데 이런 자원분배/격리도 중요하지만 하이퍼바이저에게는
컨테이너 가상화와 차이를 두는 가장 핵심적인 기능은 바로
Host OS 와 Guest OS 간의 system call 통역 기능이다.
하이퍼바이저는 system call 통역이 필요한 이유
일단 프로세스는 서버(하드웨어)의 자원을 사용하기 위해서는
커널이 제공하는 system call
이라는 인터페이스를 통해서 리소스를 요청해야 한다.
그런데 Host OS 와 Guest OS 는 서로 다른 커널 및 system call 의 구조를 갖는다.
이런 이유로 가상 머신 위의 프로세스가 system call
을 호출할 때
호스트에 설치했던 하이퍼바이저가 이러한 요청을 Host PC 에 맞게 통역하여 전달한다.
HOST OS 는 이 system call 받아서 자원을 받으면 다시 하이퍼바이저는
이에 대한 응답을 Guest OS 에게 반환하게 된다.
사실 여기서 말하는 하이퍼바이저는 type2 하이퍼바이저입니다.
하지만 컨테이너 가상화 기술과 가장 비교하기 좋은 게 이것인지라, type 2 로 설명했습니다.type1, type2 하이퍼바이저 차이점이 궁금하시면 아래 링크를 참고해주세요.
https://www.youtube.com/watch?v=FZR0rG3HKIk
컨테이너 기술은 초창기에 리눅스 커널이 제공하는 LXC(리눅스 컨테이너스)라는
자체 격리 기술에서 출발됐습니다.
이 기능을 사용해서 만든 각각의 격리된 공간을 만들 수가 있었는데,
이걸 컨테이너(container)라고 불렀다.
이런 컨테이너 가상화의 가장 큰 장점이자 특징은
LXC
라는 기술 자체가 리눅스 커널에서 자체 제공하는 기술이다 보니,
LXC 로 만든 모든 컨테이너들은 리눅스(= 호스트) 와
동일한 커널을 공유해서 사용하게 된다는 점이다.
이게 왜 장점인지 하이퍼바이저와 비교를 해보자.
하이퍼바이저와 비교
하이퍼바이저는 Guest / Host 각각 서로 다른 커널이 존재하고,
각각의 system call 들이 하이퍼바이저를 통해서 통역되는 과정이 있어서,
오버헤드가 발생한다. 요청이 많을 수록 점점 심해진다.
이에 반해 컨테이너 가상화는 그런 중간 단계가 없으므로
오버헤드가 상대적으로 적다.
그리고 하이퍼바이저는 부팅이라는 단계가 있지만,
컨테이너 가상화에서는 부팅 단계가 따로 없기 때문에 상대적으로 빠른 시작이 가능하다.
그런데 컨테이너라고 검색하면 항상 딸라오는 Docker 라는 건 뭘까?
Docker 는 컨테이너 관리를 편하게 하기 위한 소프트웨어이다.
아까 LXC 같은 게 있는데 굳이 이게 왜 필요한가 싶을 것이다.
하지만 리눅스 커널이 제공하는 컨테이너 가상화 기술은 직접 사용하는 것은 난도가 높다.
그렇기 때문에 이러한 어려운 리눅스 컨테이너 기술을 쓰기 편하기 위해 보조적인
역할을 해주는 것이 Docker 라고 생각하면 된다.