The Matrix from Hell
이라고 합니다.)따라서 compatibliry 이슈에서 자유롭고 특정 컴포넌트를 변경할때 다른 컴포넌트를 변경하지 않는 그리고 OS 변경도 다소 쉬운 환경을 고민하기 시작했고 그것이 바로 Docker(도커)
입니다.
도커에서는 각각의 컴포넌트를 컨테이너로 분류하고 해당 컴포넌트에 필요한 dependency와 라이브러리를 컨테이너안에서 보유하고 실행할 수 있습니다.
컨테이너는 완전히 분리된 환경입니다. 컨테이너는 자신만의 프로세스, 네트워크, 가상 머신(mount)을 가질 수 있습니다. 다만 컨테이너끼리는 같은 OS Kernel를 공유합니다.
컨테이너는 새로 나온 개념이 아닌, 10여년 전부터, 존재해왔던 개념입니다. LXC, LXD, LXCFS 같은 여러 형태의 컨테이너들이 존재해왔고 도커는 그 중 LXC 컨테이너를 활용해 이러한 컨테이너 환경을 만들어냅니다. 컨테이너들을 직접활용해 개발 환경을 만드는 것은 굉장히 low level 작업이라 어렵기 때문에 도커가 여러가지 기능을 통해서 higher level의 도구를 제공한다고 볼 수 있습니다.
지금까지 도커에 대해서 얘기하면서 계속 나온 개념이 OS입니다. OS는 크게 2가지로 구분할 수 있는데 그것이 바로 OS kernel과 소프트웨어 셋 (set) 입니다. OS 커널은 하드웨어와 상호작용하며 소프트웨어를 관리합니다. 우분투, 페도라, 센토스 같은 운영체제들은 같은 OS kernel(리눅스)를 기반으로 그위에 올라가 있는 소프트웨어가 다른것입니다. 각각 소프트웨어들은 다른 유저 인터페이스, 드라이버, 컴파일러, 파일관리자, 개발도구 등을 가집니다. 따라서 이 각각은 같은 OS kernel을 사용하지만 그위에 다른 소프트웨어를 얹어 서로 다른 OS를 구성하게 된 것입니다.
따라서 리눅스 커널위에서 존재하는 컨테이너들은 각각 서로 다른 운영체제를 유지한채 동작할 수 있습니다. 단, 같은 OS 커널을 가지는 운영체제만이 가능하겠죠. 만일 다른 OS 커널, 예를 들어 윈도우 컨테이너의 경우에는 리눅스 커널위에서 도는 도커위에서는 동작하지 않게 될 것입니다.
다른 커널을 돌리지 못하기에 오는 불이익이 있는지 궁금할 수 있습니다. 하지만 도커는 애초에 목적이 그것에 있지 않습니다. 하이퍼바이저(hypervisor)와는 다르게 도커의 목적은 같은 하드웨어에서 서로 다른 OS 커널을 동작시키는데 있지 않습니다. 도커의 목적은 애플리케이션을 패키지화하고 컨테이너화해서 애플리케이션을 옮기고 어디에서든 우리가 원할 때 동작할 수 있게끔 하는데 있습니다. 여기서 가상머신과 컨테이너의 차이점이 나타납니다.
위에 설명만 듣고 의문이 생기신 분들이 계실겁니다. 어? 나 윈도우에서 리눅스 컨테이너 돌린적 있는데? 그 경우는 머지? 그 경우는 사실 윈도우 위에서 돌린 것이 아닌 리눅스 virtual machine위에서 도는 도커에서 리눅스 컨테이너를 돌린 것입니다.
앞서 설명했던 것처럼 가상머신은 하이퍼바이저(ex. EXS) 위에 각각의 OS 커널을 가진 가상머신을 설치하는 형태입니다. 각각의 가상머신은 자신만의 OS를 가지게 됩니다. 반면에, 도커는 같은 운영체제를 공유한 컨테이너를 위에 올린 형태입니다.
따라서 자원 사용에 있어서 오버헤드가 가상머신이 더 크게 됩니다. 그리고 가상머신은 OS를 포함하기에 크기면에서도 도커보다 더 크게됩니다. 도커가 더 가볍고 더 빠르고 오버헤드가 적게되는 것이죠.(보통 가상머신은 GB 단위이고 컨테이너는 MB 단위입니다.)
이미지는 VM template 같은 일종의 패키지 또는 template입니다. 컨테이너를 생성하는 템플릿이라 생각하면 됩니다. 컨테이너는 실제 돌아가는 인스턴스(Running Instance of Image) 입니다.