도커(Docker)란 무엇인가? 컨테이너와 가상 머신의 차이점
서버 관리의 어려움
서버를 관리하는 일은 매우 복잡하고 어려운 작업이다. 만약 서버를 개발할 때 개발 환경이 바뀌게 된다면 컴퓨터 세팅이나 프로그램 등을 처음부터 다시 설정해야 한다. 시스템 환경, 방화벽, 네트워크 설정, Dependency, 각종 개발 프로그램 설정 등... 이러한 방식은 매우 번거롭다는 문제점이 발생한다.
특히 DevOps나 MSA가 유행하면서 Micro Service들이 잘게 나뉘면서 관리가 더욱 복잡해지게 되었다. 게다가 새로운 툴은 끊임없이 나오고, 클라우드의 발전으로 설치해야 할 서버가 매우 많아지는 상황에서 서버 관리 방식의 변화가 필요했다.
이러한 상황 속 어려움을 해결해줄 도커(Docker)가 등장하게 되었다.
도커(Docker)란 무엇인가?
도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 화물선에 담긴 컨테이너를 떠올리면, 딱 맞는 규격에 여러 화물을 실어 쉽게 운송할 수 있다는 사실을 알 수 있다.
도커 또한 비슷한 개념이다. 다양한 프로그램들과 실행환경을 컨테이너로 규격화시켜 프로그램의 배포 및 관리를 단순화할 수 있다. 프로그램의 코드뿐만 아니라 실행에 필요한 모든 dependency들도 컨테이너에 담기 때문에 다른 환경에서도 빠르게 애플리케이션을 실행할 수 있다. 또한 어떠한 프로그램이라도 컨테이너로 규격화할 수 있기 때문에 편리하다.
개발/실행 환경이 달라도 컨테이너로 규격화한 프로그램들이 정상적으로 작동할 수 있는 이유가 무엇일까? 그것은 바로 도커 컨테이너들이 (정확히는 도커 이미지들) 도커 엔진(Docker Engine) 위에서 실행되기 때문이다. 이 덕분에 도커가 설치되어 있는 곳이라면 실행환경에 상관없이 모든 환경에서 동일하게 작동할 수 있다.
이것은 마치 기존의 가상머신(Virtual Machine)과 비슷해 보인다. 하지만 둘은 다음과 같이 차이점이 존재한다.
도커와 같은 컨테이너 기술은 App layer에서의 추상화이다. 즉, 여러 컨테이너들이 똑같은 하나의 머신 위에서 OS 커널을 공유한다. 물론 user space에서 독립적인 프로세스로서 존재한다. 이렇게 하나의 머신 위에서 OS 커널을 공유하기 때문에 보통 수십~수백 MB의 작은 크기를 차지한다. 이는 마치 가벼운 가상 머신을 사용하는 것과 같은 느낌을 주게 된다.
하지만 가상머신은 하나의 머신 혹은 하드웨어를 여러 개의 OS로 나누어 점유하게 된다. 하나의 머신 위에서 동작하지만, 사실상 다른 머신인 것처럼 각자 OS, 애플리케이션, 라이브러리들을 가지고 있기 때문에 하나당 수 GB를 차지하게 된다. 또한, 부팅하는데 오랜 시간이 걸린다는 단점도 존재한다.
따라서 성능상에 있어 컨테이너가 좀 더 유리하다.
도커 이미지 (Docker Image)
도커에서 서비스 운영에 필요한 서버 프로그램, 코드 및 라이브러리, 컴파일된 실행 파일 등을 묶는 형태를 도커 이미지라고 한다. 즉, 컨테이너 생성(실행)에 필요한 모든 파일과 환경을 가진 것으로, 더 이상 Dependency 파일을 컴파일하거나 이것저것 설치할 필요가 없는 상태의 파일을 뜻한다.
예를 들어 우분투(Ubuntu) 이미지는 우분투를 실행하기 위한 모든 파일과 dependency들을 포함한다. 이러한 도커 이미지는 컨테이너의 상태가 바뀌거나 삭제되더라도 변하지 않는다. 따라서 다른 환경 혹은 서버에서 미리 만들어 놓은 도커 이미지를 다운로드하고 컨테이너를 생성하면 쉽게 원하는 환경을 구축할 수 있다.
이러한 도커 이미지를 실행(run)하면 도커 컨테이너가 된다고 볼 수 있다. 도커 이미지는 도커 파일(Docker file)이라는 파일로 만들어지는데, 이러한 도커 파일에는 소스코드와 함께 의존성 패키지 등 사용한 설정 파일을 관리하기 쉽도록 명시된다.
도커 레이어(Docker Layer)
도커 이미지는 레이어(Layer)라는 개념을 사용한다. 즉, 여러 개의 레이어를 나누어 이미지를 구성하게 된다. 예를 들어 apache 이미지를 만든다고 하면, 기존의 Ubuntu 이미지를 base Image로 이용하고, 그 위에 필요한 다른 레이어들을 얹어서 만들 수 있다.
이렇게 레이어 방식을 사용하면 기존의 이미지 레이어를 이용해 다양한 이미지를 새로 만들 수 있다. 또한, 기존 이미지를 이용하기 때문에 용량을 절약할 수 있다.
컨테이너를 생성할 때도 레이어 방식을 이용해 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성하더라도 최소한의 용량만 사용하게 된다.
도커 허브(Docker Hub)
도커는 도커 허브(Docker Hub)를 통해 수많은 공개 이미지를 무료로 관리해준다. 공개된 도커 이미지는 50만 개가 넘고 Docker Hub의 이미지 다운로드 수는 80억 회를 넘었다고 한다. 이처럼 누구나 쉽게 도커 이미지를 만들고 배포할 수 있다.
호스트들은 도커 허브에서 도커 이미지를 Pull 해와서 실행시킬 수 있다. 용량이 매우 큰 이미지들도 도커 허브에서 관리해주기 때문에 사용자는 부담 없이 도커 이미지를 사용할 수 있다.
정리하자면
도커를 사용하면 많은 이점이 있다. 가상머신 처럼 다른 프로세스와 격리되어 사용할 수 있지만, 성능 저하가 거의 없다. 환경에 구애받지 않고 실행할 수 있으며 배포도 간단하다. 이러한 방식은 최근 MSA 방식과 잘 어울린다고 할 수 있다.
오픈 소스이기 때문에 특정 회사에 종속되지 않는다는 점도 장점이다. 복잡한 기술을 몰라도 사용할 수 있으며, 레이어를 이용할 수 있다.
그리고 무엇보다도, 도커의 아이콘인 푸른 고래가 너무 귀엽다는 장점이 있는 것 같다.
참고
1.https://ko.wikipedia.org/wiki/%EB%8F%84%EC%BB%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)
2. https://www.techtarget.com/searchitoperations/definition/Docker
3. https://www.docker.com/resources/what-container/
4. https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
5. https://docs.docker.com/get-started/overview/
6. https://www.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?seq=30533