본문 바로가기

Python/Docker Intro

Docker Intro - 1. Docker Container 와 VM

Docker Container를 알기 위해서는 먼저 VM을 간단하게 알아야합니다.

EC2 Intro의 VM에 대한 간략한 설명을 보고 오시는 것도 좋습니다.

 

Docker Container가 왜 쓰이는지 알기 위해서 간략하게 설명해보도록 하겠습니다.

Docker Container가 많은 대중에게 사용되기 전, VM을 사용하여서 시스템을 구축했습니다.

 

VM은 Virtual Machines의 약자로,

어떠한 프로그램을 한 컴퓨터에서 여러한 컴퓨터 처럼 분리하여

각각 독립적으로 프로그램을 실행하고 운영하기 위해 사용되었습니다.

 

이를 위해 Hypervisor라는 VM이 실행되는 소프트웨어를 사용합니다.

즉, 호스트 머신위에서 자신의 프로그램을 실행하기 위한 OS, System Binary, Library,

어플리케이션을 포함하여서 가상화 된 네트워크, Storage, CPU, Memory등의

하드웨어 요소까지 모두 포함하는 독립적인 가상 컴퓨터를 만들어 주는 것입니다.

 

해당 자원은 호스트 컴퓨터의 Resource에서 할당되어 사용하게 됩니다.

그래서 그림으로 보면 아래와 같습니다.

 

 

하지만 이러한 VM에는 하드웨어와 하이퍼바이저 사이에 있는 이 부가적인 단계가

더 많은 리소스 오버헤드를 발생시키며, VM의 퍼포먼스를 떨어뜨릴 수 있습니다.

 

VM은 운영 체제의 전체 복제본 뿐만 아니라,

운영 체제가 실행해야 하는 모든 하드웨어의 가상 복제본을 구동하기 때문입니다.

이로 인해 소모되는 RAM과 CPU가 빠른 속도로 늘어나기 때문에 최적화 작업이 쉽지 않습니다.

 

 

하지만 도커 컨테이너에서는 Docker-engine 위에 어플리케이션에 실행에 필요한 바이너리만 올라가게 됩니다. 

그 외 커널 부분은 호스트의 커널을 공유합니다. 각 컨테이너 격리는 Linux Namespace를 통해 개념적으로 수행합니다.

호스트의 커널과 컨테이너의 커널이 다를 경우 다른 부분만큼만 패키징 됩니다.

따라서 그만큼 Resource를 절약할 수 있는 것입니다.

 

여기까지가 인프라적으로 보는 장 단점입니다.

 


 

그렇다면 운영면에서는 어떠한 차이를 보일까요?

 

관리면에서 만약 VM으로 시스템을 올린 경우 오래되면 오래될수록 어떤 라이브러리가 설치되었는지,

만약 당사자가 퇴사할 경우 어떤 서비스가 올라가있는지에 대해서 알 길이 없습니다.

 

하지만 도커 컨테이너의 경우에는 도커파일에 모든 내역이 다 적혀있기 때문에 걱정할 필요가 없습니다.

호스트 OS를 교체하더라도 도커를 설치하기만 하면 이전 서비스들을 그대로 옮겨 띄울 수 있기 때문입니다.

VM의 경우에는 이러한 작업이 굉장히 어렵게 됩니다.

 

이러한 이유로 IaC인 Ansible이나 아니면 아에 Cloud Infra까지 내역을 관리하기 위한 Terraform등이

주목받는 이유라고 볼 수 있겠습니다.

 

유지 보수 관리면에서도 마찬가지입니다. 

굉장히 크리티컬한 에러가 발생하였지만 무중단으로 배포해야할 경우,

VM의 경우 블루그린으로 새로운 VM을 띄우고 그 위에 서비스를 올려야합니다.

또한 VM에 올린 서비스의 경우 모듈별로 잘게 쪼개서 하기에는 리소스 낭비가 크기 때문에

기본적인 빌드 배포시간이 오래걸리게 됩니다.

 

하지만 도커 컨테이너는 기본적으로 모듈이 잘게 쪼개서 설계되며,

그저 해당 모듈의 컨테이너만 다시 띄워주면 되기 때문에 속도가 빠릅니다.

또한 다른 서비스에 대한 장애 발생에 대한 영향도도 낮습니다.

그렇기에 유지보수 속도에서도 VM과 많은 차이를 보이게 됩니다.

 

또한 이러한 구조 때문에 서비스의 설계 및 확장할 때,

서비스 확장에 대한 부분도 컨테이너만 추가하면 되기 떄문에 큰 어려움이 없습니다.

 

하지만 VM은 독립적으로 운영하기 위해서는 VM 자체를 하나 더 띄워야 하고,

이 부분이 리소스 낭비가 심해질 수 있기 때문에 어려움이 있습니다.

여기서 리소스낭비 = 돈낭비 이기 때문입니다.

 

이러한 요소 외에도 도커 컨테이너는 VM에 비해 굉장히 빠릅니다.

 

VM은 I/O가 발생하는 요소가 컨테이너보다 많습니다.

호스트 OS에서 거의 완전히 분리된 형태로 운영이 되지만 I/O가 생길 경우,

VM이 처리한 I/O를 결국 호스트 OS의 커널이 자신의 드라이버에 맞게 다시 처리해야 합니다.

이 부분에서 병목이 발생하게 되는 것 입니다.

 

하지만 컨테이너는 커널을 공유하기 때문에 들어온 I/O가 쉽게 처리돼서 나갈 수 있게 됩니다.

VM이 컨테이너보다 더 많은 커널 처리가 들어가야 되니 성능면에서 더 떨어지게 됩니다.

 

하지만, 무조건 적으로 도커 컨테이너가 최고의 선택이 되는 것은 아닙니다.

보안적으로 컨테이너가 하나 뚫리면 호스트가 뚫릴 수 있는 구조이며,

컨테이너를 관리하기 위해 사용되는 오케스트레이션 툴 Kubernetes or ECS와 같은 툴을 사용해야 하기 때문입니다.

이러한 툴의 예로 Istio와 같이 사이드카 형태로 컨테이너가 하나씩 더 띄워지게 되는 경우

리소스를 그만큼 많이 잡아먹게 됩니다. (하지만 관리면에서 너무 뛰어난 장점을 지닙니다.)

 

여기까지 간단하게 Docker Container를 왜 사용하는지, VM과 어떤 차이점이 있는지 간단하게 알아봤습니다.

다음 게시글에서는 Docker Container에 대한 기본적인 개념정리를 해보도록 하겠습니다.