꿈꾸는 시스템 디자이너

Docker란? | Docker를 사용하는 이유 | Docker 장점 본문

Development/Cloud computing

Docker란? | Docker를 사용하는 이유 | Docker 장점

독행소년 2020. 7. 9. 13:08

 

최근 본 블로그에 Docker 사용법을 몇 번 포스팅 했다.

 

Docker를 사용하기 전 Docker가 무엇이며 왜 사용해야 하는지에 대해 짧게 정리해보려고 한다.

 

이미 Docker에 대해 자세하게 잘 설명된 블로그들이 많다. 그리고 좋다는 소문이 많으니 나도 Docker를 한번 사용해 볼까? 그런데 Docker가 뭐고 왜 사용해야 하지? 하는 사람들에게 조언하자면..

 

Docker란?

Docker는 서버 가상화 기술 중 한 종류다. 물론 일반 PC에서도 사용 가능하다.

 

가상화란?

그럼 가상화란 무엇인가?

기존에 VMware나 VirtualBox 등을 사용해본 사용자라면 쉽게 이해하겠지만 이미 운영체제를 설치한 상황에서 VM(Virtual Machine)을 설치하고 그 위해 또 다른 운영체제를 설치하는 기술이다. 윈도우를 설치한 PC에서 우분투 등의 리눅스 머신이 필요할 때 VMware를 설치하고 그 위해 우분투를 설치하면 하나의 PC에서 윈도우와 우분투를 동시에 사용할 수 있게 되는 방식이다.

 

Docker도 가상화 기술이므로 동일하게 호스트 OS 위에 복수개의 게스트 OS를 복수개 설치할 수 있게 해준다.

 

왜 가상화 기술을 사용하지?

이론적인 가상화 기술을 목적은 컴퓨팅 자원의 활용률을 높이기 위해서다. 하나의 컴퓨터에 복수의 OS를 동시에 동작시키면 논리적으로는 복수개의 컴퓨팅 환경이 준비되기 때문에 자원 활용률이 높아진다.

 

그럼 우린 왜 사용하는가? 본인의 경우는 개발자이기 때문에 개발환경이 필요해서 사용해 왔다. 호스트 OS는 윈도우를 사용하고, 추가로 개발용 OS로 우분투를 주로 사용하는데, 가상화 기술을 이용하면 한 대에 PC에서 윈도우와 우분투를 동시에 사용할 수 있기 때문이다.

 

또 본인은 서버도 개발하는데 개발용 서버와 운영용 서버가 별도로 필요하다. 더 나아가 개발용 서버는 빈번하게 갈아엎어야 할 때도 많다.

 

근래에는 거의 클라우드 컴퓨팅 서비스를 이용하지만 인스턴스를 생성할 때마다 개발환경을 설치와 설정을하는 반복 것도 번거롭다.

 

이럴 때 잘 세팅된 환경을 이미지로 구워 놓았다가 개발환경을 갈아 엎을 때 마다 미리 준비했던 이미지를 이용하면 번거로운 작업을 생략할 수 있다.

 

그럼 왜 Docker인가?

 

성능 측면

VMware를 사용해 본 사람이라면 자주 느꼈을 것이다. VMware는 많이 무겁다. 그러므로 그 위해서 동작하는 게스트 OS도 꽤 무겁게 동작한다. 

 

왜 무거웠을까?

VMware와 같은 기존의 가상화 방식에서는 하이퍼바이저(Hypervisor)라는 VM이 존재하고 그 위에 다시 호스트 OS가 설치된 후 최종적으로 호스트 응용이 실행되게 된다. 응용 프로그램에 입장에서는 게스트 OS와 하이퍼바이저를 거쳐야 호스트 OS를 통해 컴퓨텅 자원에 접근할 수 있게 된다.

 

Docker의 경우는 어떨까?

간단히 설명하면, Docker의 경우는 별도의 게스트 OS는 설치되지도 않고, 별도의 하이퍼바이저도 거치지 않으며, Docker 엔진을 통해 바로 호스트 OS를 통해 컴퓨팅 자원에 접근할 수 있다. 컨테이터 응용의 성능 저하는 1% 정도라고 하니 호스트 OS에서 실행되는 응용이나 Docker 컨테이터에서 실행되는 응용이나 거의 동일한 퍼포먼스를 제공할 수 있다.

 

배포 측면

개발환경을 이미지로 만들어서 배포할 때 차이점은 어떨까?

 

VMware의 경우 이미지 안에는 게스트 OS와 사용자가 설치한 각종 라이브러리와 프로그램, 그리고 개발 소스코드 등이 존재하며 실제로 Gbyte 단위의 이미지가 생성되게 된다. 이 크기의 이미지를 배포하는 것 자체가 부담이다.

 

Docker의 경우는, 성능 부분에서 잠깐 언급했지만 별도의 게스트 OS의 설치가 필요 없다. 그러므로 이미지 안에는 사용자가 직접 추가한 라이브러리나 프로그램, 소스코드 등만 포함되므로 수십 Mbyte나 수백 Mbyte 정도 크기의 이미지로 생성된다. 이정도 크기면 쉽게 배포할 수 있는 크기라고 볼 수 있다.

 

실제로 Docker Hub를 이용해서 이미지를 쉽게 배포할 수 있다.

 

조금 더 추가 설명하면,

만약 개발 프로젝트에서 일(day) 단위로 개발환경을 이미지로 백업해서 형상관리한다고 가정해 보자.

 

VMware를 이용하면 매일 Gbyte 단위의 이미지가 생성될 텐데, 1Gbyte라고만 가정해도 한달에 30GByte의 저장소가 추가로 필요하게 되고, 향후 이 이미지들을 다른 저장소로 옮긴다고.... 답답함이 몰려온다. 그런데 그 수백 수천 Gbyte의 이미지 중 실제로 개발내용은 몇 프로나 될 까? 1%도 안될 것이다.

 

Docker의 경우는 굉장히 효율적이다.

매번 새롭게 이미지를 생성하는 방식이 아니라, Git에서 소스코드를 관리하듯 현재의 환경을 이미지로 커밋(commit)하는 방식으로 이미지를 관리한다. 이미지는 커밋 될 때마다 변경된 내용만 기존 이미지에 추가된다. 수백 수천번 커밋하더라도 이미지는 수십 Mbyte나 늘어날까? VMware와 비교하면 비교가 안될만큼 효율적으로 이미지 관리 및 배포가 가능하다.

 

이상 Docker에 대해 개발자의 관점에서 간략하게 정리해 봤다.

 

 

 

 

Comments