서론
예전에는 물리 서버 한 대에 운영체제를 하나만 깔고 사용했다. 그러나 현대 서버는 성능이 좋아 잉여 자원이 발생하는데 이를 효율적으로 활용하기 위해 가상화(Virtualization) 기술이 사용되기 시작했다.
처음에는 VM(가상머신) 으로 가상화를 진행했으나, 최근에는 훨씬 가볍고 빠른 컨테이너(Container) 기술이 각광받고 있다. 컨테이너가 많아지자 이를 한꺼번에 관리하기 위한 Kubernetes(쿠버네티스) 도 주목을 받고 있다.
이 글에서 VM, 컨테이너, Docker, 그리고 Kubernetes를 쉽고 간단하게 살펴봅니다.
1. 가상화(Virtualization)는 무엇인가
한 대의 물리 서버에서 여러 운영체제를 동시에 실행
현대 서버는 CPU, 메모리, 디스크 등 성능이 과거 대비 크게 향상되었다. 이로 인해 자원이 남는 경우가 많아졌고, 여러 환경을 격리해 하나의 서버에 효율적으로 올리기 위한 기술이 가상화이다.
Host OS와 Guest OS
- Host OS(호스트 OS): 실제 물리 하드웨어와 운영체제를 가진 PC나 서버
- Guest OS(게스트 OS): 하이퍼바이저 위에서 동작하는 가상머신의 운영체제. 물리적 자원을 간접적으로 할당받아 독립된 시스템처럼 동작
하이퍼바이저(Hypervisor)
- 물리 하드웨어와 가상 머신(Guest OS) 사이에서 자원을 중재하는 소프트웨어 레이어
- Type 1: 호스트 하드웨어에 직접 설치 (예: VMware ESXi)
- Type 2: 호스트 OS 위에 설치 (예: VirtualBox, VMware Workstation)
2. VM(가상머신)의 구조와 특징

- 완벽한 분리
하이퍼바이저 위에 게스트 OS를 통째로 올려 완전히 독립된 환경을 만든다.
- 장점
- 서로 다른 OS(예: Ubuntu와 Windows)를 동시에 구동할 수 있다
- 보안과 안정성이 높다(한 VM에 문제가 생겨도 다른 VM에 직접적인 영향을 주지 않는다)
- 단점
- 게스트 OS 전체를 구동하므로 무겁고, 부팅 시간이 길다
- VM 이미지는 용량이 크며 메모리, CPU 자원을 많이 사용한다
3. 컨테이너(Container)란 무엇인가
VM처럼 운영체제를 통째로 띄우지 않고, 호스트 OS의 커널을 공유하여 애플리케이션만 격리하는 방식이다. 이로 인해 훨씬 가볍고 빠른 가상 환경을 제공한다.
- 프로세스 단위 격리
실제로는 호스트 커널을 함께 쓰지만, 각 컨테이너마다 프로세스·네트워크·파일 시스템이 독립된 것처럼 보인다.
- 장점
- VM에 비해 훨씬 빠른 시작과 종료
- 적은 자원으로도 다수의 애플리케이션 운영 가능
- 애플리케이션별로 격리된 환경을 쉽게 만들 수 있다
- 단점
- 호스트 커널을 공유하기 때문에 보안 격리는 VM보다 취약할 수 있다
- 서로 다른 OS(리눅스·윈도우 등)를 동시에 쓰기는 어렵다 (커널 호환성 문제)
4. Docker란 무엇인가
컨테이너 기술을 쉽고 간편하게 쓸 수 있도록 만들어진 Go 언어 기반의 오픈소스 플랫폼이다. 컨테이너 표준처럼 널리 사용된다.
4.1 Docker의 구조

