Home part6. 가상화와 컨테이너
Post
Cancel

part6. 가상화와 컨테이너

개요

가상화의 개념

가상화(virtualization)란 하나의 물리적인 서버를 여러 개의 가상 서버로 분할해 사용하는 기술이다. 가상화 기술이 등장하기 전의 전통적인 서버 구조에서는 하나의 서버로 여러 웹 애플리케이션을 실행하면 서로 충돌하는 문제가 발생했다. 여러 웹 애플리케이션이 각 기 다른 운영체제나 라이브러리를 사용했기 때문이다. 그러나 가상화 기술이 도입되면서 하나의 서버로 다수의 웹 애플리케이션을 운영할 수 있게 됐다. 가상화 기술은 기업의 서버 활용도를 높여주고 개인 사용자에게는 안정적인 개발 환경을 제공한다.

가상화의 종류

가상화는 크게 개발 환경 가상화, 머신 가상화, 운영체제 수준 가상화로 나뉜다.

  • 개발 환경 가상화 개발자가 웹 애플리케이션을 개발할 때 필요한 환경을 가상으로 구축하게 하는 기술이다. 한 컴퓨터에 여러 웹 애플리케이션을 개발하더라도 각각의 개발 환경을 구성할 수 있다. 즉 개발 환경마다 관련 라이브러리나 패키지를 독립적으로 관리해 일관된 개발 환경을 유지할 수 있다.

  • 머신 가상화 가상 머신(VM, Virtual Machine)으로 하나의 서버에서 여러 운영체제를 실행할 수 있게 하는 기술이다. 이 방식은 웹 애플리케이션마다 다른 운영체제를 사용해야 하는 경우나 특정 웹 애플리케이션을 특정 운영체제에서만 사용할 수 있는 경우에 유용하다.
  • 운영체제 수준 가상화 호스트 운영체제(실제 하드웨어 본체에 설치한 운영체제) 위에 격리된 컨테이너를 여러 개 만들어 각각의 컨테이너 안에서 웹 애플리케이션을 실행하는 기술이다. 하나의 운영체제 상에서 격리된 컨테이너를 여러 개 생성하고 각각의 컨테이너에서 웹 애플리케이션을 실행하기 때문에 다른 웹 애플리케이션과 충돌하는 것을 방지할 수 있다.

컨테이너의 개념

컨테이너(container)는 가상화 기술 중 하나로, 격리된 여러 개의 실행 환경을 제공하는 기술이다. 앞서 언급했듯이 운영체제 수준 가상화를 기반으로 하며, 웹 애플리케이션을 실행하는 데 필요한 라이브러리, 실행 파일, 구성 파일 등이 포함된 패키지로 이뤄져 있다.

가상 머신과 컨테이너

컨테이너는 머신 가상화의 가상 머신과 비슷한 것 같지만 중요한 차이점이 존재한다.

  • 가상 머신 가상 머신은 하이퍼바이저(hypervisor)라는 소프트웨어 계층을 사용하 호스트 운영체제 위에 게스트 운영체제를 설치하고 실행하는 방식이다. 각 가상 머신은 자체적인 게스트 운영체제와 웹 애플리케이션을 가지며, 본 시스템으로부터 물리적인 하드웨어 자원(CPU, 메모리, 스토리지 등)을 할당받아 사용한다.
  • 컨테이너 컨테이너는 호스트 운영체제 위에서 동작한다. 다시 말해 운영체제 수준 가상화 기술을 사용해 호스트 운영체제 위에 격리된 실행 환경을 만든다. 이처럼 격리된 실행 환경을 컨테이너라고 하며, 각 컨테이너는 독립된 파일 시스템, 네트워크 인터페이스, 프로세스 등을 기반으로 동작한다. 컨테이너에는 자체적인 게스트 운영체제가 없고 호스트 운영체제의 자원을 공유받아 실행하므로 웹 애플리케이션을 더 빠르게 실행하고, 본 시스템의 물리적인 자원을 받아 더 효율적으로 활용한다. docker-vs-VM

컨테이너를 사용하는 이유

컨테이너는 여러 개의 서버가 필요한 상황에서 각 서버를 독립적으로 운영하는 효과를 내기 위해 사용한다. 컨테이너를 사용할 때의 장점은 다음과 같다.

  • 하나의 서버로 다양한 용도와 환경, 기능을 충족해야 할 때 여러 개의 컨테이너로 나눠 구현할 수 있다.
  • 각 서버가 컨테이너 별로 관리되므로 소프트웨어나 라이브러리를 설치할 때 의존성을 고려하지 않아도 되고, 컨테이너별로 소프트웨어를 간단히 설치할 수 있다.
  • 서버를 이전하거나 서버에 여러 소프트웨어를 다시 설치해야 할 때 컨테이너 이미지를 받아 간편하게 이전 및 설치할 수 있다.

컨테이너 플랫폼 : 도커

도커의 개념

