Docker, VirtualBox 둘 다 가상화 관련 프로그램이다.
그리고 두 프로그램에 해당하는 ubuntu 이미지가 각각 존재한다.
그런데 얼핏 듣기로는 Docker는 가상머신과 다르게 컴퓨터 자체를 가상화하는 개념은 아니라고 들었는데, 운영체제인 ubuntu 이미지는 왜 있는걸까?
그리고, 애초에 운영체제 이미지 파일이 존재한다면, VirtualBox와는 차이점이 없는 것이 아닐까?
과연 두 ubuntu 이미지의 차이점은 무엇일까?
이에 대해서 한번 알아보자.
가상화 기술이란, 하드웨어에 종속된 리소스를 추상화하여 논리적 리소스를 제공하는 기술로, 이를 이용하여 물리적 머신의 기능을 여러 사용자나 환경에 배포해 물리적 머신을 최대한 활용할 수 있다.
쉽게 말하자면 컴퓨터 본체를 가상의 여러 컴퓨터로 나누어서 사용할 수 있도록 해 주는 기술이 가상화 기술이다.
이 가상화 기술로 인해, 물리적 서버를 보다 효율적으로 사용할 수 있고, 요구사항에 따라서 손쉽게 리소스를 변경할 수 있게 되었다.
여기서 가상머신과 컨테이너 모두 가상화 기술에 해당한다.
가상 머신과 컨테이가 구분되는 점은 어디까지 가상화를 하였나 이다.

가상 머신은 하이퍼바이저(HyperVisor)를 이용하여 하드웨어 자원을 가상화하는 것이 특징이다.
과거 가상화 기술에는 하드웨어를 모두 가상화하는 전가상화(Full Virtualization) 방식을 이용하였는데, 이는 속도가 매우 느리다는 단점이 있었다.
따라서 이 단점을 완화하기 위해서, 하이퍼바이저(HyperVisor)라는 운영체제(OS)보다도 하드웨어에 더 가까운 영역의 레이어를 이용하여 물리적 리소스를 가상 머신으로부터 분리하게 된다.
이를 통해 가상 머신에서는 일부 하드웨어만 가상화하는 반가상화(Partial Virtualization) 방식을 이용하게 되고, 결과적으로 과거에 비해서 빠른 속도의 가상머신을 사용할 수 있게 되었다.
따라서 각 가상 머신의 게스트 운영체제 (Guest OS) 들은 호스트의 Hypervisor 레이어 위에서 실행되고, HyperVisor가 하드웨어와 게스트 운영체제 사이의 상호작용을 관리하게 된다.
가상 머신의 대표적인 예시로는 Hyper-V, KVM, VMware, VirtualBox 등이 있다.

비록 반가상화를 통한 개선이 있었지만, 가상머신은 여전히 속도가 느리고, 운영체제가 필요하기 때문에 필연적으로 이미지 파일이 무거운 단점이 존재한다.
만약, 여기서 운영체제를 제외하면 위의 단점이 해결되지 않을까?
이러한 가상화 방법이 바로 컨테이너이다.
컨테이너는 리눅스의 LXC(LinuX Container)를 기반으로 가상화하게 되는데, 이는 컴퓨터를 통째로 가상화하는 방법이 아닌 리눅스 커널 레벨에서 제공하는 일종의 격리된 가상 공간이다.
즉, 운영체제(정확히는 OS의 커널)은 호스트의 것을 그대로 사용하면서, 프로세스 레벨에서 가상 환경이 구성된다고 볼 수 있다.
따라서 컨테이너는 하드웨어의 가상화가 존재하지 않기 때문에 속도가 가상머신에 비해 훨씬 빠르고, 운영체제 역시 필요없기 때문에 필요한 메모리 요구량과 이미지의 크기를 크게 줄일 수 있다.
이러한 특징으로 인해 컨테이너의 등장 이후, 낮은 용량으로 공유가 용이해진 결과 특정 환경을 손쉽게 이미지로 만들어서 배포하고 받아서 사용하는 것이 가능하게 되었다.
컨테이너 프로그램의 대표적인 예시로는 Docker가 있다.
위에서 살펴본 것과 같이, 가상머신과 컨테이너의 가장 큰 차이 중 하나는 운영체제를 가상화하느냐이다.
이 차이가 이미지에서 어떻게 나타나는지를 알기 위해서 OS(Linux)의 구조를 매우 간단하게 살펴보자.

리눅스는 크게 Kernel Space와 User Space(User Land)로 나뉜다.
커널은 하드웨어와 프로세스를 이으면서 메모리와 프로세스를 관리하고, 하드웨어의 드라이버를 관리하며 시스템을 통제하는 역할을 한다.
유저랜드는 사용자 영역에서 실행되는 실행 파일과 라이브러리를 의미한다.
리눅스의 유저랜드의 경우 부팅에 필요한 실행 파일과 라이브러리, 패키징 시스템 또한 포함한다.
이 구조를 살펴보면, 결국 Docker에서의 Ubuntu 이미지는 VirtualBox와는 다르게 운영체제 전체가 아닌 Ubuntu의 유저랜드에 해당하는 파일들만 포함하고 있다는 것을 알 수 있다.
가상 머신은 HyperVisor를 기반으로 하드웨어의 일부를 가상화하며, 운영체제 전체를 가상화한다.
컨테이너는 리눅스의 LCX를 기반으로 운영체제 커널은 호스트의 것을 공유하고 프로세스만을 가상화한다.
따라서, 컨테이너는 가상 머신에 비해 빠른 속도와 적은 메모리 사용량, 그리고 작은 이미지 크기를 가진다.
결국 Docker의 Ubuntu 이미지 역시 리눅스 커널을 제외한 Ubuntu의 유저랜드의 파일만 포함하고 있다