가상 머신
Virtual Machine
도구
물리 서버 한 대를 쪼개, 각자 운영체제를 가진 여러 대의 독립된 컴퓨터처럼 쓰게 만든 실행 환경입니다.
등장 배경
서버를 직접 사서 쓰던 시절에는 기계 한 대에 프로그램 하나만 올리는 것이 관행이었습니다. 그렇게 해야 문제가 생겼을 때 원인이 분명했기 때문입니다.
대가는 낭비였습니다. 회원 가입을 처리하는 서버는 하루 중 대부분 쉬고 있고, 야간 정산만 돌리는 서버는 밤 두 시간을 빼면 켜져 있기만 합니다. 스무 대를 세워 두고 평균 사용률을 재 보면 한 자릿수에 머무는 일이 흔했습니다.
그렇다고 한 대에 여러 프로그램을 몰아넣으면 서로를 방해했습니다. 한쪽이 메모리를 다 쓰면 옆의 프로그램이 함께 죽고, 한쪽이 필요한 라이브러리 버전이 다른 쪽이 쓰는 버전과 충돌합니다. 한 서비스를 새로 올리려고 재시작했더니 같은 기계에 있던 다른 서비스가 함께 멈추는 일도 생겼습니다.
가상 머신은 그 사이를 갈랐습니다. 물리 기계 위에 자원을 나눠 주는 관리자를 한 겹 두고, 그 위에 운영체제를 여러 벌 따로 켭니다. 안에서 보면 각자 자기 컴퓨터를 통째로 쓰는 것처럼 보이고, 밖에서 보면 기계 한 대에 다섯 대가 얹혀 있습니다. 낭비를 줄이면서 서로 방해하지 않는 상태를 함께 얻은 셈입니다.
해결하는 문제
기계 한 대를 여러 독립된 컴퓨터로 나눠, 남는 자원을 쓰면서도 서로 간섭하지 않게 만듭니다.
- 놀던 자원을 씁니다. 8퍼센트만 쓰이던 기계에 가상 머신 다섯 개를 얹으면 같은 전기와 같은 공간으로 다섯 배를 처리합니다.
- 서로를 막아 줍니다. 각자 자기 운영체제를 갖고 있어서 한쪽에서 프로그램이 메모리를 다 먹고 죽어도 옆방은 그대로 돕니다. 라이브러리 버전이 서로 달라도 충돌하지 않습니다.
- 통째로 복제됩니다. 지금 상태를 한 장의 이미지로 떠 두면 같은 설정의 기계를 열 대 만드는 일이 몇 분 안에 끝납니다. 사람이 설치 과정을 열 번 반복하지 않아도 되니 서버마다 설정이 미묘하게 다른 문제가 사라집니다.
- 빌릴 수 있는 단위가 됩니다. 클라우드에서 서버를 하나 만든다고 할 때 실제로 생기는 것이 대개 이것입니다. 화면에서 사양을 고르면 2분 뒤에 쓸 수 있는 기계가 생기고, 지우면 그 시점부터 요금이 끊깁니다.
- 옛 환경을 남겨 둡니다. 구버전 운영체제에서만 도는 프로그램이 있으면 그 운영체제를 가진 가상 머신 하나를 따로 유지합니다. 그 프로그램 때문에 나머지 전부를 옛 버전에 묶어 두지 않아도 됩니다.
대안
운영체제를 통째로 켜는 부담이 커지면 더 가벼운 단위를 고릅니다. 갈리는 기준은 프로그램을 무엇에 담느냐입니다.
- 컨테이너는 프로그램과 그것이 돌아가는 데 필요한 것만 묶고 운영체제는 아래 것을 나눠 씁니다. 그래서 몇 초 만에 뜨고 한 대에 수십 개를 얹을 수 있습니다. 대신 운영체제를 함께 쓰므로 격리 정도는 가상 머신보다 약합니다.
- 오케스트레이션은 컨테이너가 수백 개로 늘었을 때 어느 기계에 몇 개를 얹을지, 하나가 죽으면 어디에 다시 띄울지를 대신 판단해 줍니다. 대안이라기보다 컨테이너를 실제로 굴리려면 따라붙는 도구입니다.
- 서버리스는 함수 단위로 코드를 올려 두고 요청이 올 때만 돌게 하는 방식입니다. 기계를 의식하지 않아도 되고 쓴 만큼만 냅니다. 한동안 호출이 없다가 첫 요청이 들어오면 준비하는 데 잠깐 걸립니다.
- 물리 서버를 그대로 쓰는 선택도 남아 있습니다. 자원을 나누는 겹이 없으니 성능을 온전히 쓰고, 큰 계산을 오래 돌리는 작업에서 그 차이가 드러납니다.
넷 가운데 하나를 고르는 것이 아닙니다. 가장 흔한 구성은 클라우드에서 가상 머신을 몇 대 빌리고 그 위에 컨테이너를 얹는 형태입니다. 아래쪽에서 기계 단위의 격리를 얻고 위쪽에서 가볍고 빠른 실행을 얻습니다.
실무 용례
"이건 가상 머신 한 대 따로 띄우죠. 옛 버전 운영체제가 필요해요."
환경을 갈라 둬야 하는 경우라는 판단입니다.
"컨테이너로 옮기면 뜨는 시간이 1분에서 5초로 줄어요."
시작 속도가 문제인 자리에서 더 가벼운 단위로 바꾸자는 제안입니다.
"가상 머신 세 대에 컨테이너를 나눠 올렸습니다. 한 대가 죽어도 나머지가 받습니다."
두 단위를 함께 쓰는 실제 구성을 설명하는 말입니다.
페이지덱에서는 태오가 클라우드에서 가상 머신 세 대를 빌려 그 위에 컨테이너를 얹었습니다. 웹 서버와 문서 변환 작업이 같은 기계에 함께 있지만, 변환 작업이 메모리를 많이 쓰는 시간대에도 웹 서버가 함께 느려지지 않도록 가상 머신을 나눠 두었습니다.
한 대는 따로 남겨 두었습니다. 예전에 만든 내보내기 기능이 구버전 운영체제의 라이브러리에 기대고 있어서, 그 기계만 옛 버전으로 유지합니다. 지현이 그 기능을 새로 만드는 일을 로드맵에 올려 두었고, 그때까지는 이 방식으로 버팁니다.
흔한 오해
컨테이너가 나왔으니 가상 머신은 지난 기술이라고 보는 경우가 가장 많습니다. 새 글과 발표가 대부분 컨테이너를 다루기 때문입니다. 하지만 두 가지는 층이 다릅니다. 클라우드에서 서버를 빌린다고 할 때 손에 들어오는 것이 대개 가상 머신이고, 컨테이너는 그 기계 위에서 돕니다. 가상 머신을 쓰지 않는다고 생각하는 팀도 실제로는 하루 종일 그 위에서 일하고 있습니다. 둘을 대체 관계로 보면 격리를 어느 층에서 얻고 있는지를 설명할 수 없게 됩니다.
성능이 물리 서버와 같다고 보거나 반대로 크게 느리다고 보는 것도 흔합니다. 같은 자리에서 나오는 두 오해입니다. 연산 자체는 차이가 거의 없고, 디스크와 네트워크를 거칠 때 몇 퍼센트가 더 붙습니다. 실제로 체감되는 차이는 다른 데 있습니다. 운영체제를 통째로 켜므로 시작에 1분에서 2분이 걸리고, 아무 일을 하지 않아도 메모리 몇 기가바이트를 먼저 차지합니다. 부하가 오르내릴 때 빠르게 늘리고 줄이는 오토스케일링에서 이 시작 시간이 그대로 지연으로 나타납니다.
자주 헷갈리는 용어
| 용어 | 무엇을 나눠 쓰는가 | 가상 머신과의 차이 |
|---|---|---|
| 컨테이너 | 운영체제를 아래 것과 함께 씁니다 | 몇 초에 뜨고 한 대에 수십 개가 올라가지만, 운영체제를 공유하므로 격리는 약합니다. 대개 가상 머신 위에 얹어 함께 씁니다 |
같이 보면 좋은 페이지
마지막 업데이트 2026-09-16