가상 머신

Virtual Machine

도구

물리 서버 한 대를 쪼개, 각자 운영체제를 가진 여러 대의 독립된 컴퓨터처럼 쓰게 만든 실행 환경입니다.

등장 배경

서버를 직접 사서 쓰던 시절에는 기계 한 대에 프로그램 하나만 올리는 것이 관행이었습니다. 그렇게 해야 문제가 생겼을 때 원인이 분명했기 때문입니다.

대가는 낭비였습니다. 회원 가입을 처리하는 서버는 하루 중 대부분 쉬고 있고, 야간 정산만 돌리는 서버는 밤 두 시간을 빼면 켜져 있기만 합니다. 스무 대를 세워 두고 평균 사용률을 재 보면 한 자릿수에 머무는 일이 흔했습니다.

그렇다고 한 대에 여러 프로그램을 몰아넣으면 서로를 방해했습니다. 한쪽이 메모리를 다 쓰면 옆의 프로그램이 함께 죽고, 한쪽이 필요한 라이브러리 버전이 다른 쪽이 쓰는 버전과 충돌합니다. 한 서비스를 새로 올리려고 재시작했더니 같은 기계에 있던 다른 서비스가 함께 멈추는 일도 생겼습니다.

가상 머신은 그 사이를 갈랐습니다. 물리 기계 위에 자원을 나눠 주는 관리자를 한 겹 두고, 그 위에 운영체제를 여러 벌 따로 켭니다. 안에서 보면 각자 자기 컴퓨터를 통째로 쓰는 것처럼 보이고, 밖에서 보면 기계 한 대에 다섯 대가 얹혀 있습니다. 낭비를 줄이면서 서로 방해하지 않는 상태를 함께 얻은 셈입니다.

해결하는 문제

기계 한 대를 여러 독립된 컴퓨터로 나눠, 남는 자원을 쓰면서도 서로 간섭하지 않게 만듭니다.

  1. 놀던 자원을 씁니다. 8퍼센트만 쓰이던 기계에 가상 머신 다섯 개를 얹으면 같은 전기와 같은 공간으로 다섯 배를 처리합니다.
  2. 서로를 막아 줍니다. 각자 자기 운영체제를 갖고 있어서 한쪽에서 프로그램이 메모리를 다 먹고 죽어도 옆방은 그대로 돕니다. 라이브러리 버전이 서로 달라도 충돌하지 않습니다.
  3. 통째로 복제됩니다. 지금 상태를 한 장의 이미지로 떠 두면 같은 설정의 기계를 열 대 만드는 일이 몇 분 안에 끝납니다. 사람이 설치 과정을 열 번 반복하지 않아도 되니 서버마다 설정이 미묘하게 다른 문제가 사라집니다.
  4. 빌릴 수 있는 단위가 됩니다. 클라우드에서 서버를 하나 만든다고 할 때 실제로 생기는 것이 대개 이것입니다. 화면에서 사양을 고르면 2분 뒤에 쓸 수 있는 기계가 생기고, 지우면 그 시점부터 요금이 끊깁니다.
  5. 옛 환경을 남겨 둡니다. 구버전 운영체제에서만 도는 프로그램이 있으면 그 운영체제를 가진 가상 머신 하나를 따로 유지합니다. 그 프로그램 때문에 나머지 전부를 옛 버전에 묶어 두지 않아도 됩니다.

대안

운영체제를 통째로 켜는 부담이 커지면 더 가벼운 단위를 고릅니다. 갈리는 기준은 프로그램을 무엇에 담느냐입니다.

  1. 컨테이너는 프로그램과 그것이 돌아가는 데 필요한 것만 묶고 운영체제는 아래 것을 나눠 씁니다. 그래서 몇 초 만에 뜨고 한 대에 수십 개를 얹을 수 있습니다. 대신 운영체제를 함께 쓰므로 격리 정도는 가상 머신보다 약합니다.
  2. 오케스트레이션은 컨테이너가 수백 개로 늘었을 때 어느 기계에 몇 개를 얹을지, 하나가 죽으면 어디에 다시 띄울지를 대신 판단해 줍니다. 대안이라기보다 컨테이너를 실제로 굴리려면 따라붙는 도구입니다.
  3. 서버리스는 함수 단위로 코드를 올려 두고 요청이 올 때만 돌게 하는 방식입니다. 기계를 의식하지 않아도 되고 쓴 만큼만 냅니다. 한동안 호출이 없다가 첫 요청이 들어오면 준비하는 데 잠깐 걸립니다.
  4. 물리 서버를 그대로 쓰는 선택도 남아 있습니다. 자원을 나누는 겹이 없으니 성능을 온전히 쓰고, 큰 계산을 오래 돌리는 작업에서 그 차이가 드러납니다.