- Docker Daemon
- 이미지(Image)
- 컨테이너(Container)
4.2 Docker의 장단점
- 장점
- VM보다 훨씬 빠른 시작과 종료
- 자원을 적게 사용해 한 대의 서버에서 많은 애플리케이션을 돌릴 수 있다
- 개발 환경과 운영 환경을 일치시키기 쉬워 “내 PC에서는 잘 되는데?” 문제를 줄일 수 있다
- 단점
- VM만큼의 보안 격리가 아니므로, 호스트 커널과 직접 연계된다는 점에서 주의가 필요하다
- 호스트 OS가 윈도우인지 리눅스인지에 따라 호환성 문제가 생길 수 있다 (윈도우 도커는 내부적으로 VM을 사용)
Docker Daemon과 호스트 커널의 관계
Docker Daemon은 호스트 커널과 직접 대화하며, “컨테이너”라는 격리된 공간을 만들어낸다.
사실 컨테이너도 호스트 커널에서 돌고 있는 하나의 프로세스이지만, 아래와 같은 커널 기능으로 격리돼 있을 뿐이다.
- 네임스페이스(namespaces)
- cgroups(컨트롤 그룹)
- UnionFS(레이어드 파일시스템)
즉, 사용자가 docker run을 실행하면 Docker Daemon은 호스트 커널에 “새로운 프로세스를 띄워줘. 그리고 이 프로세스는 네임스 페이스·cgroups·파일 시스템 설정으로 격리해 줘”라고 요청한다.
호스트 커널은 이 요구에 맞춰 새로운 프로세스를 만들고, 이것을 “컨테이너”라고 부르게 된다.
5. Kubernetes(쿠버네티스)는 왜 필요한가
컨테이너가 많아질수록, 각각을 일일이 관리하기 어려워진다. Kubernetes는 이러한 컨테이너를 자동으로 배포·확장·복구해주는 오케스트레이션 도구이다.
5.1 Kubernetes 기본 개념

- Pod(파드): Kubernetes에서 컨테이너를 배포할 때 묶음으로 다루는 가장 작은 단위
- Node(노드): 물리 서버나 VM, 컨테이너가 실제로 동작하는 장치
- Service(서비스): 파드에 네트워크 접근을 제공하고 로드 밸런싱을 담당
- Deployment(디플로이먼트): 파드 갯수나 업데이트 전략 등을 설정하고, Kubernetes가 이를 자동으로 실행
5.2 Kubernetes 장점
- 자동 확장(Auto-scaling)
트래픽이나 부하가 늘면 파드를 자동으로 늘리고, 줄면 다시 줄인다.
- 자동 복구(Self-healing)
컨테이너가 죽으면 새로 띄운다. 노드 장애 발생 시 다른 노드로 파드를 이동한다.
- 무중단 배포(Rolling update / Rollback)
새로운 버전을 점진적으로 배포하고, 문제가 생기면 빠르게 롤백한다.
6. VM vs 컨테이너 vs Kubernetes
| 구분 | VM(가상머신) | 컨테이너 (예: Docker) | Kubernetes (오케스트레이션) |
|---|---|---|---|
| 구동 방식 | Host OS 위 하이퍼바이저 + Guest OS | Host OS 커널 공유(프로세스 단위 격리) | 다수 컨테이너를 Node 단위로 배포·관리 |
| 장점 | 완벽한 분리(게스트 OS 단위), 보안, 이질적 OS 동시 구동 | 빠른 실행, 경량, 자원 효율, 개발·운영 환경 일치 | 자동 확장, 자동 복구, 무중단 배포, 대규모 운영 |
| 단점 | 무겁고 느림, VM 이미지 커짐, 부팅 오래 걸림 | 보안 격리 제한(커널 공유), OS 호환성 제약 | 설정이 복잡, 초반 학습 곡선 높음 |
| 주요 사용 사례 | 보안이나 완전한 OS 격리가 필요한 경우, 이질적인 OS 동시 구동 | 마이크로서비스, 빠른 배포·종료가 필요한 서비스 | 대규모 컨테이너 인프라 운영, 자동화·확장성 필수 |
7. 결론
가상머신(VM)은 하이퍼바이저 위에 완전히 분리된 게스트 OS를 올려 격리한다. 보안과 격리 수준이 높지만, 무겁고 부팅 시간이 길다.
이와 달리 컨테이너(Container)는 호스트 OS 커널을 공유하므로 빠르고 가볍다. 다만 컨테이너 수가 많아지면 관리가 복잡해지는데, 이를 해결해주는 것이 Kubernetes다.
결론적으로, VM·컨테이너·Kubernetes는 각기 다른 장단점이 있다.
- VM: 완전한 OS 격리, 높은 보안성, 느린 부팅
- 컨테이너: 빠른 실행, 적은 자원 사용, 격리 수준 다소 낮음
- Kubernetes: 대규모 컨테이너 자동화·복구·배포
소규모 프로젝트라면 VM이나 Docker만으로도 충분할 수 있다.
빈번한 배포와 대규모 트래픽이 예상된다면 Docker+Kubernetes 조합이 유리하다.
프로젝트 요구 사항을 잘 파악하고, VM과 컨테이너, Kubernetes 중 적절히 선택해 최적의 인프라를 구축하면 된다.
참고
https://89douner.tistory.com/95