도커는 컨테이너 기반의 가상화 기상화 기술이다.
사실 위 문장만 보게 되면 도커를 이해하기가 쉽지 않다.
사실 도커를 알기 위해선 가상화와 컨테이너 등 여러 개념을 알아야 이해가 쉬워진다.
이 용어들을 알아가면서 도커가 나오게 된 흐름을 통해서 도커에 대해서 알아가 보자.
가상화를 이해하기 위해서 가상화가 어떻게 등장을 하게 되었는 지 배경을 예시로 알아보자.
만약 우리가 1000GB 용량의 서버 컴퓨터를 사용하고 있다.
이 서버에 우리가 만든 A 플랫폼을 올렸다. 이 A플랫폼은 200GB로 서버 용량의 반의 반도 사용을 하고 있지 않다.
서버 컴퓨터를 비효율적으로 사용하고 있다고 생각이 들어서 B플랫폼을 만들어서 올리려고 했다.
그런데 기존의 A플랫폼에서 사용하고 있는 기술과 B플랫폼에서 사용을 하고 있는 기술이 충돌이 일어났다.
A플랫폼을 유지하면 B플랫폼을 쓰지 못 하고 B플랫폼을 사용하면 A플랫폼을 쓰지 못 하는 것이다.
그러다가 서버의 성능을 나누어서 사용하면 어떨까? 하는 생각을 하게 된 것이다.
이것이 가상화가 등장하게 된 배경이다.

하나의 서버 자원을 나누어서 성능을 분산을 시키고 분산 서버들은 독립적으로 존재하며 다른 서비스들을 올릴 수 있게 되었다.
즉, 가상화란 하나의 물리적 서버를 논리적인 여러 개의 서버 운영체제를 독립적으로 실행할 수 있도록 해주는 기술이다.
이제 가상화 기술이 뭔지 알게 되었다.
그러면 이 가상화 기술에는 어떤 종류가 있는 지 알아보자.
도커 생기기 전부터 사용하던 방식이다.
가상 머신은 하이퍼바이저(Hypervisro)를 이용해서 가상화 기술을 사용을 했다.
이 하이퍼버이저를 통해서 논리적으로 분할된 공간에 가상 머신이라는 환경을 구축을 하고 게스트OS를 구동을 시킨다.
또한 OS마다 커널이 존재하는데 이 커널이 OS마다 다 다르다.
커널은 OS가 하드웨어의 리소스를 제어하기 위한 명령어를 말한다.
OS마다 명령어가 다르기 때문에 하드웨어가 이를 알아 듣지 못한다.
그래서 하이퍼바이저가 이 커널을 하드웨어가 알아들을 수 있도록 변환을 해서 전달을 하는 역할을 한다.
좀 더 이해가 되게 하기 위해서 예시를 들자면 나라마다 언어가 다르다.
그것처럼 OS에서 하드웨어에 있는 리소스들을 사용하기 위해서 하드웨어에 내리는 명령어도 다르다.
하이퍼바이저는 이 명령어를 해석해서 하드웨어가 알아 들을 수 있게 하는 것이다.
가상머신에서는 2가지 방식이 있는데 그 중 일반적으로 많이 사용이 되는 것이 호스트 가상화이다.

하드웨어 위에 기존 운영체제인 호스트OS가 있고 그 위에 하이퍼바이저를 설치한다.
그 하이퍼바이저 위에서 각각의 독립된 게스트OS가 돌아가는 방식이다.
하지만 이러한 가상머신은 OS위에 또 다른 OS를 올리는 방식이다.
OS는 매우 큰 용량을 가지기 때문에 무겁다.
그래서 리소스도 많이 잡아먹고 속도 또한 느리다.
이러한 단점을 보완하고자 나온 것이 컨테이너이다.

컨테이너는 애플리케이션을 실행하기 위해서 프로세스 단위로 독립된 환경을 제공하는 가상화 기술이다.
이 컨테이너에는 애플리케이션을 실행하기 위한 코드, 라이브러리 등을 패키지로 묶어서 관리를 해준다.
가상 머신처럼 게스트OS를 올리는 것이 아닌 호스트OS 위에서 직접 실행하기 때문에 휠씬 가볍고 빠르다.
그래서 호스트OS에 커널도 컨테이너들이 서로 공유를 한다.
그런데 여기서 호스트OS의 커널을 공유한다면 독립된 환경을 제공하는 것이 아닌 지 않는가 라는 의문이 들 수 있다.
호스트OS의 커널을 공유한다는 점에서 100% 완벽한 격리된 공간을 제공하는 것은 아니다.
하지만 네임스페이스와 Cgroups를 통해서 네트워크나 리스소 등 여러가지 측면에서 격리된 환경을 제공한다.
네임스페이스 : 시스템 자원의 격리를 통해서 컨테이너의 격리 환경제공
Cgroups: 시스템 자원을 관리하고 제한하는 역할
이를 통해서 컨테이너들은 서로를 알 수 없고 간섭없이 독립적으로 돌아간다.
이런 방법을 통해서 컨테이너가 독립적으로 돌아갈 수 있는 충분한 수준의 격리를 제공한다.
좀 더 쉽게 설명을 하기 위해서 식당을 예시로 들자.
밥을 먹기 위해서 식당에 왔다고 가정을 하자.
손님들은 각각에 테이블에서 본인이 먹고 싶은 것을 시켜서 각자 먹는다.
반찬은 셀프바에서 필요하면 먹는다.
그리고 식탁에는 각각의 휴지, 숟가락, 젓가락 등이 있다.
이를 컨테이너에 적용을 해보면
식당은 호스트OS가 된다.
그리고 식탁은 다른 손님과 영향이 없이 알아서 시키고 먹기 때문에 각각 각각의 독립된 컨테이너이다.
반찬 셀프바는 모든 손님에게 공유가 된다. 이는 호스트OS의 커널하고 같다.
그리고 식탁 위에 휴지, 숟가락, 젓가락은 각각의 식탁에 존재하며 다른 식탁의 영향을 받지 않는다.
이는 컨테이너 안에 리소스들 (라이브러리, 코드 등)이 될 수 있다.
지금까지의 컨테이너의 내용을 정리해보자
컨테이너는 호스트OS위에서 애플리케이션을 실행하기 위한 독립적인 환경을 제공을 한다.
이 때, 호스트OS위에서 직접 실행이 되기 때문에 커널이 공유가 된다.
그래서 완벽한 격리는 아니지만 네임스페이스, Cgroups를 통해서 각각의 컨테이너가 서로에게 영향을 주지 않고 실행될 수 있는 수준에 격리 횐경을 제공을 한다.
도커는 위에서 알아본 컨테이너 기반의 플랫폼이다.
컨테이너 환경에서 독립적으로 애플리케이션을 실행할 수 있도록 컨테이너를 관리하는 툴이다.
도커는 호스트OS 위에서 도커 엔진을 설치하고 우리가 쉽게 컨테이너를 생성 및 관리할 수 있도록 해서 가상화 기술을 사용할 수 있도고 해주는 툴이다.

도커의 구조를 간략하게 살펴보자
먼저, 하드웨어가 가장 아래의 있다.
하드웨어 위에는 호스트OS가 있고 그 위에 도커 엔진이 동작을 하고 있다.
이 도커엔진 위에 각 컨테이너들이 동작을 하고 있다.
다음 포스트에서 도커의 아키텍쳐에 대해서 알아보자
[10분 테크톡] 검프의 Docker 이론편
도커
[원리 공부] Docker란? 도커 동작 원리, 도커 개념