티스토리 뷰


“컨테이너(Container), 신기술인가?”

컨테이너는 갑자기 나타난 새로운 기술이 아니다. 이미 10년 전부터 Linux에 내장되어 있었고, 이 외에도 Unix와 BSD계열에서 각각의 기술로서 제공하던 기술이며 최근 주목을 받고 있다.

“그렇다면 왜 컨테이너가 주목을 받는 것인가?

컨테이너는 PaaS 시스템에 매우 적합한 기술이기 때문이다. IaaS(Infrastructure as a Service)는 이미 기술적 성숙도가 상당한 수준에 도달하여 AWS, MS, IBM, Google 등 많은 회사에서 IaaS 서비스를 제공하고 있고 이와 더불어 개발 및 운영 효율화를 위한 PaaS(Platform as a Service) 서비스에 대한 기대감이 상승하고 있다.

Platform은 개발 및 운영환경 별로 매우 다양하게 구성되며 소프트웨어는 환경에 매우 민감하기에 개발된 환경과 달라질 경우 구동이 되지 않거나 오 동작의 가능성 매우 크다. 이런 문제를 해결하기 위해 컨테이너를 PaaS의 핵심 기술로 사용하면 달라지는 환경에 비 의존적이며 다양한 Platform을 위한 환경의 구성 및 제공이 가능해진다.

또한 컨테이너는 Host OS의 Kernel 기반으로 실행하기에 시간적인 효율성 그리고 별도의 Guest OS를 필요로 하지 않기에 리소스 활용의 효과가 크다. 그렇다면 기존 가상화 기술로는 PaaS 서비스를 제공할 수 없는 것인가?

그렇지 않다! 기존의 가상화 기술로도 충분히 PaaS 서비스는 가능하다. 하지만 왜 컨테이너가 기존 가상화보다 PaaS에 적합한지 그리고 컨테이너가 무엇인지 글을 통해 소개하겠다.

“컨테이너는 무엇인가?”

컨테이너는 OS 레벨 가상화 기술 또는 어플리케이션 레벨 가상화 기술이라 한다.  컨테이너의 가상화는 우리가 알고 있는 가상화와 어떻게 다른가?

하나, 기존 서버 가상화는 하드웨어 레벨의 가상화이다. 동작 방식에서 기존의 가상화는 Hypervisor를 통해 물리 자원(Host)을 Virtual Machine에 할당하고 별도의 Guest OS를 설치하여 동작한다. 그러나 컨테이너는 Kernel 영역의 cgroups와 Namespace 기술을 사용하여 어플리케이션이 마치 서로 다른 서버에서 구동되는 듯한 환경을 제공한다.

또한, 컨테이너는 

둘, Hypervisor를 거치지 않아 Host의 Overhead가 낮다. 셋, Kernel 영역의 기술을 활용하여 독립된 application 구동을 위한 환경을 제공하기에 자원 활용 효율이 증가하여 집적도가 높다. 넷, Application 구동 시 Process를 구동하는 것과 동일 하기에 Starting Time이 굉장히 단축된다.

다섯, 기존 가상화가 “OS/Binary/Library/application”까지를 하나의 Virtual Machine 단위로 묶어 관리 했다면 컨테이너는 “Application 구동에 필요한 Binary/Library/Application”을 묶어 하나의 개별 Runtime 환경으로 관리한다.

하지만, 어느 기술이나 일장일단이 있듯이 가상화를 대체할 수 없는 단점을 가지고 있다. 하나, 컨테이너는 Linux Kernel이 관리하기 때문에 Host OS에 종속적이다. Linux 이외의 다른 OS에서는 동작하지 않고 컨테이너 자체에 OS를 설치 할 수도 없다. 둘, 동일 kernel을 공유하기 때문에 다른 Kernel을 설치하거나 구성할 수 없다. 셋, 컨테이너는 Kernel이 가진 취약점에 대해 그대로 노출이 된다. 넷, 컨테이너의 관리 Tool이 현재까지는 VMware와 MS의 제품보다는 기능면에서 미흡하다.



앞서 컨테이너가 무엇인지 알아 보았으니 이제 컨테이너 기술을 지원하는 플랫폼에 대해서 알아보자. 

“컨테이너 is Docker ?”

컨테이너 기술을 지원하는 플랫폼은 여러 가지가 있다. 하지만 그 중에서도 단연 최고는 Docker이며 대부분의 사람들이 Docker와 컨테이너를 거의 동의어로 혼동할 정도이다.

10년전부터 컨테이너 기술이 이미 사용되어 왔지만 왜 이제서야 Docker라는 플랫폼이 그 Spotlight를 받는가? 그 것은 컨테이너를 활용할 수 있는 Ecosystem을 만든 주역이자 컨테이너 사용을 쉽게 만들어 주었기 때문이다.

우선, Docker의 구조를 한번 들여다 보자



Docker는 Client ←→ 서버구조로 동작하고 기본적으로  

    1. Docker Client : Command를 보내기 위한 사용자 Interface
    2. Docker Host : Docker 컨테이너를 실행하고 Command를 처리
    3. Docker Registry(Hub) : Docker 컨테이너를 위한 Docker Image 저장소

3개의 구성요소로 이루어져있다.

Docker Client의 Command에 따라 Docker Registry에 저장된 Image를 불러와 Docker Host 위에 컨테이너를 만든다. 컨테이너는 Linux의 Process 형태로 실행되며 Docker는 변경된 부분을 Registry에 저장된 Image에 반영 및 관리를 해준다.

기존의 Linux 컨테이너가 단순히 기술적인 측면에만 집중되어있다면 Docker는 컨테이너 사용을 위해 필요한 부수적인 부분(이미지 관리, 사용자의 접근 도구)을 체계화 하여 사용자의 불편을 해소하였다. 

Docker로 인하여 컨테이너 기술의 진입 장벽이 낮아지며 대규모의 Funding을 받아 현재는 기능의 안정화 및 확장을 진행 중이며 수많은 3rd Party 들과 협력하여 컨테이너 Ecosystem을 만들어가고 있다. Ecosystem 내에는 Clustering, Network, Automation, GUI 등의 분야에서 Docker를 지원하는 Tool들이 있어 Enterprise 서비스가 가능한 상태이다.

Google, AWS 등 대형 Cloud Provider들은 이미 Docker를 이용한 서비스를 제공하고 있고 수많은 회사들이 Docker를 활용해 자사의 서비스를 제공하고 있다. 또한 MS에서도 차기 버전 Windows 서버에서 컨테이너를 지원할 계획이어서 컨테이너라는 기술이 지금 얼마나 Hot한지 알 수 있을 것 같다.

* 글 : Cloud 사업 2팀 이형준 대리