SOPT 34기 서버파트/Docker 스터디

[Docker]가상화 기술[하이퍼바이저,컨테이너]

softmoca__ 2024. 4. 7. 14:03
목차

애플리케이션 서버

실제 기업에서는 한가지 서버가 아닌 여러 서버를 동시에 운영한다.

서버에서 어떤 소프트웨어가 실행 중인지에 따라서 다양하게 분류할수 있으며 대표적으로 아래 4가지가 있다.

1. 파일서버 2. DB서버 3. 웹서버 4. 웹애플리케이션 서버

 

1. 파일서버

- 파일 공유 소프트웨어가 설치되어 있으며 업로드와 다운로드와 같은 파일을 공유하는 기능을 클라이언트에게 제공한다.

2. DB서버

- 데이터를 관리하는 DBMS가 설치되어 있으며 데이터를 저장하는 기능을 클라이언트에게 제공한다.

3. 웹서버(Nginx)

- 클라이언트가 웹 브라우저를 통해서 HTTP 요청을 보내면 정적인 웹페이지를 제공해준다.

정적인 웹페이지 : 주로 HTML, JavaScript, CSS같은 프론트엔드 개발자가 개발한 파일들이 사용된다.

4. 웹애플리케이션 서버

- Java와 같은 프로그래밍 언어로 개발된 백엔드 애플리케이션(Spring)을 실행 시킨다.

 

 

 

기업에서의 서버 운영 환경의 대표적인 3가지

 

1. 베어메탈 2. 하이퍼바이저(Hypervisor)  3. 컨테이너(Container)

 

1. 베어메탈

- 일반적으로 컴퓨터를 구입하고 프로그램을 실행시키는 방식과 비슷하다.

서버를 하나 구입한 뒤 그 서버위에서 OS를 설치하고 여러개의 소프트웨어를 실행 시킨다.

 

위 베어메탈 기술은 여러가지 이유로 비효율적이다.

그래서 실직적으로는 가상화 기술을 사용한 2. 하이퍼바이저(Hypervisor)  3. 컨테이너(Container)이 사용되고 있으며 이에 대해 자세히 공부해보자.

 

 

 

가상화기술과 하이퍼바이저 가상화

가상화 기술

- 존재하는 컴퓨터는 아니지만 마치 컴퓨터가 있는 것 처럼 만들어주는 기술.

간단히 말해 하나의 컴퓨터에서 여러개의 컴퓨터를 실행 시킬수 있다.

 

가상화 기술은 왜 사용 하는걸까 ?

=> 소프트웨어 간의 간섭 문제 

 

CPU 8코어와 64GB 메모리를 가진 서버 한대를 가지고 있다고 가정해보자.

그리고 윈도우 OS(코어 8GB 메모리를 소비)에서  평균적으로 1코어 8GB 메모리를 소비하는 프로그램 4개를 실행 시켜보자.

그럼 총 리소스는  1코어 8GB(윈도우 OS)+4코어 32GB(4개의 프로그램) 메모리를 소비한다.

그래도 아직 리소스가 남아 있기 때문에 리소스 사용량에는 문제가 없다. 또한 하나의 OS에서 프로그램이 모두 실행되고 있어 관리도 편할것이라고 생각된다.

 

하지만 위와 같은 상태에서는 하나의 프로그램에 문제가 생기면 다른 프로그램에도 영향을 줄수 있다.

ex) 하나의 프로그램의 사용량이 갑자기 급증해서 리소스를 모두 소모.

 

그래서 하나의 OS에서 운영하는것은 피하는것이 좋다.

 

 

 

 소프트웨어 간의 간섭 문제 해결을 위한 가상화 기술

위와 같이 가상화 기술을 사용하면 한대의 컴퓨터에 여러 대의 격리된 논리적인(가상의) OS 환경을 만들 수 있다.

또한 가상으로 만들어진 컴퓨터에 사용자가 리소스를 직접 분배할 수 있다.

(리소스 분배 : 하나의 가상 OS가 사용할수 있는 리소스의 최대값을 설정)

 

그래서 한대의 프로그램에서 에러가 발생해도 다른 프로그램에는 영향을 주지 않는다.

 

 

하이퍼바이저 가상화(VirtualBox)

하이퍼바이저 - 컴퓨터에 설치되는 프로그램

