먼저 도커를 공부하기 위해서 알아야 할 사전 지식이 있다. 바로 가상화 기술이다.
가상화 기술이란, 실재로 존재하는 컴퓨터는 아니지만 있는 것 처럼 만들어주는 기술이다. 즉, 한대의 컴퓨터(OS)로 여러대의 컴퓨터(OS)를 가진 것 같이 사용할 수 있는 기술이다.
하나의 OS에서 사용하면 되지, 왜 가상화 기술로 굳이 나눠서 해야하지? 라고 생각해보지 않았는가?!
우리가 윈도우에서 옛날에 가끔가다 "Explorer가 응답하지 않습니다" 를 마주했을 때, 닫기를 누르면 모든 창이 닫혔던 기억이 있을 것이다.
이처럼 하나의 OS에서 하나의 프로그램이 문제가 생기면, 다른 프로그램에도 영향을 줄 위험이 있으며, 하나의 프로그램이 사용량이 급증하여 리소스를 다 써버린다면 이 또한 나머지 프로그램이 작동하지 않을 수 있다.
이는 기업 입장에서 장애로 이어질 수 있는 위험한 상황이다.
이를 막기 위해 하나의 물리적인 환경이 아닌, 논리적인 OS 환경을 구성해주면 된다. 이는 총 용량은 증가하지만(논리적 OS마다 OS 환경을 차지하고 있기 때문에) 안전하게 프로그램들을 유지시킬 수 있다.
그렇다면, 여러대의 물리 서버를 두면 되지, 왜 귀찮고 위험하게 가상화 기술을 사용해? 라고 한다면, 하드웨어의 성능은 계속해서 증가 중이고, 소프트웨어의 요구사항은 감소중인데, 하나의 하드웨어에서 하나의 소프트웨어만 사용하기에는 비용적으로도 아깝고, 물리 서버의 설치 인력, 공간, 전력, 등등 갯수를 늘리는 것보다 한대의 기기에서 여러대의 OS를 수행해주는 것이 더 경제적이다!
기업에서 여러대의 서버를 운영할 때는 몇 가지 방식이 있는데, 1. 베어메탈 방식, 2. 하이퍼바이저 방식, 3. 컨테이너 방식이다.
베어메탈 방식은 우리가 컴퓨터를 하나 구매해서 사용하는 것 마냥 사용하는 방식이다.

즉 한개의 하드웨어에 가상화를 위한 하이퍼 바이저 OS 없이 물리서버를 그대로 적용하는 것이다.
하이퍼바이저는 컴퓨터에서 설치되는 프로그램이다. 하이퍼바이저는 OS의 프로그램을 실행해서 가상화 환경을 관리해줄 수 있다. 하이퍼바이저를 이용해 가상 OS를 만들고, 수행하고, 삭제할 수 있다.
또한 만들 때 지정해 놓은 CPU나 메모리만큼 컴퓨터의 격리된 공간을 가지고갈 수 있다.
내가 예전에 학교에서 실습으로 사용했던 버추얼 박스도 이 하이퍼바이저 기술을 사용한 것이다.
먼저, 실제 물리 서버(기기)에 설치되는 OS는 호스트 OS라고 한다. 이 호스트 OS에 하이퍼바이저를 설치하여, 새로운 OS를 실행하는데, 이 새로운 OS를 게스트 OS라고 하며, 이는 논리적인 공간이며 가상머신이라고 부른다.
간단하게 살펴보면, 프로세스는 정상적으로 실행되기 위해 CPU나 메모리 같은 리소스를 사용해야 한다. 그런데, 프로세스는 하드웨어를 사용하기 위해 반드시 OS를 통해서만 사용할 수 있다. OS는 하드웨어를 사용하기 위해 커널이라는 도구를 사용한다.
커널은 하드웨어에 이 사용요청을 전달해주는 인터페이스를 가지고 있다.
그런데, 호스트 OS에는 윈도우, 게스트 OS에는 맥이나 리눅스가 설치되어 있다면 어떻게 될까? 게스트 OS의 커널이 호스트 OS의 커널로 요청을 날리지만, 외국어에게 전달하듯 해석이 되지 않을 것이다. 그런데, 하이퍼바이저가 다른 커널간의 요청(이 기종 커널간의 요청)을 해석해서 전달해준다.

