면접때 이 질문을 받았지만, 대답을 하지 못했다.
다음에는 답변할 수 있도록 공부해보자.
도커는 기존의 가상화 기술을 기반으로 만들어졌다. 기존의 가상화 기술을 알아보고 도커와 비교해 본다면 도커를 조금 더 이해해보자.
가상화 이전의 시대에서는 하나의 서버에 하나의 어플리케이션만 구동시켰다고 한다. 이렇다 보니 하나의 서버에 남는 자원이 많았다. 이런 비효율성을 극복하기 위해 등장한 기술이 가상화 기술이다. 그 중 하이퍼바이저 기반의 가상화가 가장 많이 이용되었다. 하이퍼바이저는 논리적으로 분할된 공간에서 VM 이라는 독립된 가상환경을 만들고 호스트 시스템에서 VM에 깔린 게스트OS를 구동 및 모니터링하는 역할을 한다.
VM : 분할 공간에서의 가상환경, Virtual Machine
호스트 시스템 : 서버의 OS
게스트 OS : VM 의 OS
하이퍼바이저 : 게스트OS를 구동 및 모니터링
🧐 커널이란?
하드웨어 자원을 관리하고 하드웨어와 프로세스 사이의 인터페이스 역할을 수행하는 OS의 핵심 구성 요소중 하나이다. 커널을 컴퓨팅 자원을 가상화하고 이를 프로세스에 할당한다.
커널은 강력한 경영진(하드웨어)을 위해 일하는 바쁜 비서입니다. 비서의 할 일은 직원 및 대중(사용자)으로부터 수신되는 메시지 및 요청(프로세스)을 경영진에게 전달하고, 어디에 무엇이 저장되어 있는지 기억(메모리)하고, 특정한 시간에 누가 경영진을 얼마 동안 만날 수 있는지 결정하는 것입니다.
이는 리눅스 커널의 Cgroup(control groups) 과 네임스페이스 기능을 이용해서 구현되어 있다. 위의 기능을 통해서 다른 프로세스 사이에 벽을 만든다. 도커 컨테이너는 커널을 공유하고 있고 커널에서 자원과 프로세스 결리가 이루어지므로 그림은 다음과 같아야 한다고 말한다.
위 그림은 틀렸다. 왜냐하면 도커 컨테이너들은 리눅스 커널을 사용한다. 만약 Host OS 가 macOS/Windows 라면 어떻게 컨테이너를 분리할 수 있을까? Docker Engine 은 또다른 하나의 VM 이다. VM은 Guest OS를 갖고 있다. Docker의 Guest OS가 바로 리눅스가 되고 이 위에 쌓이는 컨테이너에는 더이상 Guest OS가 깔리지 않으며 리눅스 커널의 기능으로 각 컨테이너들은 격리가 된다. 그래서 좀 더 정확한 그림을 가져와 본다면
위와 같은 그림이 가장 도커를 잘 설명한 그림이 아닐까. Docker 는 그 자체로는 VM 이기 때문에 하이퍼바이저를 포함하고 있고 실제 환경(PC)과 가상 환경(도커)의 관계에서는 Guest OS 이고 도커와 컨테이너의 관계에서는 Host OS 인 리눅스가 설치되어 있다. 해당 컨테이너에는 VM Host와는 달리 OS가 설치되어 있지 않다.
🧐 리눅스 네임스페이스란?
리눅스 네임스페이스는 프로세스를 실행할 때 시스템의 리소스를 분리해서 실행할 수 있도록 도와주는 기능이다. 한 시스템의 프로세스들은 기본적으로 시스템의 리소스들을 공유해서 실행된다. 이를 단일 네임스페이스라고 생각해볼 수 있다. 실제로 리눅스에서는 1번 프로세스(init)에 할당되어있는 네임스페이스들을 자식 프로세스들이 모두 공유해서 사용하는 구조로 이루어져있다.