OS에 설치해서 프로그램으로 실행해서 가상화 환경을 관리할 수 있다.

가상환경을 만들 때 마다 프로그램을 설치하는 것처럼 디스크(Storage) 공간을 차지한다.

실행 전에는 저장 공간만 차지하고 있다가 실행을 하면 CPU와 메모리를 사용한다.

 

 

호스트 OS

- 물리적인 서버에 설치되는 OS, 하이퍼바이저를 설치해서 가상환경을 구축할 수있다.

- 물리적인 하드웨어와 직접 연결되어 있다.

 

게스트 OS(가상머신)

- 호스트 OS의 리소스를 나눈 논리적인 공간이다.

- 웹서버, DB서버 등등 과 같은 프로그램을 프로세스로 실행해서 운영한다.

 

 

 

하이퍼바이저 동작원리

프로세스는 정상적으로 실행되기 위해서 CPU나 메모리 같은 리소스를 사용해야 한다.

또한 프로세스는 하드웨어를 사용하기 위해서는 OS를 통해서만 사용할 수 있으며 OS에는 하드웨어를 사용하기 위해서 커널이라는 도구가 설치되어 있다.  일반적인 프로그램인 '웹브라우저 혹은 Word 프로그램' 을 실행할 때도 실행되어 있는 프로세스들은 OS의 커널에게 시스템 콜을 보내서 하드웨어 리소스를 요청한다.

 

 

대표적인 OS로는 윈도우, 맥, 리눅스가 있으며 각각의 OS는 다른 종류의 커널을 사용한다.

위 3개의 OS는 마치 대화가 불가능한 외국인 3명이 모인 것과 같다.

 

게스트 OS의 커널은 실제로 물리적인 하드웨어가 없기 때문에 리소스를 사용하려면  호스트 OS의 커널로 리소스 사용을 요청해야한다.

하지만 호스트 OS와 게스트 OS의 종류가 다르면 이 호스트 OS는 게스트 OS에서 전달 받은 시스템 콜을 처리할 수 없다.

여기서 하이퍼 바이저가 바로 다른 커널간의 언어를 통역해주는 통역가 역활을 수행한다.

그래서 하이퍼바이저를 사용하면 격리된 공간을 만들면서 호스트 OS와 다른 종류의 게스트 OS도 사용할 수 있다.

 

주로 호스트 OS로는 윈도우 혹은 맥을 사용한다.

윈도우/맥은 사용성은 뛰어나지만 한대의 성능이 무겁고 라이선스 가격도 비싸기 때문에 메인 호스트 OS는 윈도우/맥으로 유지하면서 실제로 프로그램을 실행시키는 서버 운영은 가벼운 게스트 리눅스 OS를 사용한다.

 

 

컨테이너 가상화

컨테이너 가상화는 1. 가볍다 2. 빠르다 라는 핵심 장점으로 인해 하이퍼바이저 보다 더욱 선호된다.

ex)웹서버 띄우기 : 하이퍼바이저는 1분 도커는 3초

 

 

컨테이너 가상화는 리눅스 커널이 제공하는 자체 격리 기술(LXC)에서 출발했다.

컨테이너 가상화는 하이퍼바이저처럼 소프트웨어를 사용해서 격리된 공간을 만드는 것과 다르게 커널 자체의 기능만 사용해서 격리된 공간(컨테이너)을 만들 수 있다.

 

+ 리눅스 커널이 제공하는 자체 격리 기술 LSX

1. 네임스페이스

- 프로세스와 하드드라이브, 네트워크, 사용자, 호스트네임 처럼 리소스를 나누는 기준의 역할을 한다.

2. Cgroups

- 프로세스가 사용하는 메모리와 CPU, 하드디스, 네트워크 밴드위스 처럼 리소스의 사용량을 배분한다.

 

그래서  모든 컨테이너는 호스트OS의 커널을 공유해서 사용한다.

게스트 OS와 호스트 OS의 커널이 독립적으로 존재해서 하이퍼바이저로 번역 소통을 하는 하이퍼 바이저 가상화 기술은 요청을 거쳐가는 단계가 많아저 오버헤드가 크다.

반면에 컨테이너는 중간 다리가 따로 없어 오버헤드가 적다.

