본문 바로가기
검색
  • 홈으로
  • 지식마당
  • 웹진자료
  •  

웹진자료

게시글 상세 보기
제목 <웹진 159호: 인사이드 이슈> 스타트업을 위한 DevOps 환경 - Docker 인프라
작성일 2016.01.08 작성자 관리자 조회수 3859
첨부파일

‘2014년에 가장 인기있는 클라우드 오픈소스’ 조사 결과, 1위는 오픈스택, 2위는 도커였다. 하지만 최근에 오히려 더 주목받고 있는 건, ‘도커’라는 평이 대세다. 도커는 한마디로 컨테이너 응용프로그램의 배포를 자동화하는 오픈소스 엔진이다. 이미 국내외 컨퍼런스에서 여러번 소개되었고, 지난 11월 소프트웨어공학센터 웹진-인사이드이슈에서도 소개된 바 있다.

(155호 웹진: 인사이드 이슈_’컨테이너 기술에 대한 이해' 참조) 


구글과 IBM, 마이크로소프트(MS) 등 많은 글로벌기업들의 도커에 대한 관심도 높아지고 있고, 그 예로 구글은 도커 기술을 활용한 새로운 오픈소스 프로젝트 ‘쿠베르네테스’를 시작했으며, 도커 기술을 엔터프라이즈 기술로 가져오는 데 힘쓰고 있다. 하지만 도커의 인프라 부문은 복잡하고 어려운 기술을 담고 있기에 새로운 기술을 섣불리 채택하기 힘들다는 특징을 가지고 있다. 그렇기 때문에 축적된 노하우가 없는 스타트업에겐 더 어렵게 느껴질 수 있다.

SK planet에서 1년 넘게 도커 인프라 프로젝트를 진행하면서 도커를 도입하기 위해 많은 고민을 해 온 황상철 매니저로부터 ‘스타트업에서 도커를 도입하는 방안’에 대한 구체적인 조언을 얻을 수 있었다.


<SK planet 황상철 매니저>


  1. 도커가 스타트업에 적합한 이유

  2. 도커 활용의 구체적 방법

  3. 결론



Q: 어떤 이유로 도커가 스타트업에 적합한가요?

 

지난 몇 년 간, 제가 스타트업 멘토링을 진행해왔는데요. 스타트업마다 상황은 다르겠지만, 그동안 만났던 스타트업에 인프라 전문가는 없었습니다. 적은 인원으로 많은 일을 해야하는 상황에 전담 인력을 두는건 불가능하겠죠. 하지만 스타트업이라고 개발환경,운영환경을 소홀히 해서는 서비스를 제대로 유지할수 없습니다. 그렇다면 이렇게 전문가도 없고 개발 일정도 빠듯한 상황이라면 어떻게 해야 할까요? 제가 추천하는 해결책은 ’도커를 도입하라’입니다. 그럼 도커 도입이 어떤 장점을 가져다 주는지 살펴보겠습니다.


이미지 하나로 어디든 배포 할 수 있다.

서비스를 도커 이미지로 만들어 놓으면 개발환경, 통합환경, 운영환경 어디든 사용 할 수 있습니다. 개발환경 설정이라는 것이, 잘하는 사람은 뚝딱 끝내지만 모르는 사람은 많은 시행착오를 겪게 됩니다. 요즘에는 개발장비로 맥을 많이 사용하는데, 도커는 윈도우나 맥 둘 다 사용이 가능합니다. 리눅스를 쓴다고 했을 때 우분투,CentOS 등 배포판이 달라도 상관없습니다.


서버 한대로 가상 환경을 만들 수 있다.

자체 인프라가 있다면 가상 서버처럼 활용이 가능합니다. VSpeare 같은 비싼 가상서버 라이센스 비용을 지불하지 않아도 베어메탈 서버를 가상화 서버처럼 사용 할 수 있습니다.


공개 클라우드에서도 활용 할 수 있다.

AWS 같은 공개 클라우드를 사용할 때도 도커 이미지 단위 배포가 가능합니다. 컨테이너로 배포하기 때문에 복잡한 설정도 피할 수 있습니다. 아마존 클라우드 구글 클라우드 둘다 도커를 직접 지원하기 때문에 오히려 더 편합니다.


스케일 아웃이 가능합니다.

사용자가 갑자기 늘어서 서비스에 유입되는 트래픽이 폭증하면 서버를 늘려야 합니다. 이때 도커 컨테이너를 원하는 만큼 만들어서 처리량을 쉽게 늘릴 수 있습니다.


도커를 도입했을 때의 몇 가지 효과를 말씀드렸는데요. 이렇게 도커는 처음에 한번만 잘 준비해 놓으면, 개발단계부터 운영단계까지 폭넓게 활용이 가능하기 때문에 인프라에 대한 준비가 부족한 스타트업에게 큰 도움이 됩니다.


Q: 도커를 활용하는 구체적인 방법이 궁금합니다.


스타트업을 준비하시는 분들께서 활용하실 수 있도록 DockChat이라는 샘플을 가지고 직접 환경을 구성하면서 설명을 통해 보여드리겠습니다.


1. 로컬환경 구성

앞서 설명한 장점을 바탕으로 도커를 도입하기로 결정했다고 가정해 보겠습니다. 그럼 어디에서 부터 시작해야 할까요? 바로, 로컬에 도커를 설치해야 합니다. 아래는 제가 추천하는 로컬 도커 환경입니다.

● Virtual Box

● Docker Machine

● Docker Compose


맥이라면 kitemetic을 선호합니다. UI가 편하고 예뻐서 사용성이 좋은데요, 처음부터 UI도구를 쓰게 되면 도커를 운영할 때 어려울 수 있어서 CLI 환경을 권합니다. 위에서 언급해 드린 도구들은 docker-toolbox를 이용해 한번에 설치할 수 있습니다. 이렇게 각 도구에 대한 설치가 끝났다면 docker-machine으로 dev라는 이름의 테스트 서버를 하나 추가합니다.

$ docker-machine create-driver virtualbox dev


잠시 기다리면 서버가 추가되었다는 메시지가 나타납니다. 그럼 서버를 확인합니다.

$ docker-machine ls

<그림 1> dev 노드 생성결과



이제 마음대로 도커를 사용할 수 있는 준비가 끝났습니다. [그림1 참조]


2. 서비스 개발

도커 이미지로 서비스를 배포하려면 서비스에 맞는 도커 이미지를 만들어야 합니다. 도커도 익숙치 않은데, 도커 이미지를 만드는건 엄두가 안나죠. 그렇다면 DockerHub에 올려있는 이미지를 받아서 사용하시면 됩니다. 이미 많은 사람들이 올려놓은 이미지가 수천 개가 넘기 때문에 활용도가 높습니다. 여러분이 사용하고 있는 대부분의 오픈소스가 도커 이미지로 만들어져서 DockerHub에서 관리되고 있습니다.

만약, 마음에 드는 이미지를 찾았지만 조금 바꾸고 싶다면 어떻게 해야 할까요? 이 부분도 수정이 가능한데요. 도커이미지를 만들 때 사용하는 Dockerfile도 DockerHub에 공개되어 있기 때문에 Dockerfile을 받아서 수정한 다음, 나만의 이미지를 만들면 됩니다. 


다음으로는 몽고 DB와 파이썬으로 만들어진 DockChat을 가지고, 앞에서 만든 dev 서버에 서비스를 올려보겠습니다.

ssh로 dev 서버로 들어갑니다.

$ docker-machine ssh dev


git으로 dockchat 서비스를 클론합니다.

$ git clone https://github.com/nicolaka/dockchat.git


dockchat 서비스 내용을 확인합니다.

$ cd dockchat $ ls

<그림 2> dockchat 프로젝트 내용 확인



도커 이미지를 만드는데 사용하는 Dockerfile과 Docker Compose가 사용하는 docker-compose.yml 파일이 보입니다. [그림2 참조]

Docker Compose로 DockChat 이미지를 만들겠습니다.

$ docker-compose build


이미지 조회를 해보면 dockchat_web과 mongo 이미지가 추가된 것을 확인할 수 있습니다. [그림3 참조]
$ docker images

<그림 3> dockchat 이미지 생성 확인


이렇게 이미지를 만들었다면, 서비스를 실행하는 것은 너무 간단합니다.

$ docker-compose up

ip를 확인하여 웹 브라우저로 http://{docker-machine ip dev}:5000에 접속합니다.


<그림 4> dockchat 컨테이너 접속화면


3. 이미지 빌드서버 구축

로컬에서 개발할 때만 사용한 이미지를 운영에서도 그대로 사용할 수 있습니다. 하지만 매번 로컬에서 이미지를 빌드하는 건 불편하기때문에 도커이미지 빌드를 위한 빌드서버를 구축하는 것을 권해드립니다.

Docker Machine으로 build라는 이름의 가상서버를 추가합니다.

$ docker-machine create-driver virtualbox build


build 서버로 들어가서 젠킨스 컨테이너를 추가합니다.
$ docker-machine ssh build $ docker run -d -p 8080:8080 -privileged jenkins

젠킨스 서버에서 도커 명령어를 사용할 수 있습니다. 젠킨스 Job을 추가하고 이 Job이 도커 이미지를 빌드하도록 설정합니다.

4. 레지스트리 서버 구축
빌드된 이미지를 저장할 저장소가 바로 레지스트리입니다. 공개 레지스트리가 DockerHub인 셈입니다만, 공개하지 못할 이미지라면 비공개 레지스트리를 만들어서 사내에 운영해야 합니다.

Docker Machine으로 registry라는 이름의 가상서버를 추가합니다.
$ docker-machine create-driver virtualbox registry

레지스트리 컨테이너를 실행합니다.

$ docker-machine ssh registry $ docker run -p 5000:5000 -v

<HOST_DIR>:/tmp/registry-dev registry

dockchat_web 이미지를 비공개 레지스트리 서버에 푸시해 보겠습니다.
$ docker-compos build
$ docker tag dockchat_web {docker-machine ip registry}:5000/k16wire/dockerchat:v1
$ docker push {docker-machine ip registry}:5000/k16wire/dockerchat:v1

이미지 빌드서버가 도커 이미지를 빌드하면 사내 레지스트리 서버에 이미지를 푸시하도록 자동화 해 놓으면 편합니다.

5. 운영환경 구성
이렇게 이미지, 빌드서버, 레지스트리 서버가 준비되었다면, 운영서버에 배포할 준비는 모두 끝났습니다. 이제 도커 운영환경을 만들어야 하죠. 도커 운영환경은 멀티 노드로 구성된 클러스터로 만들어야 필요할 때 노드를 추가하거나 제거할수 있습니다.

Docker Swarm과 Consul을 이용해 멀티 노드 클러스터를 구성해 보겠습니다.

● Docker Swarm

● Consul

Docker Machine을 이용해 Cosul서버를 설치할 노드를 추가합니다.

$ docker-machine create -d virtualbox mhl-consul


mhl-consul 노드에 consul 컨테이너를 추가합니다.

$ docker-machine ssh mhl-consul

$ docker $(docker-machine config mhl-consul) run -d₩

-p 8500:8500₩

-h consul \

progrium/consul -server -bootstrap


Swarm 클러스터에 새로운 mhl-demo0 노드를 추가합니다.

$ docker-machine create \

-d virtualbox \

-engine-opt=“cluster-store=consul://$(docker-machine ip mhl-consul):8500” \

-engine-opt=“cluster-advertise=eth1:0” \

mhl-demo0


<그림 5> Swarm 클러스터 구성 결과



위와 같이 Swarm 클러스터가 만들어졌습니다.[그림 5 참조] 이 클러스터에 오버레이 네트워크를 구성하면 어떤 호스트에 컨테이너를 생성하든지 컨테이너간에 통신이 가능합니다. 예를 들어 DockChat Web 컨테이너는 mhl-demo0에 5개 실행해 놓고 mhl-demo1 노드를 하나 더 추가해서 거기에 Mongo DB를 실행할수 있습니다. 이때 DockChat web서버를 여러개로 늘렸을 때, 이 요청을 받아서 뒤에 있는 web서버에게 요청을 나눠주는 서버가 필요합니다. HaProxy나 nginx를 이용해서 리버스 프록시 서버를 구성할수 있습니다. (자세한 구성은 내용이 너무 많아 생략합니다.)


mhl-demo0노드에 DockChat web 컨테이너를 5개로 늘려야 한다면

● 이미지를 레지스트리에 푸시하고

● 각 도커 호스트는 레지스트리에서 이미지를 가져 올 수 있게 네트워크를 설정합니다.

● docker-compose yml도 이미지를 빌드하는 형태가 아닌 레지스트리에서 가져오는 형태로 수정합니다.


이와 같이 준비가 끝나면 docker-compose를 이용해 스케일 아웃이 가능합니다.

$ docker-machine ssh mhl-demo0

$ docker-compose -p dockchat_production scale web=5


컨테이너가 5개로 늘어나는 것을 볼 수 있습니다.


도커로 서비스를 운영하려면 여기서 설명한것 외에도 도커 호스트 서버와 컨테이너에 대한 모니터링,로깅을 위한 도구가 필요합니다. 여러 서버에 걸쳐 컨테이너가 배포되도록 리소스 스케쥴링 도구도 중요하죠. 앞에서 언급한 Docker Swarm도 이 기능을 지원합니다만, 구글이 공개한 kubernetes도 많이 사용합니다.


Q: 스타트업을 준비하는 분들께 추가로 당부 드리고 싶은 말씀이 있다면요?


위와 같이 스타트업에서 도커를 활용한다고 했을 때, 꼭 필요한 환경 구성을 빠르게 설명드렸습니다. 사실, 여기서 설명한 내용만 가지고 완벽한 환경을 구성하기는 어렵습니다만 ‘도커를 도입’하려면 어떤 준비가 필요한지 감을 잡을 수 있으리라 생각합니다. 이제는 무엇보다도 ‘실행력’이 가장 중요한 시대가 되었는데요. ‘얼마나 서버를 쉽고 빠르게 만들 수 있는가’에 따라 개발의 효율성이 높아진다는 부분을 항상 유념해야만 합니다. 스타트업들이 도커를 활용해서 개발기반을 탄탄히 다져, 더 좋은 서비스를 만드는 데 집중할 수 있다면 좋겠습니다.


(황상철 매니저가 진행했던 Docker PAAS 구축 프로젝트에 대한 내용은 지난 10월에 열렸던 TechPlanet 2015 자료를 통해 만날 수 있다.)


댓글쓰기

등록

댓글보기 (총0 개)

홈페이지 내 게시된 정보 문의
  • 담당자 : 유봉식 책임
  • 전화번호 : 02-2132-1367
  • 이메일 : krystal78@nipa.kr