도커란(Docker)?
최근에 저희 회사 사내에서 필요한 몇 가지 서비스(Git Lab, Wordpress, Mysql, enginx 등..)를 어떻게 운영할지 고민하던 중 도커 기반으로 운영하게 되어 나중으로 미루던 도커를 공부하게 되었습니다. 이 글은 가장 빨리 만나는 도커(이재홍 저)를 참고하여 작성하였고, 초급 개발자 및 엔지니어를 대상으로 작성한 글이며, 저 또한 초급 개발자임을 밝혀드립니다.

도커(Docker)는 2013년 Docker, Inc 에서 go 언어로 개발된 오픈소스 컨테이너 프로젝트 입니다.

여기서 컨테이너라는 단어가 나왔는데, 우리가 보통 컨테이너라고 하면 그릇, 용기 라는 뜻으로 무언가를 담는 공간을 뜻합니다. 주변에서 흔히 보는 택배 차량의 뒷부분(화물칸)이나 화물선에 실려져 있는 컨네이너를 떠올릴 수 있습니다.

그러나 도커에서 의미하는 컨테이너란 택배나 화물선 위에 수출 용품을 싣는 컨테이너가 아닌 프로그램(소프트웨어)을 담는 격리된 공간을 의미합니다. 이 각각의 격리된 여러개의 소프트웨어 컨테이너에는 ubuntu, centos등의 운영체제 배포판부터, java, python, 아파치 웹서버나, mysql 같은 dbms 서버 등의 프로그램들 까지도 담기게 됩니다. 심지어 격리된 공간이기 때문에 각각의 컨테이너별로 중복해 설치하더라도 컨테이너간에 영향을 끼치지 않습니니다

글 상단의 아이콘은 도커의 로고인데, 고래 위에 여러개의 컨테이너가 얹어져 있는 모습을 하고 있습니다. 여기서 고래는 컨테이너를 생성하고 관리하는 도커의 핵심인 도커 엔진을 의미합니다. 사전적 의미를 봐도 Dock은 조선소 항만을 의미하며 Docker는 그곳에서 일하는 사람을 의미하죠. 마치 부두에서 컨테이너를 선박에 올리기도 하고 내리기도 하면서 컨테이너를 관리하는 주체라는 느낌을 받는 명사입니다.


도커 프로젝트
위에서 도커를 오픈소스 프로젝트라고 했는데, 사실 도커는 기술 자체를 의미 하기도 하지만 여러가지 가상화 컨테이너 관련 기술들을 개발하는 오픈소스 프로젝트이기도 합니다.

도커 프로젝트로는 도커 컴포즈(Docker Compose), 레지스트리(Private Registry), 도커 머신(Docker Machine), Kitemeatic 등 여러가지가 있으며, 일반적으로 도커(Docker) 라고만 하면 도커 엔진(Dcoker Engine)을 말합니다.



도커의 등장 배경 및 등장 이전의 상황
도커의 등장 배경을 설명하기에 앞서 웹서비스를 위한 웹서버를 띄우는 과정을 예로 들어보겠습니다. 웹서버(소프트웨어)를 하나 띄우기 위해서는 웹서버를 띄울 수 있는 물리적인 컴퓨터 서버 장비(하드웨어)가 필요합니다. 과거에는 웹서버가 필요하다고 판단이 되면, 예산을 책정하고 그에 맞는 물리적인 서버 컴퓨터를 구입하였습니다. 

서버 컴퓨터는 매우 비싸기 때문에 용도와 예산, 성능을 고려하고 향후 유지보수 관리 비용까지도 미리서 철저히 예측한 다음 구매해야 합니다.

그런데, 기업에서 사용하는 서버 장비들은 일반 PC와 같이 하이마x 같은 곳에 가서 카드로 결제하여 그날 바로 가져가는 것과 같이 간단하게 구입하여 사용할 수 있는것이 아닙니다. 서버 장비를 구매하기 위해서는 비용과 시간을 많이 투자해야 하며(조달시간도 오래걸림), 사양을 변경하거나 늘릴 경우 가격과 시간이 추가적으로 많이 투자되어야 합니다.

만약 웹서버를 운영중에 서버 사양이 부족하다고 판단되어도 간단하게 변경할 수 있는 것이 아닙니다. 특히나 서비스를 운영중이라면 더욱 쉽지 않은 일입니다. 쇼핑몰을 예로 들자면 서버 사양 변경을 위해서는 쇼핑몰 서비스를 잠시 중단해야 할 것입니다.

그렇지만 이때 등장한게 클라우드 환경입니다. 2010년이 넘어서면서 서버 인프라 환경은 클라우드 환경이 대세가 되었습니다. 클라우드 환경은 앞에서 설명했던 어려움들을 클릭 몇 번 만으로 해결하는 것이 가능했습니다.

