[Cloud Computing] VM vs Container

Minji Jeong·2024년 5월 12일
post-thumbnail

Docker를 사용한 CI/CD 구현 방식에 대해 공부하던 중 컨테이너에 대한 개념을 이해하고자 했고, 그 과정에서 대표적인 가상화기술 VM과 컨테이너에 대해 알아보는 시간을 가졌습니다.

앞서 말씀드렸듯 VM과 컨테이너는 대표적인 서버 가상화 기술 방법 중 하나입니다. 두 방법 모두 가상화 기술 중 하나라는 것은 동일하지만, 가상화 방식에서 차이가 있습니다.

가상화 (Virtualization)

가상화란 하나의 물리적 서버에서 여러 운영체제와 애플리케이션을 실행할 수 있도록 하는 소프트웨어 기술입니다. 서버 하나에 사용량이 적은 애플리케이션 하나만 올리는 것은 자원의 낭비이며, 그렇다고 모든 애플리케이션을 하나의 서버에 올리는 것은 안정성이 저하됩니다. 따라서 서버 하나의 여러 애플리케이션을 올리는 동시에, 안정성도 지키기 위해 등장한 기술이 가상화 입니다.

대표적인 가상화 기술, VM과 컨테이너

VM (Virtual Machine)

컴퓨터공학을 전공하셨거나, 맥북을 사용하는데 윈도우 프로그램(한글)이 필요한 상황에 계셨던 분들은 VM을 한번쯤은 사용해보셨을 거라고 생각합니다.

VM은 하드웨어 수준의 가상화입니다. 하이퍼바이저(Hypervisor)라는 하드웨어 가상화 소프트웨어에 의해 가상화된 하드웨어 리소스(Processor, RAM, Storage..)들이 VM 인스턴스에 할당되며, 각 VM들은 할당받은 하드웨어 리소스를 사용해 별도의 OS 환경을 구축할 수 있습니다. 이는 곧 Host OS와 독립된 형태로 멀티 OS 환경을 구축할 수 있음을 의미합니다.

장점
앞서 말했듯 멀티 OS 환경 구축이 가능합니다. 멀티 OS란 Host OS가 Mac이어도 Guest OS는 Window나 Linux등 자유롭게 구축이 가능하다는 뜻입니다.
또한 Host OS와 독립되어 있기 때문에 VM이 외부 공격에 위협을 받아도 Host OS 및 다른 VM에 영향이 없어 보안 면에서 우수합니다.

단점
학부 때 VirtualBox를 사용해서 실습했던 경험이 있는데, 매우 느렸던 기억이 납니다. 사실 당연합니다. OS위에 OS를 올리는 것이기 때문에 무겁고 느릴 수 밖에 없습니다.
또한 VM이 처리한 io를 결국 Host OS의 커널이 다시 받아 자신의 드라이버에 맞게 처리해줘야 하기 때문에 병목현상이 발생할 수 있습니다.

Container

VM과 달리 컨테이너는 OS 수준의 가상화입니다. Host OS 위에 여러개의 컨테이너들을 올리고, 그 위에 애플리케이션 실행에 필요한 바이너리만 올리는 방식입니다.

VM처럼 가상화된 하드웨어 리소스를 사용하여 별개의 OS를 구축하는데 사용하지 않고, Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것이 목적입니다. 따라서 생성된 컨테이너들은 Host OS와 커널을 공유하게 되며, 그렇기에 VM처럼 OS 수준의 격리가 아닌 프로세스 수준의 격리가 이루어집니다.

컨테이너는 프로세스 격리를 위해 다음의 리눅스 커널 요소를 사용하고 있습니다.

  • Namespace : 자원 격리 (프로세스 별로 별도의 커널 자원 분할)
  • cgroup : 리소스 사용량 결정

장점
별도의 OS를 구축해 올리는 VM과 다르게 Host OS를 기반으로 한 컨테이너를 올리는 것이기 때문에 VM보다 가벼우며, Host OS와 커널을 공유하기 때문에 들어온 io가 쉽게 처리돼서 나갈 수 있어서 속도가 빠릅니다.
또한 이식성 면에서도 뛰어납니다. Docker가 설치되어 있는 환경이라면 어디서든 컨테이너 실행이 가능하기 때문입니다.

단점
Host OS와 커널을 공유하기 때문에 일단 멀티 OS가 불가능합니다. 또한 이 이유로 컨테이너가 외부 공격에 위협을 받으면 Host OS도 영향받을 수 있기 때문에 VM보다 보안 면에서 상대적으로 취약합니다.

결론

VM과 컨테이너 모두 각각의 장단점을 갖고 있습니다. 최근에는 아무래도 컨테이너를 선호하고 있는 것 같긴 한데요, 두 기술의 장점만 합해서 사용할 수도 있다고 합니다. 예를 들어 하나의 VM 위에 여러개의 컨테이너를 올린다면 컨테이너 중 하나가 외부 공격을 받아도 해당 VM만 영향을 받고 다른 VM 또는 Host OS가 영향받지 않을 수 있습니다. 결론적으로는 자신이 원하는 목적에 적절한 기술을 택하는 것이 제일 베스트가 아닌가 싶습니다.

정리

VMContainer
가상화 레벨하드웨어OS
격리 수준OS프로세스
인스턴스독립적Host OS에 의존
속도느림VM보다 빠름
보안독립적인 인스턴스, 영향 거의 XHost OS와 커널을 공유하기 때문에 VM보다는 상대적으로 보안에 취약
멀티 OS가능불가능

용어

이름설멍
커널하드웨어 자원을 관리하고 하드웨어와 프로세스 사이의 인터페이스 역할을 수행하는 OS의 핵심 구성 요소
프로세스실행중인 프로그램으로, OS에 의해 관리되며 독립적으로 실행되고 자원을 할당받을 수 있는 단위
병목현상컴퓨터 성능 저하 현상으로, 병의 목 부분처럼 넓은 길이 갑자기 좁아지는 현상을 비유

References

https://medium.com/@darkrasid/docker%EC%99%80-vm-d95d60e56fdd
https://www.youtube.com/watch?v=cjXI-yxqGTI
https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90

profile
Software Engineer

0개의 댓글