앞서서 가상화의 첫 번째, 두 번째 유형인 Hypervisor에 대해 알아보았다. 자료조사 도중 발견한 한 블로그에는 이렇게 적혀있었다.
최근 가상화 기술의 축은 하이퍼바이저 기반의 가상화에서 컨테이너 기반 가상화로 이동하고 있습니다.
Hypervisor는 하드웨어 자원을 가상화하기 때문에 OS전부가 가상머신안에 들어있다. 때문에 많은 자원을 사용하게 되고 Host OS와 Guest OS의 기능이 중복되는 경우가 생긴다.
컨테이너는 데스크탑, 기존의 IT 또는 클라우드 등 어디서나 실행될 수 있도록 애플리케이션 코드가 해당 라이브러리 및 종속 항목과 함께 패키징되어 있는 소프트웨어 실행 유닛이다.
Container는 OS의 기능을 사용해 프로세스를 격리하고 프로세스에게 필요한 CPU, Memory 자원을 할당한다. 뿐만 아니라 각각의 Container들은 OS kernel을 공유하기 때문에 더 적은 자원으로 여러 어플리케이션을 동작시킬 수 있다.
두 부분에 주목해 보자
- 어플리케이션 코드가 해당 라이브러리 및 종속 항목과 함께...
컨테이너는 어플리케이션의 실행에 필요한 라이브러리와 바이너리, 기타 구성 파일을 ‘이미지’ 단위로 빌드하여 패키지로 배포한다.
- OS의 기능을 사용해 프로세스를 격리하고 프로세스에게 필요한 자원을 할당...
컨테이너는 시스템 OS kernel을 사용하기 때문에 OS전체를 가져와야 했던 Hypervisor보다 가볍다.
그로인해 불필요한 overhead가 발생하지 않는다.
도커 홈페이지에 가보면 이런 말이 쓰여있다.
"Containers are an abstraction at the app layer that packages code and dependencies together."
컨테이너는 어플리케이션 계층에서 추상화가 일어나기 때문에 OS전체가 필요 없다. 컨테이너가 가상화 하는 것은 OS이다. 때문에 각각의 Container들은 OS kernel을 공유한다.
추상화와 가상화를 헷갈리기 쉬운데 추상화는 복잡한 것을 핵심만 간추려 간단하게 하는 것이고,
가상화는 복잡한 것이든 간단한 것이든 그대로 존재하지만 실체가 없는 것이다.
Hypervisor는 하드웨어 계층을 가상화 해 개별 OS를 갖기 때문에 자원이 많이 필요하고
Container는 어플리케이션 계층을 가상화 해 OS를 공유하기 때문에 자원이 적게 필요하다
Hypervisor는 하드웨어를 격리하므로 Hypervisor가 실행 중인 환경에서만 사용할 수 있고
Container는 프로세스를 격리하므로 어디에서든 사용할 수 있다.
ref
https://www.docker.com/resources/what-container
https://www.ibm.com/kr-ko/cloud/learn/containers
https://www.ibm.com/cloud/blog/containers-vs-vms
https://library.gabia.com/contents/infrahosting/7426/
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html