이미지 출처: https://www.opennaru.com/
Before posting...
벡엔드 개발자로서 배포와 운영
은 필수 지식이자 소프트웨어 개발 프로세스중 하나인 DevOps
를 관통하는 핵심 구성 요소이기도 하다. 처음 가상화와 컨테이너를 접했을 때 이를 왜 알아야하는지 의문이었고, 현업에서 이렇게 많이 쓰이고 있다는 것에 놀랐다.
본 포스팅은 내가 처음 이를 접하면서 가졌던 다음과 같은 의문에 대해 하나씩 풀어볼 예정이다.
컨테이너와 가상화의 차이?
대표적인 VM을 서비스하는 회사인 vmware공식 사이트(vmware.com)에서는 다음과 같이 VM을 소개하고 있다.
A Virtual Machine (VM) is a compute resource that uses software instead of a physical computer to run programs and deploy apps.
직역하면, 프로그램 구동과 앱 배포를 위해 물리적인 컴퓨터 대신 소프트웨어를 사용하는 컴퓨팅 자원이라 명시하고 있다.
하나 또는 그 이상의 가상 "Guest" 머신은 하나의 물리적 "Host" 머신에서 구동된다. 각각의 가상머신은 자신만의 OS를 가지고 있으며, 다른 VM들과는 같은 host에 있을지라도 독립적으로 기능한다.
따라서 AWS(Amazon Web Service) 같은 다수의 이용자를 보유하고 있는 클라우드 서비스사들은 이러한 VM을 사용하여 가상 어플리케이션 자원들을 이용자들에게 한번에 제공한다.
자세한 내용과 특징들은 이후 가상머신과 컨테이너를 비교하며 부가 설명한다.
다음은 Docker 공식 사이트에서 발췌한 내용이다.
A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another
즉, 코드뿐만 아니라 그 외에 필요한 부수적인 디펜던시(dependencies)들을 패키징해서 제공하는 소프트웨어의 표준 단위이다. 따라서 사용자들은 부가적인 설치 필요없이 contaier 하나면! 어플리케이션을 빠르고 안정적으로 실행시킬 수 있는 것이다. => 매우 편리
그럼 이 둘은 어떤 차이가 있는걸까? 언뜻 보기에는 가상의 자원을 공유한다는 면에서 별반 차이점이 없어 보인다. 하지만 이 둘은 다양한 면에서 극명한 차이를 보인다.
우선 부팅하는 시작 시간부터 속도 차이가 많이 발생한다.
하드웨어 가상화
(VM)는 CPU, 메모리, 하드 디스크등의 하드웨어를 가상화를 하고 있기 때문에 하드웨어나 OS부팅을 해 분 단위 시간이 소요된다. => 좀 느림!
반면, 컨테이너 형 가상화
에서는 컨테이너 부팅 시 OS는 이미 시작하고, 프로세스 시작만 하므로 초 단위 시간이 소요된다. => 빠름!
초 단위와 분단위는 속도 차이가 체감상 크게 난다....
또한 어플리케이션을 가동할 때 소요되는 오버헤드에서도 차이가 난다.
그림 1 [왼쪽은 VM, 오른쪽은 컨테이너 계층 구조이다. ]
위 그림에서 보듯, 일반적인 하드웨어 가상화에서는 가상화 된 하드웨어 및 하이퍼 바이저를 통해 처리하기 때문에 물리적인 시스템보다 처리에 부가적인 시간, 즉, 오버헤드가 필요하다.
반면, 컨테이너에서는 "Host" 시스템 내 가상화 커널을 공유하므로 가상화된 어플리케이션은 "Host"와 직접 통신하고 실행되므로 매우 빠르고 가볍게 실행된다!
앞서서 보았듯, 시작시간, 오버헤드가 모두 VM이 유리한 점이 없다.
이뿐만이 아니다! VM은 다음과 같은 고질적인 문제점도 안고 있다.
거대한 이미지 사이즈
느린 시작시간
VM 간의 환경 불일치
이렇듯, VM은 심각한 문제점을 여러 안고 있다. 하지만 컨테이너 환경에서는 VM의 이러한 문제점들이 어느정도 해결 가능하다!
가상화 기술과 컨테이너 기술을 표로 비교하여 이를 살펴보자.
--------- | 하이퍼바이저형 가상화 | 컨테이너형 가상화 |
---|---|---|
시작 시간 | 몇 분 | 몇 초 |
이미지 크기 | 수 GB ~ 수백GB | ~ 수백 MB |
이식성 | 대부분 가상 이미지에 대한 변환이 필요 | 컨테이너 이미지 그대로 사용 가능 |
Guest OS와의 관계 | Guest OS는 하드웨어(가상)로 인식 | Host OS를 커널 수준으로 분리하여 OS를 가상화 형태로 사용 |
결국 핵심은
작은 이미지 사이즈
빠른 시작 시간
그리고 높은 이동성(Portability
)이다.
그리고 집적도를 비교해 보았을 때 컨테이너 환경이 월등히 높다는 것을 확인할 수 있다. (아래 그림 참고)
마무리
운영과 배포에 관심있는 벡엔드 개발자라면 반드시 알고 가야할 가상화 환경인 VM과 가상화에 대해 알아보았다. 컨테이너의 경우 Docker가 가장 대중적인 서비스이다. 말 그대로 환경을 얼려버려 해동시켜 사용하는 것이기 때문에 상당히 편리하고 혁신적이다는 느낌을 받았다.
정보 감사합니다.