마루옵스서버 · 네트워크 · AI 기술 노트

소개문의

가상머신과 컨테이너의 차이: 구조부터 보안·배포·복구까지

노트북으로 서버 랙을 점검하는 NERSC 기술자

참고 사진 · 노트북으로 서버 랙을 점검하는 NERSC 기술자 · 사진: Derrick Coetzee from Berkeley, CA, USA / 원본 / CC0 · 목록용 크기 조정

가상머신과 컨테이너는 한 서버에서 여러 업무를 분리해 실행한다는 점에서 닮았습니다. 다만 가상머신은 운영체제와 커널을 갖춘 컴퓨터를 나누고, 일반적인 컨테이너는 커널을 공유하면서 애플리케이션 실행 환경을 나눕니다. 이 차이가 배포 방식뿐 아니라 장애 범위, 패치, 데이터 보관 방법까지 바꿔요.

서버를 처음 구성하거나 기존 서비스를 컨테이너로 옮기려는 분을 위해 구조부터 운영상의 차이까지 연결해 설명합니다. Linux 애플리케이션 컨테이너를 기본으로 다루며, Windows와 VM 기반 격리의 예외는 따로 구분했습니다.

이 글의 목차

무엇을 나누는 기술인가

VM A와 VM B는 각각 게스트 OS와 커널을 갖고 하이퍼바이저 위에서 실행됩니다. 일반적인 Linux 컨테이너 A와 B는 런타임을 통해 실행되며 하나의 호스트 Linux 커널을 공유합니다.
그림 1. 강조한 부분은 커널 계층입니다. VM은 게스트별 커널을, 일반적인 Linux 컨테이너는 공유 호스트 커널을 관리합니다. 서버형 하이퍼바이저와 Linux 컨테이너를 단순화한 개념도입니다. 구조 참고: Docker 공식 문서.

가상머신은 독립된 게스트 운영체제를 실행합니다

가상머신(Virtual Machine, VM)은 하이퍼바이저가 제공하는 가상 CPU, 메모리, 디스크, 네트워크 장치 위에서 게스트 운영체제를 실행하는 환경입니다. 한 물리 서버에 Windows Server VM과 Linux VM을 함께 올릴 수 있고, 각 VM은 자신의 커널을 부팅합니다. 게스트 내부에서 운영체제 업데이트와 서비스 관리를 수행한다는 점도 물리 서버 운영과 비슷합니다.

하이퍼바이저는 여러 VM이 하드웨어 자원을 사용하도록 중재합니다. 서버에 직접 설치하는 ESXi 같은 방식과 데스크톱 운영체제 위의 애플리케이션으로 사용하는 방식이 있지만, 화면에 관리 프로그램이 보인다는 이유만으로 구조를 판단하면 안 됩니다. Microsoft는 Hyper-V를 하드웨어 위에서 동작하는 Type 1 하이퍼바이저로 설명합니다. Hyper-V 구조와 기능

컨테이너는 프로세스와 실행에 필요한 파일을 묶습니다

컨테이너는 애플리케이션 프로세스와 필요한 라이브러리·설정 파일 등을 격리된 환경에서 실행하는 방식입니다. 일반적인 Linux 컨테이너는 호스트의 Linux 커널을 사용합니다. 이미지에 Ubuntu나 Alpine이라는 이름이 있어도, 각각의 커널을 새로 부팅하는 것은 아닙니다. Docker의 컨테이너 설명

‘컨테이너에는 운영체제가 없다’는 말은 너무 줄인 설명이에요. 배포판의 사용자 공간 도구와 라이브러리가 들어갈 수 있고, 이미지에 따라 셸이나 패키지 관리자도 포함됩니다. 다른 배포판의 이미지를 함께 실행할 수 있는 이유와, 호스트 커널에 없는 기능을 이미지 교체만으로 얻을 수 없는 이유를 구분해 이해하면 편합니다.

Linux에서 namespace는 프로세스·네트워크·마운트 등의 보이는 범위를 나누고, cgroup은 CPU와 메모리 같은 자원을 제어하는 데 사용됩니다. 이 기능을 바탕으로 런타임이 컨테이너를 실행합니다. 격리의 강도는 권한, 장치 접근, 마운트, 보안 정책에 따라 달라집니다. Docker Engine 보안 구조

비교 항목가상머신일반적인 Linux 컨테이너
실행 단위게스트 운영체제와 애플리케이션애플리케이션 프로세스와 실행 파일
커널VM별 게스트 커널컨테이너 호스트의 커널 공유
배포 산출물VM 템플릿·디스크 이미지 등컨테이너 이미지와 실행 선언
운영 책임게스트 OS와 애플리케이션 패치호스트 커널·런타임·이미지 패치