넷 가운데 하나를 고르는 것이 아닙니다. 가장 흔한 구성은 클라우드에서 가상 머신을 몇 대 빌리고 그 위에 컨테이너를 얹는 형태입니다. 아래쪽에서 기계 단위의 격리를 얻고 위쪽에서 가볍고 빠른 실행을 얻습니다.

실무 용례

"이건 가상 머신 한 대 따로 띄우죠. 옛 버전 운영체제가 필요해요."

환경을 갈라 둬야 하는 경우라는 판단입니다.

"컨테이너로 옮기면 뜨는 시간이 1분에서 5초로 줄어요."

시작 속도가 문제인 자리에서 더 가벼운 단위로 바꾸자는 제안입니다.

"가상 머신 세 대에 컨테이너를 나눠 올렸습니다. 한 대가 죽어도 나머지가 받습니다."

두 단위를 함께 쓰는 실제 구성을 설명하는 말입니다.

페이지덱에서는 태오가 클라우드에서 가상 머신 세 대를 빌려 그 위에 컨테이너를 얹었습니다. 웹 서버와 문서 변환 작업이 같은 기계에 함께 있지만, 변환 작업이 메모리를 많이 쓰는 시간대에도 웹 서버가 함께 느려지지 않도록 가상 머신을 나눠 두었습니다.

한 대는 따로 남겨 두었습니다. 예전에 만든 내보내기 기능이 구버전 운영체제의 라이브러리에 기대고 있어서, 그 기계만 옛 버전으로 유지합니다. 지현이 그 기능을 새로 만드는 일을 로드맵에 올려 두었고, 그때까지는 이 방식으로 버팁니다.

흔한 오해

컨테이너가 나왔으니 가상 머신은 지난 기술이라고 보는 경우가 가장 많습니다. 새 글과 발표가 대부분 컨테이너를 다루기 때문입니다. 하지만 두 가지는 층이 다릅니다. 클라우드에서 서버를 빌린다고 할 때 손에 들어오는 것이 대개 가상 머신이고, 컨테이너는 그 기계 위에서 돕니다. 가상 머신을 쓰지 않는다고 생각하는 팀도 실제로는 하루 종일 그 위에서 일하고 있습니다. 둘을 대체 관계로 보면 격리를 어느 층에서 얻고 있는지를 설명할 수 없게 됩니다.

성능이 물리 서버와 같다고 보거나 반대로 크게 느리다고 보는 것도 흔합니다. 같은 자리에서 나오는 두 오해입니다. 연산 자체는 차이가 거의 없고, 디스크와 네트워크를 거칠 때 몇 퍼센트가 더 붙습니다. 실제로 체감되는 차이는 다른 데 있습니다. 운영체제를 통째로 켜므로 시작에 1분에서 2분이 걸리고, 아무 일을 하지 않아도 메모리 몇 기가바이트를 먼저 차지합니다. 부하가 오르내릴 때 빠르게 늘리고 줄이는 오토스케일링에서 이 시작 시간이 그대로 지연으로 나타납니다.

자주 헷갈리는 용어

용어무엇을 나눠 쓰는가가상 머신과의 차이
컨테이너운영체제를 아래 것과 함께 씁니다몇 초에 뜨고 한 대에 수십 개가 올라가지만, 운영체제를 공유하므로 격리는 약합니다. 대개 가상 머신 위에 얹어 함께 씁니다

같이 보면 좋은 페이지

  • 인프라

    여섯 갈래 가운데 실행 환경이 어디에 놓이고 셋이 어떤 순서인지 봅니다

  • 컨테이너

    바로 위 층이어서 둘을 이어 읽으면 어디서 무엇을 얻는지 정리됩니다

마지막 업데이트 2026-09-16