즉, 하드웨어 리소스 사용 요청이 더 효율적으로 이루어진다.

 

 하지만 독립적으로 실행되는 하이퍼 바이저는 보안이 더 우수하며 컨테이너는 호스트 OS의 커널을 공유하기 때문에 호스트 OS와 다른 종류의 OS는 실행할 수 없다는 상대적인 단점이 있다.

 

도커(Docker)

도커의 등장

커널이 자체적으로 제공하는 가상화 기술은 사용자가 직접 컨트롤하기는 어렵다.

그래서 커널의 컨테이너 가상화 기술을 편하게 사용할수 있게 해주는 도커가 나오게 되었다.

 

도커와 같은 컨테이너 가상화 도구를 컨테이너 플랫폼이라고 부른다.

컨테이너 플랫폼은 컨테이너 엔진과 컨테이너 런타임으로 구성되어 있따.

컨테이너 엔진은 말 그대로 사용자의 요청을 받아서 컨테이너를 관리해주는 역할을 한다.

컨테이너 런타임은 직접 커널과 통신하면서 실제로 격리된 공간을 만드는 역활을 한다.

 

도커의 아키텍처

도커는 클라이언트-서버 모델로 실행된다.

사용자의 명령을 전달해주는 클라이언트와 실제로 컨테이너를 관리해주는 도커데몬 이라는 서버가 존재한다.

 

 

주로 클라이언트에서는 CLI를 통해 명령어를 입력하고 그 명령어를 도커에서 자동으로 서버의 api 양식에 맞게 만들어 대신 전달하게 된다.

ex) docker ps 

 

 

즉 클라이언트는 CLI,  서버는 도커데몬으로 구성이 된다.

사용자는 cli를 통해서 간단한 명령어를 사용해 컨테이너를 관리할 수 있다.

명령어를 실행하면 cli는 api에 맞게 요청을 만들어서 Docker 데몬으로 전달한다.

Docker 데몬은 컨테이너 런타임을 통해서 컨테이너를 조작하고 그 결과를 CLI로 다시 전달한다.

 

Nginx 웹서버 컨테이너 실행

 

 

보통 웹사이트에 접속을 할 때 웹브라우저 주소창에 주소(도메인)를 입력한다.

위와 같은 과정이 바로 브라우저를 통해서 웹서버로 요청을 보내는 것이다.

 

www.naver.com을 입력하면 네이버의 웹서버로 요청이 전달되고 웹페이지를 파일로 응답하고 이 웹페이지 파일은 사용자의 브라우저에 표시된다. 그러면 사용자는 이 화면을 통해서 웹서비스를 사용할 수 있는 것이다.

 

그리고 지금 사용중인 PC에서 실행중인 웹서버에 접속하려면 브라우저의 로컬 호스트(localhost)라는 주소를 사용해서 접속할 수 있다.

docker versoin
docker info

호스트 OS에서 도커가 실행시키고 위 명령어를 입력하면 클라이언트, 서버 각각의 상태를 확인할 수 있다.

info 명령어의 서버에서는 실행중인 컨테이너 개수와 이미지 개수를 확인할 수 있다.

 

도커 명령어는 대분류(Management Command)와 소분류(Common Command)로 구성되어 있으며 대분류는 생략이 가능한 경우도 있다.

 

docker run (실행옵션) 이미지명  // 컨테이너 실행
docker rm 컨테이너명/ID // 컨테이너 삭제

이미지 : 컨테이너를 실행시키기 위한 재료

 

Nginx 컨테이너를 실행시켜 보고 Nginx가 제공하는 웹페이지에 접속해 보자.

docker run -p 80:80 --name hellonginx nginx



위 명령어를 입력하면 nginx 로그가 찍히며 컨테이너가 생성된다.

 

docker run 명령어를 실행 했을 때의 일어난일 정리

0. 나의 PC(Mac OS)에 도커를 설치해서 호스트 OS로 사용

1. docker run ... nginx 를 수행하면 CLI가 명령어를 컨테이너의 실행 API에 맞게 만들어서 도커 데몬에게 전달한다.

2. 도커 데몬은 요청을 분석해서 컨테이너 런타임을 통해서 컨테이너를 생성한다.

3. localhost에 접속하면 컨테이너의 실행중인 nginx 프로세스에서 위 요청을 전달 받아서 웹페이지를 제공해준다.