이미지는 실행 환경이고, 컨테이너는 실행 중인 인스턴스입니다

컨테이너 이미지는 애플리케이션을 실행하는 데 필요한 파일을 담은 배포 산출물입니다. 런타임은 이 이미지를 이용해 컨테이너를 생성하고 실행합니다. 같은 이미지에서도 환경 변수, 시크릿, 볼륨, 네트워크 설정이 다르면 동작이 달라질 수 있어요.

따라서 이미지 하나만 보관했다고 서비스 전체를 복원할 수 있는 것은 아닙니다. 데이터베이스 데이터, 인증서, 외부 서비스 주소, 비밀 정보와 배포 설정까지 있어야 실제 서비스가 돌아갑니다. CPU 아키텍처와 필요한 커널 기능도 맞아야 하므로 ‘어디서나 똑같이 실행된다’는 표현에는 실행 조건이 붙습니다.

Docker는 이미지 제작과 실행을 다루는 도구·제품 생태계이고, Kubernetes는 여러 노드에 워크로드를 배치하고 원하는 상태를 유지하는 오케스트레이션 플랫폼입니다. Kubernetes가 컨테이너 이미지를 사용한다고 해서 모든 노드에 Docker Engine이 필수인 것은 아닙니다. containerd나 CRI-O처럼 Kubernetes의 런타임 인터페이스와 연동되는 구현을 사용할 수 있습니다. Kubernetes의 컨테이너와 런타임

컨테이너 이미지와 환경 변수·시크릿·볼륨·네트워크 설정이 런타임에 전달되고, 런타임이 컨테이너 A와 B를 생성해 실행하는 흐름입니다. 같은 이미지라도 실행 설정이 다르면 동작이 달라질 수 있습니다.
그림 2. 이미지는 실행에 필요한 파일을 담고, 런타임은 이미지와 설정으로 실행 인스턴스를 만듭니다. 시크릿과 영구 데이터는 이미지와 별도로 관리합니다.

LXC도 컨테이너지만 운영 단위는 다릅니다

Proxmox VE에서 만나는 LXC는 여러 Linux 시스템 환경을 분리하는 시스템 컨테이너 용도로 자주 쓰입니다. 하나의 애플리케이션을 이미지로 배포하는 Docker 방식과 관리 관점이 다릅니다. 둘 다 커널을 공유하는 컨테이너 기술이라는 공통점이 있지만, 이미지 형식과 관리 도구를 그대로 바꾸어 쓸 수는 없습니다. Proxmox VE의 KVM·LXC 설명

성능 차이는 시작 속도보다 자원 경합에서 확인합니다

컨테이너는 일반적으로 게스트 OS 전체를 부팅하지 않아 초기 실행 부담과 기본 메모리 사용을 줄이기 좋습니다. 그러나 이미지 다운로드가 크거나 애플리케이션 초기화가 길면 서비스 준비 시간은 늘어납니다. VM도 템플릿, 사전 준비, 스냅샷 기반 기동 기능 등을 어떻게 사용하는지에 따라 준비 시간이 달라집니다.

운영 중 성능은 ‘VM이냐 컨테이너냐’ 하나로 결정되지 않습니다. CPU 할당, 메모리 압박, NUMA 배치, 스토리지 경로, 네트워크 처리, 암호화와 애플리케이션 특성이 함께 작용합니다. 가상화 오버헤드가 있더라도 잘 설계한 VM이 자원 경합이 심한 컨테이너 호스트보다 나을 수 있어요. 특정 비율로 더 빠르다고 일반화하려면 같은 조건의 측정이 필요합니다.

자원 제한과 예약은 따로 봅니다

컨테이너에 제한을 지정하지 않으면 애플리케이션이 예상보다 많은 메모리와 CPU를 사용할 수 있습니다. 반대로 제한을 지나치게 낮추면 메모리 부족 종료나 CPU 제한으로 인한 응답 지연이 발생할 수 있습니다. VM 역시 과도한 vCPU 할당과 메모리 오버커밋이 성능을 떨어뜨릴 수 있습니다.

Kubernetes의 request와 limit은 같은 값의 다른 이름이 아닙니다. request는 스케줄링과 자원 배분 판단에 쓰이고, limit은 사용 상한 제어에 관여합니다. 메모리 제한 초과와 CPU 제한이 애플리케이션에 미치는 영향도 다르므로 실제 부하에 맞춰 설정해야 합니다. Kubernetes의 자원 관리

