본문 바로가기

컴퓨터 과학

Docker(도커) vs Virtual Machine(가상머신), 왜 도커를 사용하나?

Docker와 Virtual Machine은 백엔드 서버에서 구축하는데 빈도 높게 사용하는 일종의 기술이다. 먼저 이 두 기술은 vitualization(가상화)라고 불리는 공통점이 있다. 가상화 기술은 일종의 추상화 계층(abstraction layer)를 만든다. 여기서 추상화 계층은 관리자/개발자가 복잡한 저수준의 구성, 즉 cpu나 ram, 프로세스 등을 직접 다루지 않고, 프로그램을 다룰 수 있도록 해주는 일종의 '징검다리' 역할을 한다. (일단 이렇게 이해했는데 저도 잘 모르겠습니다...ㅜㅜ)

무슨 말이냐면, 쉽게 말해서, 현재 시스템 내에 또 다른 가상 체계를 만드는 것으로 이해를 하면 좋다. 게임을 좋아하는 분들 중에, 모바일 게임을 PC에서 하기 위해, 안드로이드 에뮬레이터를 설치하여 데스크톱에서 플레이를 해보신 분이 계실 것이다. 여기서 그 안드로이드 에뮬레이터가 바로 가상화 기술을 사용한 프로그램이다.

안드로이드 에뮬레이터(앱 플레이어) - PC에서 가상으로 구현이 되었다

위의 이미지의 경우, Window라는 운영체제에서 안드로이드라는 또 다른 운영체제가 돌아가는 모습이다. Virtual Machine가 바로 이렇게 호스트 OS 위에 게스트 OS가 돌아가도록 구현이 된다고 이해를 하면 좋겠다. 게스트 운영체제는 가상으로 돌아가며, 가장의 CPU, 가상의 RAM, 가상의 저장공간이 그 안에서 돌아간다. 그리고 이렇게 호스트와 게스트 OS 사이를 '징검다리' 역할을 해주는 추상화 계층이 Hypervisor(하이퍼바이저)이다.

 

이해를 돕기 위해 그림을 가져왔다. 아래를 참고해 보자.

좌: VM, 우: Docker

위 그림의 우측이 VM 모델을 도식화한 것으로, hypervisor가 호스트 OS와 게스트 OS 사이를 중계하는 모습을 볼 수 있다. 여기서 Guest OS, Bins/Libs/App으로 쓰여있는 한 묶음이 하나의 VM이다. 따라서 그림에는 총 3개의 VM이 돌아가고 있다.

Hypervisor는 단순히 징검다리 역할을 할 뿐만 아니라, 여러 개의 게스트 OS가 동시에 운영되도록 도와주는데, 가상 CPU, 가상 램, 가상 저장공간 등의 자원을 각 VM에 적절히 분배하는 역할도 한다. 또한 각 VM의 isolation(막혀)있도록 하여, 마치 물리적으로 개별의 존재인 것처럼 여겨지도록 해준다.

이렇게, 하나의 서버에서 여러 개의 가상 공간을 만들어 여러 개의 어플리케이션을 돌릴 수 있으므로, 여러가지 업무를 처리해야 하는 서버 컴퓨터 입장에서는 여러모로 유용한 기술이다. 하지만 요즘 들어서 VM보다 Docker를 사용하는 빈도가 높은 이유가 무엇일까?

 

 

Docker는 컨테이너(Container)화 하는 기술이다

컨테이너는 기존 VM과는 상당히 다르다. Docker의 각 컨테이너는 운영 체제 수준 가상화(OS-Level Virtualization)를 한다. 이게 무슨 말이나면, 기존 VM의 경우 안에 게스트 운영체제가 탑재되어 있다면, Docker의 컨테이너는 OS가 없고, 대신 컨테이너 내부에서 애플리케이션이 실행되기 위한 라이브러리(Libraries)와 의존성(Dependencies)이 들어간다. 또한 호스트의 운영체제 요소(커널)을 직접 접근해서 사용한다.

물론, 네임스페이스(namespace)와 cgroups(Control Groups)라는 것을 사용하여, 겉으로 보기에는 컨테이너 간 격리되어 있는 것처럼 작용하도록 한다.

 

 

그럼, Docker를 왜 요즘 더 사용하는 이유가 뭐야?

Docker를 사용하는 이유는 유연하고, 시스템 자원을 적고 효율적으로 사용하기 때문이다. 운영체제을 구동한다는 것은 상당한 자원을 필요로 한다. VM의 경우 가상의 운영체제를 중복하여 생성해야 하니, 실제 사용되는 시스템 자원이 상당하다. 하지만 Docker는 OS를 별도로 필요로 하지 않는다는 점이 큰 이점이다. 또한 Docker는 이미지로 빌드하고, 복제하고, 삭제나 정지하는 등 상당히 가볍다. 특정 시기에 대규모로 트래픽이 몰려올 때, Docker 이미지 파일을 복제해서 늘려놓으면 되지만, VM은 이렇게 유연하게 대응하지 못한다.

물론, VM도 장점도 있다. 가상 운영체제를 구동하는 만큼, 어플리케이션마다 각자 다른 운영체제가 필요할 시, 각 VM에 다른 운영체제를 설치하면 된다. 표로 요약하자면:

가상 머신(Virtual Machine) 도커(Docker)
Diverse Operating System: 다양한 운영체제 탑제 가능 MicroService: 가볍도 배포에 용이한 서비스 배포에 용이
Isolation: 개별 운영체제로 운영되는 만큼 격리성이 더 뚜렷 Rapid Developement/Deployment: 유연한 개발 및 배포 가능
Legacy: 특정 OS를 필요로 하는 옛? 어플리케이션 운영 가능 Resource Efficiency: 시스템 자원을 효율적으로 사용

과 같이 되겠다. 글이 도움이 되었길 바라며, 뿅~

 

 

 

글을 작성하는데 도움이 된 출처:

https://youtu.be/a1M_thDTqmU

https://youtu.be/IocNlhtl2k8