그러나 클라우드 환경에서도 가상 서버에 기본적인 각종 소프트웨어를 설치하고 설정을 잡아주어야 했는데, 서버가 여러대로 늘어날 수록 설정이 어렵고 시간이 투자되어야 했습니다.

더군다나 마이크로서비스 아키텍처가 등장하면서 거대한 한 덩어리의 서비스를 잘게 쪼개어 여러개의 서비스로 운영하는 환경으로 대세가 바뀌면서 각각의 서비스를 띄우기 위한 서버를 구축해만 했습니다. 그때마다 각각의 서버(리눅스/유닉스)에는 기본적인 라이브러리를 설치하고 웹서버 또는 WAS를 설치해야 했으며 초기 설정을 해주는 등의 작업을 반복해서 해주어야 했습니다.

물론 쉘 스크립트를 작성하여 설치와 설정 등을 자동화시킬 수도 있지만 쉘스크립트에는 한계가 존재했습니다. 쉘 스크립트로는 중앙 관리 기능이나 복잡한 기능의 구현은 힘들기 때문입니다.

이때 Immutable Infrastructure 라는 패러다임이 등장했습니다.



Immutable Infrastructure 패러다임과 그것을 구현하는 도커
Immutable Infrastructure는 직역하자면 불변의 인프라(기반)으로 어떤 서비스를 구축하는 기반이 되는 것들을 변경하지 않는 패러다임을 뜻합니다.

호스트 OS와 서비스 운영 환경(서버 프로그램, 소스코드, 컴파일된 바이너리)를 분리하고 한번 설정한 운영 환경은 변화하지 않습니다. 즉 한 번 구축 및 설정한 서비스 운영 환경을 이미지로 생성한 뒤 서버에 배포하여 실행합니다. 이때 서비스가 업데이트되면 운영 환경(인프라) 자체를 변경하지 않고 이미지를 새로 생성하여 배포하는 것입니다.

클라우드 플랫폼에서 서버를 쓰고 버리는 것처럼 Immutable Infrastructure에서도  운영 환경 이미지를 한 번 쓰고 버립니다.

뜬금없이 Immutable Infrastructure 패러다임을 설명한다고 생각할 수 있겠지만 도커는 이러한 Immutable Infrastructure를 구현해낸 도구입니다.



도커와 가상 머신의 차이
그런데 지금까지 설명했던 Immutable Infrastructure 개념은 VMware나 VirtualBox와 같은 가상머신 환경을 이야기 하는 것처럼 들립니다. 이러한 가상머신들 또한 그 위에 여러 운영체제를 설치하고 여러 어플리케이션 및 라이브러리들을 설치한 뒤 이미지화 하여 매번 복사해서 사용할 수 있기 때문입니다.

그렇다면 가상머신과 Immutable Infrastructure 도구인 도커에는 어떤 차이가 있을까요?


가상머신
가상 성능이 좋지 못한 단점이 있습니다. CPU에 가상화를 위한 기능들이 추가되긴 했지만 물리적으로 하나의 환경으로 존재하는 것을 논리적으로 가상화해야 하기 때문에 그런 작업에 필요한 비용(overhead)이 추가적으로 발생하기 때문입니다.

물론 전 가상화(Full Virualization)의 느린 속도를 개선하기 위한 반가상화(Paravirtualization) 방식이 개발되었고, 현재 널리 쓰이고 있습니다. 그러나 그렇다고 해서 성능 문제가 모두 해결될 수는 없었습니다.


그뿐만 아니라 가상머신은 그자체가 리눅스나 유닉스같은 OS가 아니라 단순히 논리적으로 가상화된 머신(컴퓨터) 입니다. 따라서 가상머신 위에 운영체제(Guest OS)를 설치해야 하고 각각에 사용되는 라이브러리 커널 등을 모두 포함하기 때문에 그에 따른 이미지 용량은 엄청나게 증가하게 되고 이미지를 공유하는 것 또한 부담될 것입니다. 또한 여러대의 가상머신이 있을 때 서로에게 필요한 자원이 중복되어도 서로 공유할 수도 없습니다.


도커
도커는 반가상화 환경보다 더 발전한 형태로 Host OS 바로 위에서 동작하기 때문에 가상머신과 Guest OS를 동작시키기 위한 가상화 비용이 발생하지 않습니다. 



도커 이미지에 운영을 위한 어플리케이션 및 라이브러리만 격리하여 설치 가능하며, OS 시스템 자원은 Host와 공유합니다. 따라서 이미지의 용량도 가상머신을 이용할때보다 훨씬 줄어들었습니다.

또한 이미지 용량뿐만 아니라 하드웨어를 가상화하는 계층이 없기 때문에 메모리 접근이나 네트워크 등을 이용하는 속도가 가상머신보다 훨씬 빠른데, Docker 1.1.2 버전 기준으로 벤치마킹 당시에는 Host OS로만 동작했을때와 속도 차이가 거의 3%도 나지 않았습니다.


다음글
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!