성능 시험에서는 평균 사용률과 함께 피크 시간의 응답 지연, 재시작 횟수, 저장 장치 대기 시간을 봅니다. 정상 상태에서 몇 개를 띄울 수 있는지보다, 한 노드를 정비하거나 장애로 잃었을 때 남은 노드가 감당하는지가 운영 규모를 정하는 데 더 유용합니다.

격리와 보안은 경계의 위치가 다릅니다

VM은 게스트별 커널을 갖고 하이퍼바이저를 사이에 둡니다. 일반적인 컨테이너는 호스트 커널을 공유하므로 커널 취약점과 과도한 권한이 여러 컨테이너에 영향을 줄 수 있습니다. 다만 VM에도 하이퍼바이저 취약점, 관리 계정 탈취, 잘못된 네트워크 설정의 위험이 있습니다.

컨테이너를 사용할 때는 애플리케이션을 불필요하게 root로 실행하지 않고, 필요한 권한만 부여하는 설계가 좋습니다. 호스트의 민감한 디렉터리나 런타임 소켓을 마운트하면 격리 경계를 크게 약화시킬 수 있습니다. 이미지 취약점 점검과 호스트·런타임 패치는 별개의 작업으로 관리합니다. Docker의 권한·보안 권고

서로 신뢰하지 않는 고객의 코드를 받는 서비스라면 단순한 프로세스 격리만으로 요구사항을 충족하는지 별도 검토가 필요합니다. VM을 경계로 사용하거나 샌드박스 런타임을 적용하는 선택지가 있습니다. 어떤 구성을 쓰더라도 관리 권한과 데이터 접근 권한을 나누는 일은 남습니다.

Windows와 데스크톱 환경에서 보이는 예외

Windows 컨테이너에는 호스트 커널을 공유하는 프로세스 격리와, 최적화된 VM으로 각 컨테이너에 커널 경계를 제공하는 Hyper-V 격리가 있습니다. ‘모든 컨테이너는 항상 호스트 커널을 공유한다’고 단정하면 이 차이를 놓칩니다. 호스트와 컨테이너 이미지의 버전 호환성도 확인해야 합니다. Microsoft의 컨테이너 격리 모드

macOS나 Windows에서 Linux 컨테이너를 실행할 때는 Linux VM이 그 아래에 있는 구성이 흔합니다. Docker Desktop 문서도 컨테이너를 실행하는 Linux VM과 이를 구동하는 가상화 백엔드를 구분합니다. 개발 PC에 Docker가 보인다고 해서 Linux 컨테이너가 macOS 커널을 직접 사용하는 것은 아닙니다. Docker Desktop의 가상화 백엔드

데이터 보관과 복구 방식이 운영 품질을 좌우합니다

컨테이너의 쓰기 계층에만 데이터를 저장하면 해당 컨테이너를 삭제하고 다시 만들 때 데이터가 사라질 수 있습니다. 계속 보관할 데이터는 볼륨, 바인드 마운트, 외부 스토리지 등으로 분리합니다. Docker 볼륨은 컨테이너와 별도 수명을 가질 수 있지만, 이를 삭제하는 관리 작업까지 막아 주는 것은 아닙니다. Docker 볼륨의 수명과 백업

컨테이너를 재생성하기 쉽게 만드는 것과 데이터 손실 없이 복구하는 것은 다른 문제예요. 이미지 버전을 되돌려도 데이터베이스 스키마 변경까지 자동으로 되돌아가지는 않습니다. 배포 전에 스키마 호환성과 데이터 복구 경로를 준비해야 합니다.

VM에서는 가상 디스크와 VM 설정을 함께 복구하는 방식이 일반적입니다. 하지만 실행 중인 VM의 스냅샷이 모든 데이터베이스에 애플리케이션 일관성을 보장하지는 않습니다. VM과 컨테이너 모두 데이터베이스의 백업 기능, 로그 보관, 복원 시험을 함께 설계하는 편이 안전합니다.

애플리케이션 오류는 이전 이미지와 배포 설정으로 컨테이너를 재생성하고, 데이터 삭제나 오염은 정상 시점 백업으로 데이터를 복원한 뒤 무결성과 서비스 동작을 확인합니다. 볼륨은 컨테이너와 별도 수명을 가지지만 그 자체가 백업은 아닙니다.
그림 3. 이미지 재배포와 데이터 복원은 다른 경로입니다. 이전 이미지의 DB 스키마 호환성을 확인하고, 삭제·오염된 데이터는 별도 백업에서 복원해야 합니다. VM에서도 데이터 일관성과 복원 검증은 필요합니다. 볼륨 참고: Docker 공식 문서.
상황준비할 복구 수단빠뜨리기 쉬운 부분
애플리케이션 버전 오류이전 이미지·배포 설정으로 재배포DB 스키마와 이전 버전의 호환성
컨테이너 호스트 장애다른 노드의 실행 환경과 데이터 연결로컬 볼륨의 위치와 재연결 시간
VM 호스트 장애HA 재시작 또는 VM 복원다른 호스트의 여유 자원·스토리지 접근
데이터 삭제·오염별도 보관한 정상 시점 백업복원 후 무결성과 업무 처리 검증

