가상머신(VM; Virtual Machine)은 단일 물리적 컴퓨터 시스템 내에서 여러 개의 독립적인 운영 체제와 애플리케이션을 실행할 수 있도록 하는 소프트웨어 기술이다.
즉, 내 컴퓨터 안에 또 다른 독립된 컴퓨터를 만드는 것이라고 보면 된다.
가상화 이전의 시대에는 하나의 서버에 하나의 어플리케이션만 구동시켰다고 한다. 이렇다 보니 하나의 서버에 남는 자원이 많았다. 이런 비효율성을 극복하기 위해 등장한 기술이 가상화 기술이다. 그 중 하이퍼바이저(hypervisor)기반의 가상화가 가장 많이 이용되었다. 하이퍼바이저는 논리적으로 분할된 공간에서 VM이라는 독립된 가상환경을 만들고 호스트 시스템에서 VM에 깔린 게스트OS를 구동 및 모니터링하는 역할을 한다. 하이퍼바이저는 다음과 같은 역할을 한다.
✔️ 하드웨어 자원 분배
CPU, 메모리, 디스크, 네트워크 등 실제 하드웨어를 각 VM에 적절히 나눠준다.
✔️ 게스트 OS 격리
각 VM이 서로 간섭하지 않고 독립적으로 동작하게 한다.
한 VM이 문제가 생겨도 다른 VM이나 호스트 OS에는 영향이 없다.
✔️ 명령 변환 및 실행
게스트 OS가 내린 명령을 호스트 하드웨어가 이해할 수 있는 형태로 변환한다.
✔️ VM 관리
VM 생성, 삭제, 일시정지, 재시작 등 전체 관리 기능을 제공한다.
✔️ 성능 최적화
여러 VM이 동시에 실행될 때 리소스 경쟁을 조절한다.
가능한 효율적으로 CPU 스케줄링, 메모리 사용, I/O 처리를 한다.
예시로는 하드웨어 바로 위에서 실행되어 성능이 우수하고 클라우드/서버 환경에서 많이 사용되는 베어메탈(Bare-metal)하이퍼바이저인 VMware ESXi, Xen, Microsoft Hyper-V (Server 모드)가 있으며,
OS 위에서 실행되어 설치가 편리하고, 개인 및 개발 환경에서 많이 사용되는 호스트형 하이퍼바이저인VirtualBox, VMware Workstation, Parallels Desktop 등이 있다.
요약하자면
VM : 분할 공간에서의 가상환경, Virtual Machine
호스트 시스템 : 서버의 OS
게스트 OS : VM 의 OS
하이퍼바이저 : 게스트OS를 구동 및 모니터링
논리적으로 구분된 공간에서 독립된 가상의 하드웨어를 할당 받은 VM들은 서로에게 어떤 영향도 미치지 않는다. 즉, 1개의 가상환경에서의 Error 가 다른 가상환경에 영향을 미치지 않는다. 이러한 장점으로 가상화를 사용하게 되었다.
그렇다면 도커와 VM의 차이는 무엇일까?
간단하게 이야기 해본다면 바로 게스트OS의 유무라고 할 수 있다. VM에는 우에서 언급한 게스트 OS가 깔린다. 하지만 도커의 컨테이너는 그렇지 않다. 컨테이너에는 게스트 OS를 설치하지 않는다. 이는 자원의 효율성 측면에서 차이가 난다. VM은 하나씩 늘 때마다 OS를 위한 자원을 할당해주어야 하는 반면에 도커는 어플리케이션을 구동하는 데 필요한 모든 패키지만 있으면 컨테이너를 구동시킬 수 있다. 즉 호스트 OS의 커널을 공유한다.
일반적으로 Docker가 VM보다 유리한 이유는 다음과 같다.
VM은 OS 전체를 포함하므로 파일 크기와 실행 속도가 크다.
Docker는 OS 커널을 공유하고 앱과 라이브러리만 격리하여 훨씬 가볍고 빠르다.
VM은 부팅 시간이 수십 초~분 정도 걸릴 수 있지만, Docker 컨테이너는 몇 초 안에 시작 가능하다.
Docker 이미지를 만들어서 여러 서버에 동일하게 배포 가능하다.
VM은 OS 포함해서 전체를 관리해야 하므로 업데이트/복제가 상대적으로 번거롭다.
Docker가 무조건 좋을까? 그렇지 않다. VM이 Docker보다 좋은 경우도 분명히 있다.
각각의 환경이 유리한 경우가 다른 가장 큰 이유는, VM과 Docker의 핵심 차이인 '격리의 수준'에 있다.
VM은 하드웨어를 통째로 가상화하고(Guest OS를 새로 설치), Docker는 호스트 OS의 커널을 공유한다.
어떤 경우에 VM을 사용하는게 더 유리할까?
Docker는 호스트 OS를 공유한다. 만약 A 컨테이너가 악의적인 공격에 성공해 커널에 접근한다면, B 컨테이너나 호스트 OS에 영향을 줄 수 있는 잠재적 위협이 존재한다. 하지만 VM은 하드웨어부터 OS까지 완전히 분리되어, A라는 VM이 해킹당해도 그 안에서 완벽하게 격리된다. 옆의 B VM이나 호스트 OS에는 어떤 영향도 줄 수 없다. 공격자가 VM을 탈출하려면 OS가 아닌 하이퍼바이저 자체를 뚫어야 하는데, 이는 훨씬 더 어렵다. 예시로 신뢰할 수 없는 수천 명의 고객 코드를 동시에 실행하는 AWS, GCP, Azure 등이 이 기술을 사용한다.
Docker는 커널을 공유하기 떄문에, Linux Docker 호스트에서는 Windows 컨테이너를 실행할 수 없다. 하지만 VM은 하드웨어를 통째로 흉내내기 때문에, 그 위에 어떤 OS든 설치할 수 있다.
Docker는 앱을 기능별로 잘게 쪼개는 '마이크로서비스'와 'Stateless 아키텍처'에 최적화되어 있다. 하지만 예를 들어 10년 전에 만들어져 모든 기능이 하나의 거대한 덩어리로 뭉쳐있고, 서버 자체에 데이터를 저장(Stateful)하는 오래된 애플리케이션들이 있다. 이런 앱들은 굳이 쪼개서 컨테이너화 하는 것보다는 VM 하나에 통째로 넣어두고 예전에 쓰던 방식 그대로 운영하는 것이 훨씬 효율적이다.
- Docker의 장점
경량화, 빠른 배포, 환경 일관성 관리 용이- VM의 장점
높은 수준의 격리로 인한 보안성
서로 다른 운영체제 실행 시 용이
레거시 애플리케이션 실행가능
https://velog.io/@kdaeyeop/%EB%8F%84%EC%BB%A4-Docker-%EC%99%80-VM%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://velog.io/@ye1219/%EB%8F%84%EC%BB%A4Docker%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C