병훈's Blog

서버 호스팅 강의 03-01 Docker의 사용 배경 본문

Computer/Server

서버 호스팅 강의 03-01 Docker의 사용 배경

thdqudgns 2024. 1. 7. 20:49

 

 

도커는 리눅스의 응용 프로그램들을 SW 컨테이너 안에 배치시키는 일을 자동화하기 위해 시작된 오픈소스 프로젝트입니다. , 애플리케이션을 신속하게 구축, 테스트, 배포할 수 있는 SW 플랫폼입니다도커를 이해하기 위해서는 이 단어들을 알고 있어야 합니다. 지금부터 알아보죠.

 

 

먼저 붉은 선과 초록 선 안에 있는 내용들을 보겠습니다.

 

 

먼저, 우리가 만들 것은 여러 사람들이 접속할 수 있는 웹 사이트입니다.

여러 사람들이 요청을 보냈을 때 그에 응답할 수 있는 서버가 존재해야 하는 것입니다.

 

조금 더 자세하게 말하자면 요청을 받아들이고, 그에 응답하는 애플리케이션이 서버라 불리는 어느 컴퓨터에서 실행되고 있는 것이죠. 그렇다면 서버 컴퓨터는 어떤 구조로 애플리케이션이 동작하고 있을까요?

 

 

서버의 구조에는 여러 구조가 있겠지만, 지금 설명 드릴 것은 3-tier 구조입니다.

3 tier architecture 역할에 따라 3개의 서버로 수직 분할한 구조를 뜻합니다.

서버를 분할함으로서 특정 서버에 부하가 집중되는 문제를 해결했습니다.

 

사용자가 웹 사이트에 접속하면, 먼저 웹 서버가 정적인 페이지를 보여줍니다.

그리고 동적인 처리가 필요하면 애플리케이션(AP) 서버에 요청을 보냅니다.

그리고 DB 관련 처리가 필요하면 DB 서버에 요청을 보냅니다.

 

서버의 의미는 클라이언트에게 요청에 대한 응답을 주는 컴퓨터 프로그램 또는 장치를 의미합니다.

따라서 3 tier architecture에서 웹서버, AP서버, DB서버는 각각 프로그램 단위로 나눌 수도 있고, 컴퓨터 단위로 나눌 수도 있습니다.

 

각각의 서버를 어떻게 나누고 조합할 것인지는 설계자가 자유롭게 선택할 수 있습니다.

웹서버, AP서버, DB서버를 하나의 컴퓨터 안에서 구축할 수도 있겠지만

저는 웹서버와 AP서버는 하나의 컴퓨터로 구축할 것이고, DB서버는 다른 컴퓨터로 구축할 것입니다.

 

이 그림에서, 왼쪽을 보시면 하나의 컴퓨터 안에 두 개의 서버. 즉 두 개의 프로그램이 동작하고 있습니다.

이렇게 하나의 컴퓨터 안에서 여러 개의 프로그램이 동작하는 것에도 발전 과정이 있습니다.

 

 

먼저 그림에서 공통적으로 등장하는 Deployment 배포라는 용어에 대해 설명하겠습니다.

서버에서 동작하고 있는 애플리케이션에 기능을 추가하려면 개발자가 자신의 PC에서 개발과 테스트를 진행한 후에 수정된 코드를 서버에 반영해야 합니다. 이때 서버에 반영하는 것을 배포라고 합니다.

 

맨 왼쪽 Traditional Deployment(전통적 배포)는 가상화 이전, 그러니까 오래전부터 쓰이던 방식입니다. 물리적인 컴퓨터 한 대에 하나의 OS를 깔고 여러 가지 프로그램을 설치하는 방식이죠. 우리는 PC 한 대에 윈도우를 하나 설치하고, 여러 가지 게임이나 워드프로세서 등을 깔아서 사용하잖아요. 이와 비슷한 방식이라고 생각하면 됩니다. 가장 오래되고 단순한 방식이며 단일 목적 시스템이라면 이것으로도 별 무리가 없겠죠.

 

그렇다면, 이 방식이 가진 문제점에 대해 한 번 생각해 볼까요한 대의 컴퓨터에서 모든 것을 처리하려고 하면 어떤 프로그램 동작이 다른 프로그램의 동작을 간섭하거나, 특정 프로그램이 성능을 독점할 경우 또 다른 프로그램의 성능이 떨어지는 단점이 있습니다

하나의 물리 서버에서 여러 애플리케이션의 자원의 한계를 정의할 방법이 없었기에, 리소스 할당의 문제가 발생한 거죠.

 

이에 대한 해결책으로 서로 다른 여러 물리 서버에서 각 애플리케이션을 실행할 수도 있습니다. 그러나 이는 리소스가 충분히 활용되지 않는다는 점에서 확장 가능하지 않았으며, 조직이 많은 물리 서버를 유지하는 데에 높은 비용이 들었습니다.

 

 

