Docker 개요
Docker란?
Docker는 Linux 컨테이너 기술을 기반으로 Docker 사가 개발한 가상화 기술로써, Container RunTime 오픈소스이다. Docker를 사용하면 코드를 빠르고 정확하게 사용자에게 전달할 수 있다.
여기에서는 Docker 자체에 대해 간략하게 설명한다. 자세한 설명은 Docker 공식 문서를 참조하여라.
- Docker는 컨테이너 기반의 가상화 기술이다.
- 기존에는 OS를 가상화 하였기 때문에 Host OS 위에 Guest OS를 설치해야 했다. 이런한 방식은 상당히 무겁고 느려서 한계가 많이 있다.
- 그래서 이를 극복하고자 프로세스를 격리시킨 컨테이너를 통해 가상화를 하는 Docker(도커)와 같은 기술들이 등장하게 되었다.
- 도커를 통해 구동되는 컨테이너를 관리하기 위한 Kubernates(쿠버네티스)가 등장하게 되었다.
Docker의 특징
(1) 경량
첫번째 특징은 다운로드 및 실행이 매우 가볍다는 것이다.
VirtualBox 등 기존의 하이퍼 바이저 가상 머신(아래 왼쪽)는 호스트 OS에서 하이퍼 바이저라는 소프트웨어는 가상 머신을 생성하고 그 위에 게스트 OS를 가동시키는 방식이다. 호스트 OS와 게스트 OS를 분리 할 수 있다는 장점이 있지만, 게스트 OS와 가상 머신의 분, 이미지 크기가 커지고 오버 헤드가 증가한만큼 동작도 느려진다.
한편 Docker가 채택하고 있는 컨테이너(주 1)(아래 오른쪽)에서 각 응용 프로그램은 Linux 컨테이너 기술은 호스트 OS의 커널은 공유하면서도 각 컨테이너 응용 프로그램은 분리된 네임스페이스 중간에서 실행된다. 그림의 Docker Engine은 가상 머신과 커널의 에뮬레이션도 없기 때문에 이미지 크기도 작고, 베어 메탈(BareMetal)에 가까운 수준으로 가볍고 작동한다.
‘베어메탈(Bare Metal)’이란 용어는 원래 하드웨어 상에 어떤 소프트웨어도 설치되어 있지 않은 상태를 뜻한다. 즉, 베어메탈 서버는 가상화를 위한 하이퍼바이저 OS 없이 물리 서버를 그대로 제공하는 것을 말한다. 따라서 하드웨어에 대한 직접 제어 및 OS 설정까지 가능하다.
(주 1) 컨테이너는 Docker 이미지를 기동하고 그 내부에서 응용 프로그램이 실행중인 상태.
또한, 여러 이미지 데이터를 공통화하여 데이터 크기를 줄일 연구도 하고 있다. 구체적으로는, 컨테이너 자체의 여러 계층으로 구성되어 컨테이너 작업(패키지의 설치이거나 파일의 작성 등)은 각 레이어에서 이루어 진다. 이 계층 구조에 따라 이미지를 가져 오거나 가져올 때 레이어의 차이만 처리하면 잘된다. 따라서 다루는 이미지 데이터의 양이 줄어어 동작이 가볍다.
예를 들어, 아래 그림 중의 AppB과 AppC 컨테이너는 그림 오른쪽처럼 3개의 층으로 구성되어 있다. AppB과 AppC는 2층(Layer2)까지 공통의 조작으로 컨테이너가 생성되어 있기 때문에, 2층까지 일반화되어 있다. 따라서 먼저 AppB의 이미지를 올리고 나서, AppC의 이미지를 올릴 때는 3층(Layer3)만 올리며 된다. 이는 새로 올리는 이미지 데이터 양과 Docker Engine이 읽어들이는 데이터 량의 감소로 이어지게 된다.
(위 그림은 " Digital Ocean - The Docker Ecosystem : An Introduction to Common Components“에서 인용)
(2) 풍부한 에코 시스템 : 다양한 환경에 배포할 수 있다.
Docker은 원래는 Docker 사가 개발 한 가상화 기술이지만, 현재는 마이크로소프트와 인텔, 레드햇, Google, AWS 등 많은 업체들이 발족한 ‘Open Container Initiative’를 통해 업계 통일 사양으로 구성되어 있다. 많은 PaaS를 지원함으로써 표준 응용 프로그램 배포 방법으로 정착하고 있다.
주요 OS로 Linux, Windows, Mac 및 주요 PaaS 인 AWS , Google Cloud , Azure 가 Docker를 지원한다(주 3). 일단 한번 응용 프로그램을 Docker 컨테이너의 이미지로 만들면 그대로 다양한 플랫폼에서 실행할 수 있는 환경이 정비되어 왔다. 이렇게 되면 응용 프로그램 배포 수단으로 Docker 이미지를 활용하는 움직임이 활발 해 지고 있다. 플랫폼 별 환경 구축의 수고를 덜 수 있으며, 응용 프로그램 개발 자체에 좀 더 집중할 수 있게 된다.
(주 3) Windows, Mac의 경우는 호스트 OS에서 하이퍼 바이저 형의 가상 머신을 시작해 그 게스트 OS에 Docker Engine을 이동하는 구성으로 되어 있다. Linux가 아닌 경우 Docker 경량이라는 장점 완전히 누릴 수 없는 점에 주의하시기 바란다.
(3) 충실한 툴
API와 툴을 갖추고 있는 것도 Docker의 큰 장점이다. 실용적인 용도를 망라한 다음과 같은 다양한 툴들을 무료로 사용할 수 있다. 처음 접하면 여러가지 있어 어렵게 느끼질 수도 있지만, 하나씩 사용해 가면 익숙해져 가보록 하자.
- Docker Engine
- Docker 컨테이너 이미지를 실행 관리 서버 및 조작 CLI(Command Line Interface)를 포함한다. v1.12.0에서 클러스터 관리 기능도 통합되었다.
- Docker Compose
- 여러 컨테이너를 실행하고 관리하기위한 도구.
- Docker Registry
- 이미지를 저장하거나 배포할 수 있는 서버 소프트웨어.
또한, 이미지 관리용 서버인 Docker Registry는 이용 인원수가 늘어나면 분산 부하 및 데이터 백업 등을 고려할 필요해 진다. 그런 상황에서는 다음과 같은 옵션을 사용할 수 있다.
- Docker Hub
- Docker 사가 운영하는 PaaS 버전 Docker Registry. 무료로 사용할 수 있다.
- 오픈소스 소프트웨어(Open Source Software, OSS) 커뮤니티처럼 이미지를 게시 할 수 있는 프로젝트에 적합하다.
- Docker Trusted Registry
- 상용 지원용 On-premises software에 해당하는 Docker Registry.
- 사내 같은 닫힌 사회에서 Docker 이미지를 배포하는 경우에 좋다.
Virtual Machine와의 차이
Virtual Machine(VM, 가상화)와 상당히 유사한 기능을 가지면서, Virtual Machine보다 훨씬 가벼운 형태로 배포가 가능하다.
Docker와의 차이는 아래와 같다.
- Virtual Machine : 하나의 OS에 여러 개의 가상 OS를 두고, 그 위에 응용 프로그램을 동작시킨다.
- Docker : 하나의 OS에서 Docker engine을 시작하는 여러 컨테이너를 기동한다.
가상화와 관련하여 Docker의 이점은 다음과 같다.
- 경량 자원
- OS 사용하지 않기 때문에, OS 이미지와 커널분이 줄어들어, 프로세서 및 메모리의 소비가 적다.
- 스토리지 사용량 감소
- OS 이미지의 통상 사이즈는 10GB 정도인데 반해, Docker Image의 사이즈는 1~2GB 정도이다.
- 빠른 기동 시간
- 커널을 로드할 필요가 없다.
- 여러 환경에서의 운용이 편리함
- Docker가 기동되고 있으면 어느 환경에서도 사용할 수 있다.
Docker의 장단점
- 장점
- 쉽고 빠르게 실행 환경을 구축할 수 있다.
- 하드웨어 자원이 절감된다.
- Docker Hub와 같은 공유 환경을 제공한다.
- 단점
- 개발 초기의 오버헤드가 발생한다.
- Linux 친화적이다.
DevOps에서 활용
기존의 개발에서 운영 배포에 흐름은 아래와 같았다.
- 개발자가 코드를 작성 한다.
- 인프라 엔지니어라 프로덕션 환경 구축한다.
이러한 절차는 환경 기인에 의해, 개발/테스트 환경에서는 동작하지만, 운영 환경에서는 동작하지 않은 일이 생길 수 있다.
Docker는 개발 팀이 코드와 라이브러리를 패키징하여 인프라 엔지니어에게 전달할 수 있기 때문에 환경 차이가 발생하지 않는 이점이 있다.