Docker 소개

Park Choong Ho·2021년 5월 17일
0

Docker

목록 보기
1/4

Docker Introduction

Why do you need docker?

  1. NodeJS, MongoDB등 여러가지 서비스들을 조합해서 사용자가 사용하는 서비스를 만들어냅니다. 여기서 이러한 서비스들이 기초하는 OS와의 상호호완성이 중요한 이슈로 자리잡습니다. 우리는 이러한 여러 서비스들이 우리가 사용하는 OS와 호환됨을 보장해야합니다.
  2. 각 서비스들에는 해당 서비스를 돌리는데 필요한 OS상의 여러 라이브러리와 dependncy들이 존재합니다. 여기서 문제가 발생하는데, 어떤 서비스는 특정 라이브러리에 특정 버전을 사용해야하는 반면 다른 서비스는 그 라이브러리의 다른 버전을 필요로 하는 경우가 존재합니다. 또한 이러한 의존성 충돌은 시간에 지남에 따라 시시각각 변화합니다. 이런 변화에 맞춰서 모든 서비스들이 OS에 맞게끔 하나하나 모두 확인하는 것은 여간 성가신일이 아니게 됩니다. (이러한 문제점(compatibility metrics)를 크게 The Matrix from Hell이라고 합니다.)
  3. 회사에서 새로운 개발자를 뽑았다고 가정해봅시다. 그렇다면 이 개발자를 위한 환경을 셋팅해야하는데 이것이 여간 어려운 일이 아닙니다. 만약 남아있는 컴퓨터 OS가 기존 프로젝트가 의존하고 있는 OS가 아니라면? 개발 환경을 세팅하는 데만 한세월이 걸리게 될것입니다.
  4. 개발에는 여러 환경들이 존재합니다. 크게는 개발 / 테스트 / 배포 환경을 생각해 볼수 있는데요. 각각 환경이 항상 같을 수 없고 여러경우에서 달라집니다. 특히 누군가는 리눅스에서 작업을 할 수도 있고 다른 팀원은 mac에서 작업을 할 수 있습니다. 이렇게 개발 환경에서는 각자 개발이 가능했지만 배포환경에서는 작성한 프로그램이 동작하지 않을 가능성이 농후합니다.

따라서 compatibliry 이슈에서 자유롭고 특정 컴포넌트를 변경할때 다른 컴포넌트를 변경하지 않는 그리고 OS 변경도 다소 쉬운 환경을 고민하기 시작했고 그것이 바로 Docker(도커)입니다.

도커에서는 각각의 컴포넌트를 컨테이너로 분류하고 해당 컴포넌트에 필요한 dependency와 라이브러리를 컨테이너안에서 보유하고 실행할 수 있습니다.

What are containers?

컨테이너는 완전히 분리된 환경입니다. 컨테이너는 자신만의 프로세스, 네트워크, 가상 머신(mount)을 가질 수 있습니다. 다만 컨테이너끼리는 같은 OS Kernel를 공유합니다.

컨테이너는 새로 나온 개념이 아닌, 10여년 전부터, 존재해왔던 개념입니다. LXC, LXD, LXCFS 같은 여러 형태의 컨테이너들이 존재해왔고 도커는 그 중 LXC 컨테이너를 활용해 이러한 컨테이너 환경을 만들어냅니다. 컨테이너들을 직접활용해 개발 환경을 만드는 것은 굉장히 low level 작업이라 어렵기 때문에 도커가 여러가지 기능을 통해서 higher level의 도구를 제공한다고 볼 수 있습니다.

Operation System

지금까지 도커에 대해서 얘기하면서 계속 나온 개념이 OS입니다. OS는 크게 2가지로 구분할 수 있는데 그것이 바로 OS kernel과 소프트웨어 셋 (set) 입니다. OS 커널은 하드웨어와 상호작용하며 소프트웨어를 관리합니다. 우분투, 페도라, 센토스 같은 운영체제들은 같은 OS kernel(리눅스)를 기반으로 그위에 올라가 있는 소프트웨어가 다른것입니다. 각각 소프트웨어들은 다른 유저 인터페이스, 드라이버, 컴파일러, 파일관리자, 개발도구 등을 가집니다. 따라서 이 각각은 같은 OS kernel을 사용하지만 그위에 다른 소프트웨어를 얹어 서로 다른 OS를 구성하게 된 것입니다.

Sharing the kernel

따라서 리눅스 커널위에서 존재하는 컨테이너들은 각각 서로 다른 운영체제를 유지한채 동작할 수 있습니다. 단, 같은 OS 커널을 가지는 운영체제만이 가능하겠죠. 만일 다른 OS 커널, 예를 들어 윈도우 컨테이너의 경우에는 리눅스 커널위에서 도는 도커위에서는 동작하지 않게 될 것입니다.

다른 커널을 돌리지 못하기에 오는 불이익이 있는지 궁금할 수 있습니다. 하지만 도커는 애초에 목적이 그것에 있지 않습니다. 하이퍼바이저(hypervisor)와는 다르게 도커의 목적은 같은 하드웨어에서 서로 다른 OS 커널을 동작시키는데 있지 않습니다. 도커의 목적은 애플리케이션을 패키지화하고 컨테이너화해서 애플리케이션을 옮기고 어디에서든 우리가 원할 때 동작할 수 있게끔 하는데 있습니다. 여기서 가상머신과 컨테이너의 차이점이 나타납니다.

Virtual Machine vs Container

위에 설명만 듣고 의문이 생기신 분들이 계실겁니다. 어? 나 윈도우에서 리눅스 컨테이너 돌린적 있는데? 그 경우는 머지? 그 경우는 사실 윈도우 위에서 돌린 것이 아닌 리눅스 virtual machine위에서 도는 도커에서 리눅스 컨테이너를 돌린 것입니다.

그림

앞서 설명했던 것처럼 가상머신은 하이퍼바이저(ex. EXS) 위에 각각의 OS 커널을 가진 가상머신을 설치하는 형태입니다. 각각의 가상머신은 자신만의 OS를 가지게 됩니다. 반면에, 도커는 같은 운영체제를 공유한 컨테이너를 위에 올린 형태입니다.

따라서 자원 사용에 있어서 오버헤드가 가상머신이 더 크게 됩니다. 그리고 가상머신은 OS를 포함하기에 크기면에서도 도커보다 더 크게됩니다. 도커가 더 가볍고 더 빠르고 오버헤드가 적게되는 것이죠.(보통 가상머신은 GB 단위이고 컨테이너는 MB 단위입니다.)

Container vs Image

이미지는 VM template 같은 일종의 패키지 또는 template입니다. 컨테이너를 생성하는 템플릿이라 생각하면 됩니다. 컨테이너는 실제 돌아가는 인스턴스(Running Instance of Image) 입니다.

profile
백엔드 개발자 디디라고합니다.

0개의 댓글