이 문제를 해결하기 위해 등장한 해법이 위 그림의 Virtualized Deployment(가상화 배포)에요. 가상머신(Virtual Machine)을 기반으로 배포를 하는 방법이죠.

 

아마 이 그림을 이해하는 데 있어서 가장 어려운 것은 첫 번째로는 하이퍼바이저(Hypervisor)컨테이너 런타임(Container Runtime)과 같은 용어가 익숙하지 않았기 때문일 거예요. 두 번째는 VM, Bin/Library, App이 어떤 의미인지 와닿지 않아서였을 텐데요.

 

중간에 위치한 하이퍼바이저는 하나의 시스템 상에서 가상 컴퓨터를 여러 개 구동할 수 있도록 해 주는 중간 계층을 의미한다는 정도로만 알고 계시면 될 거예요. 그리고 App은 실행하고자 하는 프로그램, Bin/Library는 프로그램이 실행하는데 필요한 환경과 관련된 파일이라고 생각하면 됩니다.

가상화는 단일 물리 서버의 CPU에서 여러 가상 시스템 (VM)을 실행할 수 있게 합니다. 가상화를 사용하면 VM간에 애플리케이션을 격리하고 애플리케이션의 정보를 다른 애플리케이션에서 자유롭게 액세스할 수 없으므로, 일정 수준의 보안성을 제공할 수 있습니다.

 

가상화를 사용하면 물리 서버에서 리소스를 보다 효율적으로 활용할 수 있으며, 쉽게 애플리케이션을 추가하거나 업데이트할 수 있고 하드웨어 비용을 절감할 수 있어 더 나은 확장성을 제공합니다.

 

VM가상화된 하드웨어 상에서 자체 운영체제를 포함한 모든 구성 요소를 실행하는 하나의 컴퓨터입니다. 이때 각각의 VM 안에 있는 운영체제를 Guest OS 라고 부르고, VM을 포함하는 하나의 물리 서버의 운영체제를 Host OS라고 부릅니다. 이 방식이 전통적 배포 방식보다는 분명 효율적이지만, 가상머신에 일일이 운영체제를 설치해야 하기 때문에 컨테이너 중심의 배포(Container Deployment)보다는 무거운 편이에요.

 

 

마지막으로 Container Deployment(컨테이너 중심의 배포)에 대해 살펴보겠습니다. 하이퍼바이저라는 부분이 Container Runtime으로 대체되었고, Virtual Machine이라고 된 부분은 Container로 대체가 되었죠컨테이너는 VM과 유사하지만 격리 속성을 완화하여 애플리케이션 간에 운영체제(OS)를 공유합니다. 이와 같은 컨테이너 동작 방식을 OS 커널을 공유하는 가상화라고 표현하기도 해요. Guest OS가 없죠? 그러므로 컨테이너는 가볍다고 여겨집니다.

 

컨테이너는 우리가 구동하려는 애플리케이션을 실행할 수 있는 환경까지 감싸서, 어디서든 쉽게 실행할 수 있도록 해 주는 기술입니다. Java 프로그램을 실행하기 위해 JDK가 필요한데, 이런 것들을 함께 갖추는 거죠. 컨테이너를 사용할 때 필요한 도구가 컨테이너 런타임입니다. 컨테이너를 쉽게 내려받거나 공유하고 구동할 수 있도록 해주는 도구인데요. 종류도 여러 가지가 있어요. 그중 가장 유명한 것이 도커. (애니메이션)

 

이러한 컨테이너에는 컴퓨터의 기본 구성요소인 CPU, 메모리 등의 자원도 할당됩니다. 그러므로 격리된 하나의 컴퓨터라고 보시면 됩니다. 컨테이너라는 컴퓨터 안에서 프로그램들이 돌아가는 거죠.

 

 

이러한 컨테이너의 장점을 더 보면 이렇습니다.

기민한 애플리케이션 생성과 배포: VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 보다 쉽고 효율적이다.
지속적인 개발, 통합 및 배포: 안정적이고 주기적으로 컨테이너 이미지를 빌드해서 배포할 수 있고 (이미지의 불변성 덕에) 빠르고 효율적으로 롤백할 수 있다.
개발과 운영의 관심사 분리: 배포 시점이 아닌 빌드/릴리스 시점에 애플리케이션 컨테이너 이미지를 만들기 때문에, 애플리케이션이 인프라스트럭처에서 분리된다.
개발, 테스팅 및 운영 환경에 걸친 일관성: 랩탑에서도 클라우드에서와 동일하게 구동된다.
클라우드 및 OS 배포판이식성: Ubuntu, RHEL, CoreOS, -프레미스, 주요 퍼블릭 클라우드와 어디에서든 구동된다.

 

 

이제 이 용어들을 조금은 이해하셨을 겁니다. 다음으로 넘어가죠.

 


출처 :

728x90
728x90