Docker란 Go언어로 작성된 리눅스 컨테이너 기반으로하는 오픈소스 가상화 플랫폼이다.
개발자는 Docker를 통하여 애플리케이션을 신속하게 구축, 테스트, 배포할수 있게 된다.
가상화는 하나의 물리적 자원을 논리적으로 여러 개처럼 나누어 사용하는 기술이다.
쉽게 말해, 하나의 컴퓨터에서 여러 컴퓨터가 있는 것처럼 운영하는 방식이다.
가상화가 처음 등장했던 1960~70년대 상황을 살펴보면, 무어의 법칙에 의해 하드웨어의 성능은 빠르게 증가하는 가운데, 그 당시 소프트웨어의 발전 속도는 하드웨어의 발전 속도를 따라가지 못했다.

위의 타임라인을 보면 소프트웨어는 1990년대 이후 급격히 발전한 것을 볼 수 있고, 소프트웨어가 요구하는 서버 사양에 비해 소프트웨어를 실행 중인 서버의 성능이 훨씬 좋다 보니, 서버의 성능을 10% 수준밖에 활용하지 못하는 엄청난 비효율이 발생했다.
이러한 비효율을 해결하기 위하여 고안된 것이 바로 가상화개념이다.
한 대의 서버를 마치 여러 대의 서버처럼 사용할 수 있다면? 즉, 한 대의 서버 위에 동시에 여러 개의 OS를 설치하고 여러 애플리케이션을 실행시킬 수 있다면, 자원 비효율 문제를 해결할 수 있었고 실제로 가상화 적용 이후 5~15%에 그치던 자원 사용률은 60~80% 수준까지 향상되었다고 한다.
대표적인 가상화 플랫폼으로는 VMware, virtualbox 등이 있다.
크게 두가지를 볼 수 있다.
- 하드웨어가상화(VM) : 물리적 하드웨어 위에 하이퍼바이저(Hypervisor)를 올려 여러 OS 실행
- OS수준 가상화(컨테이너) : 하나의 OS 커널을 공유하며, 프로세스/파일 시스템을 격리

커널이란 하드웨어를 제어하기 위한 명령어이다.
여기서 주목할건 "OS마다 명령어를 해석하는 규칙이 다름"
ex) 인사 = hello, Hello, HELLO
ex) 덧셈 = add(맥), ADD(레드햇), Add(윈도우)
나라마다 언어가 다르듯 어떠한 연산을 하려 할 때 위에 예시들처럼 같은 의미이지만 말하는 바가 다르기 때문에 처리할 명령을 이해할 수 없다.
그러면, 어떻게 이러한 명령어들을 이해해서 각각 OS를 구동하게 할 수 있을까?
OS의 커널을 수정해야한다 (= OS의 소스를 까서 수정을 해야한다는 뜻 = Guest OS를 수정해야한다는 뜻)
하이퍼바이저
하이퍼바이저가 각 OS마다 말하는 명령을 하드웨어가 이해할 수 있게 하나의 명령어로 번역해준다.
운영 체제 커널을 공유하며, 경량 프로세스 격리를 제공
컨테이너는 해운업계 솔루션이였다.
화물을 어떻게 하면 효율적으로 옮길까 라고 생각해봤을 때, 표준화된 컨테이너 박스를 만들고 무엇을 넣어도 표준화된 운송선만 있다면 똑같이 세워서 효율적으로 운송할 수 있는 것이 '컨테이너'다.
이러한 컨셉을 IT에 적용한것이 바로 '컨테이너'
소프트웨어 코드, 애플리케이션 코드가 작동하기 위해 필요한 컴포넌트와 함께 표준화된 방식으로 패키징해서 컨테이너 엔진만 있으면 돌아갈 수 있도록 하는 구조를 '컨테이너'라고 정의한다.
가장 큰 차이점은 Guest OS의 유무이다.
VM에서는 Guest Os가 설치되어 독립되는 실행환경인 반면
컨테이너에서는 Host OS의 커널을 공유하게 된다.
컨테이너에서는 Host Os위에 어플리케이션의 실행 패키지인 이미지를 배포만 하면 되는데
VM은 하나의 어플리케이션을 실행하기 위해 VM을 띄우고 자원을 할당하고 Guest OS를 부팅한 뒤에야 비로서 애플리케이션을 실행하게 되는 것이다.
Docker는 컨테이너 엔진이다. 즉, 컨테이너를 생성하고 실행하고 관리하는 소프트웨어 중 하나이다.
다음 글에서는 도커의 기초적인 사용법과 개념들을 알아보겠다.