개발자라면 한번 쯤은 개발환경 구축으로 골머리가 난 적이 있을 것입니다!
매번 필요한 환경을 지우고 깔 수도 없고 여러 환경에서 테스트도 해보고 싶은데..!!
도커를 이용하면 빠르고 편리하게 개발환경을 구축할 수 있습니다.
# 들어가기 전에..
최근 모바일 환경이 강조되고 글로벌 서비스가 많아지면서 빠르고 민첩하게 원하는 서비스를 만들어야 하는 요구가 높아지고 이를 위한 인프라 관리 중요성도 강조되면서 클라우드가 인기를 끌었습니다.
클라우드란 인터넷 상(cloud)의 유틸리티 데이터 서버에 프로그램을 두고 그때 그때 컴퓨터나 휴대폰 등에 불러와서 사용하는 웹에 기반한 소프트웨어 서비스를 말합니다. 일반적인 클라우드 컴퓨팅에서 소프트웨어와 데이터는 서버에 저장됩니다.
쉽게 말해서, 정보는 인터넷 상의 서버에 영구적으로 저장되고 데스크탑이나 테이블 컴퓨터, 노트북, 벽걸이 컴퓨터, 휴대용 기기 등과 같은 클라이언트에는 일시적으로 보관되어 사용되는 원리입니다.
기업은 이러한 클라우드 서비스를 통해 인프라를 빌려 쓰고 남는 자원 없이 효율적으로 관리할 수 있게됩니다!
기존 인프라 운영방식보다 가격 면에서 훨씬 저렴해지죠.
도커는 이러한 클라우드 원리를 이용하여 개발에 있어서 빠르고 편리함을 위해 고안된 기술입니다!!
# 도커(Docker)란?
도커는 오픈소스 프로젝트명인 동시에 기업명이기도 합니다.
도커는 기본적으로 "컨테이너"라고 부르는 애플리케이션 자동화 기술을 좀 더 "쉽게" 사용할 수 있도록 하기 위해 만들어졌습니다. 컨테이너란 설치나 실행에 필요로한 온갖 정보와 설정과 자료를 한군데 모아둔 것을 의미합니다.
컨테이너는 정형화된 규격에 맞춰 제품을 넣으면 운송수단에 관계없이 효율적인 운송이 가능해질 것이라는 아이디어에서 나온 것입니다. 그 결과 비행기, 기차, 화물선 등 운송수단에 관계없이 안정적인 화물 운송이 가능해졌고 운송 비용은 엄청나게 낮아졌습니다.
따라서 도커의 컨테이너 기술은 플랫폼(운송수단)에서 운영할 애플리케이션(화물)을 얼마나 효율적으로 운영할 수 있는가에서 출발한 것이라고 볼 수 있죠!
LXC(LinuX Containers)로 만든 컨테이너는 고유의 파일시스템, 프로세스, 네트워크 공간을 가집니다. 마치 가상 머신처럼 독립적이고 격리된 공간이죠. 컨테이너는 호스트의 커널을 공유하는 가상 공간입니다. 따라서 컨테이너 안에는 따로 커널이나 각종 장치를 위한 드라이버를 넣을 필요가 없습니다. 이 때문에 가상 머신이 아닌 컨테이너로 불립니다.
# 이미지
도커에서 중요한 개념 두 가지가 있는데, 하나는 컨테이너고 다른 하나는 바로 "이미지"입니다.
이미지는 서비스에 필요한 프로그램, 라이브러리, 소스 코드 등을 묶은 파일을 뜻합니다. 즉 운영체제로 치면 이미지는 실행 파일이고 컨테이너는 프로세스라 할 수 있죠.
이미지는 보통 우분투, CentOS 등의 리눅스 배포판 이미지를 기반으로 만듭니다.
위의 그림은 도커 컨테이너의 작동 알고리즘을 이해하기 쉽게 그려놓은 것입니다.
도커 유저(Host1)이 자신의 환경을 컨테이너로 구축하여 오픈소스 저장소에 배포하면 다른 도커 유저(Host2)가 이를 검색하여 다운받아 자신의 도커엔진으로 새로운 컨테이너를 구동하게 됩니다.
도커는 리눅스 환경에서만 구동되는데, 리눅스 터미널에서 도커엔진을 통해 이미지를 검색합니다. 예를들어 python 3.3 버전이 설치된 환경을 가지고 싶다면, 이미지명이 python 3.3인 이미지를 검색하여 적절한 이미지를 다운받아 새로운 컨테이너를 설치하게 되는 것입니다.
# Docker vs Virtual
리눅스 컨테이너 기술은 가상화와 비슷한 기술입니다. 가상화 기술은 하이퍼바이저라는 기술이 반드시 있어야 합니다. 하이퍼바이저는 하나의 컴퓨터에서 여러 개의 운영체제(OS)를 사용할 수 있게 도와주는 기술입니다. 가상화 환경은 가장 밑단에 깔린 호스트 OS를 공유합니다.
만약 게스트 OS가 네트워크를 많이 사용하는 애플리케이션을 돌리면 어떻게 될까요? 한정된 호스트 OS 자원으로는 애플리케이션을 감당하기 어렵게 됩니다. 하이퍼바이저도 호스트 OS와 게스트 OS, 애플리케이션을 중재하는 과정에서 많은 작업을 처리하게 됩니다.
하지만 도커는 하이퍼바이저와 달리 게스트 OS를 두지 않고 호스트 OS 커널(리눅스 운영체제의 가장 핵심이 되는 요소)을 바로 사용합니다. 하이퍼바이저 대신 도커 엔진이 올라가, 호스트 OS와 여러 애플리케이션을 연결해주는 역할을 합니다.
따라서 도커를 사용하면 가상화보다는 내부에서 더 적은 일을 처리하고, 애플리케이션을 좀 더 빠르고 효율적으로 실행시킬 수 있습니다.
* bins/libraries : common Unix directory
도커와 가상화의 장단점을 비교하자면..
도커는 간단히 말해 단일 기종의 OS를 한 시스템에서 더 빠르게 생성하고 사용하고 하는데 상대적인 성능과 기능 우위에 있습니다. 반면 다양한 종류의 OS를 수용 하기에는 가상화가 더 어울리죠.
도커 컨테이너를 이용하면 물리적 서버와 가상 서버 또는 클라우드 인스턴스 간 애플리케이션 이동이 쉽습니다.
하이퍼바이저를 사용하면 여러 OS를 한 하드웨어에서 쓸 수 있습니다. 단일한 하드웨어에서 리눅스도 여러 배포판을 쓸 수 있고, 윈도도 여러 버전을 쓸 수 있습니다. 도커는 이게 불가능합니다. 다양한 OS 환경을 운영해야 한다면 하이퍼바이저를 쓰는 게 더 유용할 수 있습니다.
반면, 동일한 애플리케이션을 여러 에디션이나 버전으로 관리해야 한다면 컨테이너가 유용할 것입니다. 도커의 경우 SW 업데이트와 버전관리가 용이하기 때문이죠!
요약하자면 VM웨어 등이 제공하는 "서버 가상화 기술"은 서버 한대를 여러 대처럼 쓸 수 있게 해줘 IT효율성을 끌어 올려주는 기술인 반면 도커와 같은 "컨테이너 가상화 기술"은 특정 애플리케이션에 최적화된 가상 공간을 만들어주는 개념인거죠!!
좀 더 쉽게 이해하기 위해 ‘공항’을 생각해봅시다. 도커는 더 많은 비행기를 뜨고 내리게 하기 위해 공항 전체를 가상화 할 필요가 없이 활주로만 가상화 시켜 본래 목적에 맞게 더 많은 비행기의 이착륙을 돕는다고 보면 됩니다:)
# Docker 특징
도커는 컨테이너 안에서도 호스트와 거의 동일한 성능이 나오는 것이 가장 큰 특징입니다.
또한, 컨테이너 안에 운영체제를 설치할 필요가 없으므로 가상 머신 이미지에 비해 용량 부담이 적고 전체적으로 가볍습니다. 오픈소스 내에서 공유되는 컨테이너는 만들어질 때 구성파일을 통해 이미지를 만들면 되기 때문에 구성되는 파일만 공유합니다.
컨테이너를 활용하면 리눅스 OS 아랫 단의 하드웨어 부분에 대한 시스템 요구사항을 개발자가 제어 및 관리할 수 있습니다. 앱의 이동성(portable)을 쉽게 확보할 수 있다는 의미죠.
또한 도커 커뮤니티는 수 많은 개발자들이 자신들의 이미지를 사이트에 올려 공유합니다. 하지만 실제로 돌려보지 않으면 이미지에 어떤 파일이 들어있는지 알 수 없다는 취약점을 가지고 있습니다. 여기에 악성코드라도 담기 시작한다면...! 보안상 큰 문제가 발생할 가능성이 크겠죠?
# Docker가 각광받는 이유?
도커가 각광을 받는 이유는 개발자들이 개발에만 신경을 쓸 수 있기 때문입니다. '효율적'인 개발이 가능하다는 의미죠!!
개발자들은 소프트웨어 개발을 위해서는 환경을 먼저 고민한다고 입을 모읍니다.
리눅스라면 커널 버전은 무엇인지, 운영체제 버전은 어떤 종류인지 등에 대한 환경을 먼저 고려합니다. 운영체제가 다르면 자바 등 언어의 패키지 버전도 다르기 때문에 당연히 신경을 쓸 수 밖에 없겠죠? 개발자는 코드를 작성하기 위해 시간을 써야 하는데 환경을 구성하기 위해 더 많은 시간을 할애해왔으니 .. :(
그러나 컨테이너가 등장하면서 코드에만 신경을 쓸 수 있게 됬습니다!! 도커가 각광을 받는 것은 이같은 이유에서죠~
시스템 운영자들의 경우도 개발자들의 환경을 위해 패키지 구성 요소 등에 대한 부분도 세세히 신경써야 했지만 컨테이너 등장 이후에는 기본적인 운영베이스만 만들어주면 끝입니다. 유연하고 날렵한 격리된 환경을 활용해 실험적인 개발을 진행할 수도 있습니다. 왜냐하면 컨테이너는 운영체제 커널에 관계없이 실행되기 때문이죠!! 예를 들어 5.5 버전에서 운영하다가 버전 6 또는 7에서 운영하고 싶다면 컨테이너로 바로 옮기면 끝! 이 얼마나 간편한 새로운 환경구축인가요...!!
이상 개발자들을 위한 클라우드 기술인 도커(Docker)에 대해 알아보았습니다:)
더 자세한 것은 참조를 활용하시길 바랍니다.
*Reference------------------------------------------
>> 도커 홈페이지 https://www.docker.com/
>> 예제파일 소스 https://github.com/gilbutitbook/006756
>> 책 원고 http://www.pyrasis.com/book/DockerForTheReallyImpatientz
http://www.zdnet.co.kr/news/news_view.asp?artice_id=20140812121328
http://www.ittoday.co.kr/news/articleView.html?idxno=53653
http://navercast.naver.com/contents.nhn?rid=122&contents_id=66402&leafId=122
http://www.bloter.net/archives/209868
http://www.imaso.co.kr/news/article_view.php?article_idx=20141222114242
댓글