도커는 컨테이너 기술을 이용해 웹 애플리케이션을 배포하고 실행하는 오픈 소스 플랫폼이다. 도커는 웹 애플리케이션을 실행하는 데 필요한 모든 환경을 패키징해 컨테이너 이미지를 만들고, 이 이미지를 이용해 컨테이너를 생성한다. 도커는 컨테이너 기술의 장점을 최대한 활용할 수 있도록 컨테이너 간 통신을 위한 네트워크 구성 기능, 여러 컨테이너를 동시에 관리하기 위한 오케스트레이션 기능, 컨테이너 이미지를 저장하고 관리하는 기능 등을 제공한다. 하지만, 컨테이너 내부에 설치된 웹 애플리케이션이 호스트 운영체제를 공유하므로 호스트 운영체제의 제한을 받을 수 있다는 것이 단점이다.

도커의 구조

도커의 구조는 크게 클라이언트와 서버로 나뉜다. 사용자가 도커 클라이언트를 통해 ‘docker’로 시작되는 도커 명령어를 입력하면 도커 호스트(도커 서버)의 도커 데몬(도커 엔진)에 명령이 전달돼 컨테이너 생성 및 실행, 컨테이너 이미지 관리 등의 작업이 수행된다. 도커 클라이언트와 도커 데몬은 API를 통해 요청을 주고 받는다. 도커 클라이언트는 개발자가 API를 사용해 명령을 내릴 수 있도록 CLI(Command Line Interface) 환경을 제공한다. 도커 데몬은 API로 들어온 명령을 수행하는데, 이때 도커드(dockerd)라는 프로세스를 통해 동작한다. 도커드는 컨테이너와 컨테이너 이미지 관리의 주체이다. 도커가 대중화되면서 최근에 도커 허브(Docker Hub)와 같은 컨테이너 레지스트리(container registry, 컨테이너 이미지 저장소)도 등장했다. 이를 통해 다양한 웹 애플리케이션과 미들웨어, 프레임워크 등이 컨테이너 이미지로 제공돼 사용자가 웹 애플리케이션을 쉽게 배포하고 실행할 수 있게 됐다.

컨테이너 이미지

컨테이너 이미지는 컨테이너 실행에 필요한 모든 것이 포함된 패키지로, 웹 애플리케이션 실행에 필요한 모든 소스 코드, 런타임, 라이브러리, 환경 변수 등의 구성 요소가 들어 있다. 컨테이너 이미지는 한 번 만들면 다른 서버 환경에서도 동일하게 사용할 수 있어 호환성이 좋다. 도커 이미지는 도커 파일(Dockerfile)이라는 텍스트 파일을 이용해 만든다. 도커 파일에는 웹 애플리케이션의 구성과 실행 방법을 정의하는 명령어가 작성돼 있으며, 이를 빌드하면 도커 이미지가 생성되고 도커 이미지를 실행하면 컨테이너가 실행된다. 컨테이너 이미지는 개발자나 운영 팀에 많은 이점을 안겨준다. 컨테이너 이미지를 사용하면 웹 애플리케이션 배포와 관리가 훨씬 쉬워지고, 어떤 서버 환경에서 웹 애플리케이션을 실행하더라도 일관된 결과를 얻을 수 있다.

컨테이너 오케스트레이션

도커의 둥장으로 다양한 개발 환경에서 만든 웹 애플리케이션을 손쉽게 컨테이너에 올려 실행할 수 있어 기존의 복잡한 서버 세팅 과정을 거치지 않고도 가상화 기술을 구현할 수 있게 됐다. 이에 따라 컨테이너와 이를 운영하는 서버 컴퓨터가 늘어나 거대한 서버 클러스터(server cluster, 여러 서버를 하나의 시스템으로 묶은 것)가 형성 됐다. 이러한 서버 클러스터에서 다수의 컨테이너를 관리하는 프로세스를 컨테이너 오케스트레이션(container orchestration)이라고 한다. 앞에서 설명했듯이 컨테이너는 웹 애플리케이션을 실행하는 데 사용하는 경량의 가상화된 환경이고, 컨테이너 오케스트레이션은 이러한 컨테이너의 생성, 배포,관리, 확장을 자동화하는 데 사용하는 도구이다. 대표적인 컨테이너 오케스트레이션에는 쿠버네티스(Kubernetes), 도커 스웜(Docker Swarm), 아파치 메소스(Apache Mesos) 등이 있다. 컨테이너 오케스트레이션은 대규모 컨테이너 기반 웹 애플리케이션을 관리하는데 필수적인 도구이다. 컨테이너 오케스트레이션을 사용하면 컨테이너를 보다 쉽게 관리하고 확장할 수 있을 뿐만 아니라 다수의 컨테이너를 안정적으로 운영할 수 있다.

This post is licensed under CC BY 4.0 by the author.

Cloud Essentials. AWS Foundation

part7. 웹 애플리케이션 아키텍처