최근 클라우드 컴퓨팅이 인기를 끌면서 도커(Docker)라고하는 것이 인기를 끌고 있다. 도커에 대해서는 이야기만 듣고 있다가 최근 업무에서 실제 도커를 이용한 작업을 하게되면서 본격적으로 다루게 되었다.
도커(Docker)는 소프트웨어 컨테이너(Container) 플랫폼의 선두주자이다. 도커는 컨테이너 서비스를 지원하기 위한 플랫폼으로 도커를 이해하기 위해서는 컨테이너에 대해서 필수적으로 알아야 한다.
가상화와 가상머신(Virtual Machine)이란 무엇인가?
가상화란 애플리케이션의 서비스를 저렴한 비용으로 안정적이고 빠르게 제공하기 위한 인프라스트럭쳐(Infrastructure)이다. 물리적인 컴퓨팅 자원 (CPU, Disk, Network 등)을 가상화하여 여러개의 실행환경(Tenant;테넌트)이 공유하여 자원을 효율적으로 사용할 수 있게 해주는 것이다. 물리적인 컴퓨팅 자원을 가상화한다는 것은 각 테넌트들이 서로의 존재를 모르도록 격리되어야 함을 의미한다.
일반적이고 쉽게 이해할 수 있는 가상화 기술로는 가상머신(Virtual Machine)이 있다. 가상머신은 호스트 운영체제 위에 가상의 하드웨어를 서비스하는 Hypervisor 같은 가상머신을 관리하는 별도의 소프트웨어가 돌아가고, 해당 소프트웨어가 제공하는 가상의 하드웨어에 게스트 운영체제를 설치해서 사용하는 방식이다. 우리가 잘 알고 있는 VMWare, Virtual Box 같은 가상머신 제품이 이와 같은 범주에 해당한다.
가상머신의 단점은 다음과 같다
1. 완전한 운영체제가 설치되기 때문에 대량의 메모리가 필요하다.
우분투 리눅스 서버를 올리려고 할 때, 메모리상에 로드되는 내용만해도 500MB 정도가 소모된다. 예를 들어, 가상머신 10개에 똑같이 우분투 리눅스 서버를 올리려고 할 때, 5GB 정도의 메모리가 사용될 수 있다. 물리적인 메모리의 양이 작은 경우 쓰레싱(Thrashing)을 초래해서 성능 저하가 발생할 수도 있다.
2. CPU 성능 확보에 대한 문제가 있다.
서로다른 애플리케이션이 CPU 자원에 대한 요청을 할 때 CPU 자원에 대한 경쟁이 발생하게 된다. 이 때, 우선순위 등을 주어서 운영체제 내에서는 효율적으로 관리를 할 수 있지만 가상화된 CPU가 실제 물리 CPU를 어떻게 얻을지는 정해지지 않았다. 예를 들어 1번 게스트 OS에 서 우선순위가 높다고 해도, 게스트 운영체제 자체가 우선순위가 낮다면 물리적인 CPU 자원을 확보하는게 쉽지 않을 수 있다.이와 같은 원인으로 CPU 자원 경쟁에 따른 성능저하가 있을 수 있다. 가상화 서비스에서는 이런 문제를 해결하기위해 Dedicate 서비스를 제공한다. 즉, CPU 같은 물리적인 자원을 특정 게스트 운영체제에게 전담배치시키는 서비스이다.
3. 시스템 운영에 대한 통합적인 지식이 필요하다
일반적인 시스템에서는 소프트웨어 개발과 시스템 운영이 분리가 되어 있었다. 하지만 가상머신체제에서는 이미 만들어진 시스템 위에 새로운 시스템을 구축하는 개념이기 때문에 통합적인 시스템 운영 지식과 소프트웨어 개발 지식이 통합 관리되어야하는 부담이 있다.
가상머신은 이러한 태생적인 문제를 가지고 있다. 물론 호스트 운영체제와 게스트 운영체제가 달라도 된다는 장점 등이 있을 수 있다. 예를 들어 윈도우즈에 VM Ware를 설치하고, 리눅스를 설치할 수 있다.
컨테이너(Container)란 무엇인가
가상머신의 생성 없이 호스트 운영체제에 애플리케이션을 같이 수행하면 어떨까? 애플리케이션을 하나의 운영체제에 같이 수행을 하는 경우엔 애플리케이션들이 디스크, 네트워크, CPU, 메모리 등을 공유하게되어 자원 활용과 보안 문제를 야기한다. 애플리케이션의 실행환경을 가상화하기 위해서는 애플리케이션이 사용하는 CPU, 메모리 등의 자원에 대한 쿼터(Quota)를 설정하고 관리할 수 있어야하며, 서로의 실행환경이 격리되어 있어야 한다.
가상머신을 사용하는 경우엔 하드웨어들이 가상화되기 때문에 자연스럽게 실행환경이 격리되고, 각 가상 하드웨어를 제공할 때 쿼터를 제공할 수 있어 간단하다는 장점이 있다. 하지만 위에서 봤던 단점들이 있다.
)
컨테이너 기반의 도커(상)와 가상머신(하)
컨테이너는 호스트 운영체제의 커널을 공유하면서 격리된 컴퓨팅 자원을 제공하는 가상화 기술이다. Hypervisor 같은 소프트웨어로 하드웨어를 에뮬레이팅하고 그 위에 게스트 운영체제를 설치하는 가상머신과 달리 컨테이너는 호스트 운영체제만 필요로하고, 커널을 공유하여 동작한다.
컨테이너 기술의 장점은 다음과 같다.
1. 부팅이 빠르다.가상머신은 가상 하드웨어를 준비하고, 그 위에 게스트 운영체제를 부팅해야한다. 따라서 부팅 시간이 느리다.컨테이너는 게스트 운영체제라는 개념이 없고, 단지 컨테이너 플랫폼 위에 프로세스를 띄우는 정도만 수행하면 된다. 가상머신에 비해 컨테이너의 서비스 부팅 시간은 비교할 수 없을 정도로 차이가 난다.
2. 메모리 사용량이 적다가상머신은 게스트 운영체제가 별도로 실행되어야 한다. 이 운영체제를 위한 시스템 메모리만 수 백 MB를 소모하는데, 단순히 애플리케이션 수행을 위해 수 백 MB의 메모리를 소모해야하는 것은 심각한 오버헤드다.컨테이너는 게스트 운영체제를 띄우지 않기 때문에 딱 애플리케이션과 애플리케이션이 수행할 때 필요로 하는 라이브러리, 환경 구성 정도의 추가 메모리를 소모할 뿐이다.
반면 컨테이너 기술은 다음과 같은 단점을 가지고 있다.
1. 자원의 격리와 쿼터 제한이 어렵다가상머신은 가상 하드웨어를 직접 제어할 수 있기 때문에 높은 수준의 자원 격리와 쿼터 제한을 수행 할 수 있다.컨테이너의 경우 가상 하드웨어를 두고 있지 않기 때문에 격리 수준과 쿼터 제한이 가상 머신에 비해 떨어질 수 밖에 없다. 하지만 컨테이너 서비스 플랫폼들의 격리 기술과 쿼터 제한 기술이 발전하고 있기는 하다.
2. 호스트 운영체제에 실행 환경이 묶인다.컨테이너는 호스트 운영체제의 커널을 공유하기 때문에 호스트 운영체제 환경을 그대로 가져갈 수 밖에 없다. 예를 들어, 리눅스에 컨테이너를 띄워서 윈도우즈 실행 환경을 만들 수 없다는 말이다.
컨테이너 서비스에 이와 같은 장 단점이 존재한다. 하지만 클라우드 서비스 환경에서 컨테이너 기술을 사용하는 것이 가상머신을 사용하는 것에 비해 얻을 수 있는 장점이 압도적이기 때문에 많이 사용되고 있다.
도커(Docker)란?
도커는 2013년 3월 산타 클라라에서 열린 Pycon Conference에서 dotCloud의 창업자 Solomon Hykes가 발표한 The future of Linux Containers 라는 세션을 통해 세상에 처음 알려졌습니다.
일반적으로 컨테이너는 배를 통해 물품들을 유통할 때 사용하는 커다란 수송용 박스를 의미한다. 각각의 컨테이너에는 옷, 술, 농산물 등이 들어 있을 수 있으며, 철저하게 규격화되어 있어 내부에 들어있는 물품에 상관없이 화물선이나 트레일러, 기차 등 다양한 운송수단에 쉽게 옮겨 실을 수 있다. (항만에 있는 크레인도 규격화 되어 있는 컨테이너를 쉽게 옮길 수 있다)
컴퓨팅에서도 마찬가지로 생각할 수 있다. 애플리케이션을 실행, 관리할 수 있는 규격화된 컨테이너 안에는 실행할 수 있는 애플리케이션과 애플리케이션을 위한 라이브러리들이 들어있다. 이 컨테이너는 잘 규격화되어 있어 디스크에도 존재할 수 있고, 실행되면 메모리로 올라갈 수도 있다.
도커(Docker)는 원래 항만에서 일하는 '부두 노동자'를 의미한다. 즉, 항만에서 잘 규격화되어 있는 컨테이너를 옮기고, 관리하는 직업을 도커(Docker)라고 하는 것이다.
컴퓨팅에서의 도커의 역할도 이와 다르지 않다. 잘 만들어져있는 컨테이너 이미지를 메모리상에 띄우거나 컨테이너 내부에서 작업한 내용을 다시 이미지로 커밋하는 등, 가상화에서 사용하는 컨테이너를 다루는 일을 하는 소프트웨어가 도커(Docker)이다. (약간의 언어 유희라고 보면된다.)
짧게 다시 말하면 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
출처 :