1. 도커의 시작
Last updated
Last updated
도커(Docker)
는 컨테이너형 가상화 기술을 구현하기 위한 상주 어플리케이션
과 이 어플리케이션을 조작하기 위한 명령행 도구(Docker CLI)
로 구성되어 있습니다.
도커를 사용하는것은 어플리케이션 배포를 굉장히 쉽게 할 수 있기 때문에 어플리케이션 개발 및 운영을 컨테이너 중심으로 할 수 있습니다.
위의 그림은 가상머신과 도커(Container 기반) 의 차이를 나타내는 그림입니다. VMware 혹은 Virtualbox 등의 가상머신은 실제로 호스트 OS 위에 각각의 게스트 OS가 존재하는 OS 가상화 방식을 사용합니다. 사용법이 간단하지만 무겁고 느려서 이를 이용해 서비스를 운영하기에는 오버헤드가 큽니다. 이러한 상황을 개선하기위해서 CPU에 적용된 HVM가상화라는 기술을 적용하여 KVM(Kernel-based Virtual Machine)과 반가상화(Paravirtualization) 기술이 도입되었습니다. 이기술들이 적용된 가상화 방법 역시 게스트 OS가 필요했지만 전체적인 가상화가 아니었기 때문에 성능적으로 개선이 생겼습니다.
그럼에도 불구하고 성능적인 문제가 존재했기 때문에 OS가 아닌 프로세스를 격리하는 방법이 생겼고, 이를 기반으로 컨테이너라는 개념이 생겼습니다. 이러한 컨테이너라는 개념으로 생성된 도커는 하나의 호스트 위에 각각의 컨테이너로 관리가 가능하여 성능적인 층면에서 더 가볍고 오버헤드가 VM에 비해 적습니다. 마치 가벼운 가상머신(생성시간이 1초정도)을 사용하는 느낌을 줄 수 있습니다.
또한 컨테이너는 어떠한 프로그램이라도 포장할 수있으며 간단하게 변경만으로 배포가 가능하기 때문에 현재 수많은 회사에서 사용되곤 합니다.
하지만 컨테이너는 깊이있는 운영체제의 동작을 완전히 재연하지는 못하기 때문에 깊이있는 리눅스계열 운영체제의 동작이 요구되는 가상환경이 구축되어야 한다면 VMware 등의 가상화 소프트웨어를 사용하는 것이 더 좋습니다.
사실 도커 버전 1.11 이전 버전에서는 리눅스 컨테이너 방식인 LXC(LinuX Container)라는 방식을 사용해 왔다. 하지만 현재는 runC 라고 불리는 방식으로 변경되었습니다.
둘 다 호스트 OS 위에서 각각의 컨테이너로 나누어 관리하는 부분은 동일하지만 몇가지 차이점이 존재했습니다.
LXC는 커널단에서 컨테이너를 생성하는 반면 runC방식은 커널위, 어플리케이션 단에서 컨테이너를 생성합니다.
LXC는 호스트 운영체제 가상화 보다는 성능면에서 유리하다는 장점을 가지고 있지만 복제한 어플리케이션을 다른 LXC 호스트에서 실행 했을 때 LXC 설정의 차이로 어플리케이션이 동작하지 않는 등 문제가 발생했습니다. 하지만 도커의 컨테이너 방식인 runC는 이러한 차이로 호스트 운영체제의 영향을 받지 않는 실행환경을 갖출수 있었습니다. LXC와의 차별점 runC가 갖는 장점은 다음과 같습니다.
호스트 운영체제의 영향을 받지 않는 실행환경(Docker Engine을 이용한 실행환경의 표준화)
DSL(Dockerfile)을 이용한 컨테이너 구성 및 어플리케이션 배포 정의
이미지 버전 관리
레이어 구조를 같은 이미지 포맷(차분빌드 가능)
도커 레지스트리(이미지 저장 서버 역할을 함)
다양한 API 지원