VM과 컨테이너를 함께 쓰는 구조

기업 환경에서는 물리 서버 위의 하이퍼바이저가 VM을 실행하고, 그 VM을 Kubernetes 노드로 사용하는 구성을 만날 수 있습니다. VM은 운영체제와 인프라 자원의 경계를 제공하고, 컨테이너는 애플리케이션 배포 단위를 제공합니다. 두 기술이 담당하는 계층이 다르기 때문에 함께 사용하는 이유가 생깁니다.

하이퍼바이저 위의 Linux VM A와 B가 각각 Kubernetes 워커 노드가 됩니다. 각 VM의 게스트 커널과 런타임 위에서 Pod의 컨테이너가 실행되는 계층 구조입니다.
그림 4. VM은 노드별 OS 경계를, 컨테이너는 앱의 실행 단위를 제공합니다. 워커 노드만 그렸으며 Kubernetes 제어 평면과 네트워크 경로는 생략했습니다. 노드 구성 참고: Kubernetes 공식 문서.
계층예시 역할관리할 대상
물리 서버·네트워크·스토리지실제 연산과 데이터 저장하드웨어 상태, 용량, 장애 경로
하이퍼바이저와 VM노드별 OS와 자원 분리VM 배치, 게스트 패치, 인프라 HA
Kubernetes와 런타임애플리케이션 배치·실행노드 상태, Pod, 네트워크, 볼륨
애플리케이션과 데이터사용자 요청과 업무 처리배포, 데이터 일관성, 서비스 지표

이 구조에서는 인프라와 애플리케이션의 장애 대응이 겹칠 수 있습니다. 하이퍼바이저가 VM을 다른 호스트에서 재시작하는 동안 Kubernetes도 Pod를 재배치할 수 있어요. 노드 장애 감지, 스토리지 분리·연결, 중복 실행 방지 조건을 함께 시험해야 합니다. 계층마다 HA 기능을 켰다는 사실만으로 전체 복구 시간이 짧아지지는 않습니다.

업무 요구에서 선택 기준을 찾습니다

운영체제 버전과 커널 모듈을 독립적으로 유지해야 하거나, 기존 소프트웨어의 인증된 설치 환경이 중요한 업무는 VM부터 검토하기 좋습니다. 애플리케이션을 수정하지 않고 현재 서버를 옮겨야 할 때도 게스트 OS를 유지하는 방식이 출발점이 됩니다. 다만 제품 지원과 라이선스 조건은 별도 확인이 필요합니다.

같은 서비스를 자주 배포하고 여러 인스턴스로 늘리며 실행 환경을 이미지로 관리하려면 컨테이너가 잘 맞을 수 있습니다. 이때 파일 저장 위치, 세션 상태, 종료 처리, 로그 수집을 정리해야 운영상의 이점을 얻습니다. 기존 설치 디렉터리를 이미지로 복사하는 작업만으로 애플리케이션 구조가 바뀌지는 않아요.

요구사항먼저 검토할 방식함께 확인할 조건
서로 다른 OS·커널을 독립 운영VM게스트 지원, 패치·백업 체계
웹·API를 자주 배포하고 확장컨테이너상태 분리, 이미지 관리, 관측 도구
기존 서버를 큰 수정 없이 이전VM드라이버, 디스크 변환, 공급사 지원
데이터베이스를 새 환경에 배치양쪽 모두 검토스토리지 지연, 복구, 인증된 운영 방식
서로 다른 팀의 서비스 분리VM과 컨테이너 조합권한, 네트워크 정책, 장애 영향 범위

첫 설계에서는 대표 서비스 하나를 골라 배포, 패치, 노드 장애, 데이터 복원을 한 번씩 수행해 보는 편이 좋습니다. 설치 시간보다 운영자가 서비스를 다시 살리는 데 필요한 절차가 선택의 근거가 됩니다.

참고 문서와 적용 범위

기술 설명과 제품 문서는 2026년 10월 18일 기준으로 확인했습니다. 특정 장비의 성능을 측정한 글은 아니며, 성능·복구 시간은 실제 구성에서 검증해야 합니다.