Docker는 가상화 도구입니다. 몇 년 전부터 Docker가 엄청 떠오르기 시작했는데요. 이 이유와 실제 도커는 어떤 것인지 간단한게 알아보도록 하겠습니다. 그 전에 가상화에 대해 먼저 이야기 해보겠습니다.
가상화는 서버, 스토리지, 네트워크 및 기타 물리적 시스템에 대한 가상 표현을 생성하는 데 사용할 수 있는 기술입니다. 가상 소프트웨어는 물리적 하드웨어 기능을 모방하여 하나의 물리적 머신에서 여러 가상 시스템을 동시에 실행합니다. 기업은 가상화를 사용해 하드웨어 리소스를 효율적으로 사용하여 투자 대비 이익을 더 많이 얻을 수 있습니다. 또한 클라우드 컴퓨팅 서비스를 지원하여 조직의 인프라를 더욱 효율적으로 관리할 수 있습니다.
하나의 물리적 시스템에 대해서 여러 가상 시스템을 실행하는 것입니다. 간단히 이야기 하자면, 하나의 컴퓨터에서 여러 개의 운영체제를 두고 각각 독립적으로 사용하는 것과 같습니다.
가상머신은 HyperVisor라는 소프트웨어를 통해 GeustOS를 작동시키고, 별도의 VM을 사용하는 가상화 방식의 한가지 입니다. 도커와 가장 대비되는 개념인데 VMWare, VirtualBox 같은 툴을 이용해 리눅스를 맥이나 윈도우에서 실행하는 것이 가상머신의 개념을 사용한 것이라고 할 수 있습니다. 가상머신은 사진처럼 GuestOS를 가집니다. 이미 있는 OS위에 여러 개의 OS를 실행하는 것이기 때문에 컨테이너에 비해 꽤 무거운 시스템입니다.
컨테이너도 가상머신과 유사한 가상화 기술입니다. 대신 컨테이너는 GuestOS가 필요하지 않습니다. 하나의 HostOS위에 Docker를 설치하여 각각의 애플리케이션 환경들을 설치 및 운영하는 형태입니다. 더하여 Docker가 설치된 환경이라면, 필요한 패키지들이 말려있는 이미지 파일을 실행하여 어디서든 사용 가능하다는 장점이 있습니다. 즉, 컨테이너란 프로세스 단위의 분리된 환경 안의 가상공간이라고 할 수 있습니다.

| 항목 | 가상머신 | 컨테이너 |
|---|---|---|
| 하이퍼바이저 | 필요함 | 필요 없음 |
| 게스트OS | 필요함 | 필요 없음 |
| 커널 자원 분리 | 필요함 | 필요 없음 |
| 자원 효율성 | 낮음 | 높음 |
| 시작 및 종료 시간 | 느림 | 빠름 |
AWS: Docker 이미지는 컨테이너를 정의하는 읽기 전용 템플릿입니다.
이 이미지에는 코드에 필요한 라이브러리 및 종속성에 대한 정의를 비롯해 실행되는 코드가 포함되어 있습니다. 이 이미지가 읽기 전용이기 때문에 스냅샷이라고도 하며, 특정 시점의 애플리케이션과 가상 환경을 나타냅니다.
컨테이너 환경을 실행할 때는 기본적으로 내부에 해당 파일 시스템의 읽기-쓰기 복사본을 만듭니다. 그리고 Base이미지 위에 해당 layer를 추가하는 방식으로 컨테이너를 만들고 이 layer의 이미지 복사본을 수정할 수 있게 됩니다. 결국 원본 이미지는 변하는 것이 아니고, 그것을 읽어서 만든 컨테이너를 변경할 수 있는 것입니다.
이미지는 컨테이너를 만드는 기초토대라고 할 수 있습니다.
컨테이너는 항상 이미지가 있어야 만들어질 수 있고, 컨테이너는 위에서 이야기한 것처럼 이미지의 복사본 레이어를 만들어 컨테이너 내에서 쓰기를 할 수 있습니다.
따라서 실제로 컨테이너는 실행중인 이미지 인스턴스로 간주할 수 있으며, 컨테이너가 구동된다는 것은 우리가 필요로 하는 os와 특정 환경이 경량 가상화로 구현된다는 것을 의미합니다.
그래서 종종 이력서에 자신의 프로젝트를 도커 이미지로 말아서 깃헙에 공유하여 이력서를 보는 사측에서 확인하는 용도로 사용되기도 합니다.
간단하게 쓸 수 있을 줄 알았는데 사실 알고보니 제가 잘못 알고 있던 개념도 더러 있어 조금 난감했습니다. 다음엔 실제 이미지를 만들어 배포하고 컨테이너를 가동시키는 등의 일련의 작업을 기록으로 남겨 공유하도록 하겠습니다. 감사합니다 :)