도커는 컨테이너 가상화의 대표적인 제품이다.
현대에는 하이퍼바이저보다 컨테이너 가상화가 더 선호되는데, 이는 더 가볍고 빠르다는 핵심 장점 때문이다.
같은 테스트 웹 서버를 띄울 때 하이퍼 바이저는 60초정도, 도커는 3초가 걸린다. 왜 빠르고 가벼운지 비교를 통해 알아보자.
컨테이너 가상화는 리눅스커널이 제공하는 LXC라는 자체 격리 기술에서 출발했다. 하이퍼바이저는 소프트웨어가 격리된 공간을 만들어주었지만, LXC는 커널의 자체 기능으로 격리된 공간을 만들 수 있다. LXC 기술은 커널의 네임스페이스와 Cgroups라는 기능을 활용하는데
네임스페이스는 프로세스와 하드드라이브, 네트워크, 사용자, 호스트 네임 처럼 리소스를 나누는 기준의 역할,
Cgroups는 프로세스가 사용하는 메모리, CPU, 하드디스크, 네트워크 밴드위스 등 리소스 사용량 배분의 역할을 한다.
이러한 기술(LXC)를 사용해 만든 각각의 격리된 공간을 컨테이너라고 한다. 앞의 설명한 내용이 중요하다는 것이 아니다! 분리된 공간을 다른 소프트웨어로 만든게 아닌, 커널 자체 기술을 활용한 가상화라는 점이 중요하다.
이처럼 컨테이너 가상화 기술은 커널의 격리 기능을 활용하기 때문에, 모든 컨테이너는 Host OS의 커널을 공유한다. (아주 중요)
이전에 봤듯 하이퍼바이저는 호스트 OS와 게스트 OS의 커널이 독립적으로 존재했다. 그리고 하이퍼바이저가 중간에서 통역을 해주어 단계가 늘어났다(오버헤드가 크다). 아래 사진은 각각 커널이 존재하는 하이퍼바이저 사진이다.
그렇지만, 컨테이너 방식은 통역해주는 레이어가 없이 호스트 OS를 그대로 사용하기 때문에 오버헤드가 적고, 하드웨어 리소스 요청이 좀 더 효율적으로 이루어진다고 볼 수 있다.
또한, 새로운 OS를 추가할 때, 컨테이너 방식은 호스트 OS의 커널을 공유하기 때문에 커널을 실행하는 시간 자체가 없다. 하이퍼바이저 방식은 커널을 실행하는 시간이 존재한다. 그래서, 빠른 부팅 또한 컨테이너 방식의 장점이다.
즉, 컨테이너 가상화 방식이 오버헤드가 적고 부팅 시간이 빠르다.
커널이 자체적으로 제공하는 가상화 기술은 사용자가 사용하기엔 "어렵다". 이를 해결하기 위해 도커가 탄생했다. 커널의 컨테이너 가상화 기술을 편리하게 사용하도록 도와준다.
도커와 같은 컨테이너 가상화 도구를 컨테이너 플랫폼이라고 부른다. 이는 자체적으로 가지고 있는 컨테이너 엔진과 컨테이너 런타임을 가지고 있다. 컨테이너 엔진은 사용자의 요청을 받아 컨테이너를 관리해주는 역할을 하고, 컨테이너 런타임은 커널과 통신하며 실제로 격리된 공간을 만드는 역할을 한다. 도커는 RUNC라는 컨테이너 런타임을 사용한다.
도커는 클라이언트 서버 모델로 실행된다. 서버와 클라이언트 관계 처럼, 사용자의 명령어를 전달해주는 클라이언트와, 실제로 컨테이너를 관리해주는 도커 데몬이라는 서버가 존재한다.

클라이언트는 사용자의 명령을 도커 데몬에게 전달한다. 도커 데몬은 컨테이너를 관리하고, 도커 D라고도 한다. 이 도커 데몬은 클라이언트가 컨테이너를 관리할 수 있도록 API를 제공한다. API는 상호간의 약속을 뜻한다.
https://docs.docker.com/engine/api/v1.41/#tag/Container 도커 공식 API 문서도 있다.
그러나 우리는 API를 매번 찾아보고 보내고할 수는 없으니 Docker CLI를 제공해준다. 이를 통해 명령어를 입력하면, 서버의 API 양식에 맞게 만들어 전달한다.
가상화 기술과 도커에 대해서 알아봤다.
아래 출처 강의에 영상과 더 많은 강의 자료가 있으니 관심이 있다면 보면 좋을 듯 하다.
실습도 있다~
출처 : https://inf.run/Apgvc
https://docs.docker.com/engine/api/v1.41/#tag/Container