Docker와 VM 차이
Docker와 VM 차이에 대해서 적어봤습니다.
주제 선정 이유
프로젝트를 진행하면서 개발 환경을 구성하다 보면 로컬 환경과 서버 환경의 차이로 인해 애플리케이션이 정상적으로
실행되지 않거나, 팀원마다 사용하는 OS나 라이브러리 버전이 달라 동일한 코드가 다르게 동작하는 상황을 종종
경험하게 되는데 이러한 문제는 특히 협업 과정에서 빈번하게 발생하며, 환경 차이로 인한 오류를 해결하는 데 불필요한 시간이 소요되기도 합니다.
예를 들어 어떤 팀원은 macOS에서 개발하고 다른 팀원은 Windows에서 개발하는 경우, 동일한 애플리케이션이라도
의존성이나 실행 환경이 달라 문제가 발생할 수 있어서 이러한 문제를 해결하기 위해 개발 환경 자체를 하나의 패키지로 묶어 동일한 환경에서 실행할 수 있도록 하는 기술이 등장하게 되었고, 그중 대표적인 것이 Docker입니다.
처음에는 Docker를 VM과 유사하게 애플리케이션을 실행하기 위한 가상 환경 정도로 이해하기 쉽지만, 실제로는 내부 구조와 동작 방식에서 VM과는 큰 차이가 존재한다는 점을 알게 되며 이러한 차이는 단순한 구현 방식의 차이를 넘어
성능, 자원 효율, 실행 방식 등 다양한 측면에 영향을 미치게 됩니다.
그래서 이번 글에서는 Docker와 VM의 구조적 차이와 동작 방식을 비교하고, 이러한 차이가 실제 사용 환경에서 어떤
의미를 가지는지를 중심으로 정리해보고자 합니다.
Docker랑 VM이 뭘까?
VM (Virtual Machine)
가상 머신은 하나의 물리 서버 위에서 여러 개의 운영체제를 동시에 실행하기 위한 가상화 기술입니다.
VM은 Hypervisor라는 가상화 계층을 통해 물리 서버의 CPU, Memory, Disk 같은 리소스를 나누어
여러 개의 가상 컴퓨터를 만들게 됩니다.
Physical ServerHypervisorGuest OSApplication
각 VM은 독립적인 운영체제를 포함하고 있기 때문에 완전히 분리된 환경을 만들 수 있다는 장점이 있습니다.
예를 들어 하나의 서버에서 Ubuntu와 Windows를 동시에 실행하는 것도 가능하며, 각각의 VM은 서로 영향을 주지 않고 독립적으로 동작하지만 VM은 운영체제 자체가 포함되기 때문에 리소스 사용량이 많고 실행 속도가 상대적으로 느릴 수 있다는 특징이 있습니다.
Docker
Docker는 VM과 달리 운영체제를 가상화하는 방식이 아니라 애플리케이션 실행 환경만 분리하는 컨테이너 기반 가상화 기술입니다.
Physical ServerHost OSDocker EngineContainer (Application + Dependencies)
컨테이너는 Host OS의 Kernel을 공유하면서 실행되기 때문에 VM처럼 별도의 Guest OS를 포함하지 않습니다.
VM보다 훨씬 가볍다- 컨테이너 실행 속도가 빠르다
- 동일한 실행 환경을 쉽게 재현할 수 있다
예를 들어 애플리케이션 실행에 필요한 라이브러리, 설정 파일, 실행 환경 등을 Docker Image로 만들어두면 어떤
서버에서 실행하더라도 동일한 환경에서 애플리케이션을 실행할 수 있습니다.
구조적인 차이
VM과 Docker의 가장 큰 차이는 운영체제를 어떻게 다루느냐에 있는데 VM은 각각의 가상 머신이 자체 OS를 가지는
구조이고, Docker는 하나의 OS 커널을 공유하면서 애플리케이션 실행 환경만 격리합니다.
| 구분 | VM | Docker |
|---|---|---|
| 가상화 방식 | OS 단위 가상화 | 애플리케이션 단위 가상화 |
| 운영체제 | 각 VM마다 Guest OS 포함 | Host OS 커널 공유 |
| 리소스 사용량 | 상대적으로 큼 | 상대적으로 적음 |
| 실행 속도 | 부팅 시간이 비교적 김 | 컨테이너 실행 속도가 빠름 |
| 환경 격리 | 완전히 독립된 환경 제공 | 프로세스 단위 격리 |
| 환경 재현성 | 환경 설정 필요 | 이미지 기반으로 동일 환경 재현 쉬움 |
Docker가 가벼운 이유
Docker가 VM보다 가볍게 동작하는 이유는 운영체제를 새로 실행하지 않기 때문인데 VM은 각각의 가상 머신이
Guest OS를 포함하기 때문에 운영체제를 부팅하는 과정이 필요하며, 이로 인해 Memory와 CPU 리소스를 많이
사용하게 되지만 Docker는 Host OS의 커널을 공유하면서 실행되기 때문에 별도의 OS를 실행할 필요가 없습니다.
Namespace
프로세스가 볼 수 있는 시스템 자원을 분리하는 기능인데 예를 들어 하나의 서버에서 여러 개의 컨테이너가 실행되면
각각의 컨테이너는 다음과 같은 자원을 독립적으로 사용하게 됩니다.
ProcessNetworkFileSystemUser
이러한 기능 덕분에 각 컨테이너는 하나의 독립된 시스템처럼 동작하게 됩니다.
cgroup
CPU, Memory, Disk 같은 리소스 사용량을 제한하고 관리하는 기능인데 이걸 통해서 각 컨테이너가 사용할 수 있는
리소스를 제한할 수 있으며, 특정 컨테이너가 과도하게 리소스를 사용하는 것을 방지할 수 있습니다.
- 컨테이너 A →
CPU2코어 사용 - 컨테이너 B →
Memory1GB 제한
이처럼 Docker는 namespace를 통해 환경을 격리하고, cgroup을 통해 리소스를 관리하기 때문에 VM보다 훨씬 가볍게 동작할 수 있습니다.
그래서 어떻게 쓰라고?
VM과 Docker는 서로 완전히 대체되는 기술이라기보다 목적이 다른 가상화 기술이기 때문에 어떤 상황에서 사용하는지 중요합니다.
VM이 적합한 경우
VM은 운영체제 단위의 가상화이기 때문에 완전히 독립된 환경이 필요한 상황에서 사용됩니다.
- 서로 다른 운영체제를 동시에 실행해야 하는 경우
- 강한 격리 환경이 필요한 인프라 환경
- 운영체제 수준에서 테스트가 필요한 경우
예를 들어 하나의 서버에서 Linux와 Windows 서버를 동시에 운영해야 하는 경우라면 VM 방식이 더 적합합니다.
Docker가 적합한 경우
Docker는 애플리케이션 실행 환경을 빠르게 만들고 배포하는 데 강점이 있습니다.
- 개발 환경과 운영 환경을 동일하게 유지하고 싶은 경우
CI/CD환경에서 빠르게 배포해야 하는 경우- 마이크로서비스 아키텍처에서 여러 서비스를 독립적으로 실행해야 하는 경우
예를 들어 하나의 서버에서 API 서버, Redis, DB, 메시지 큐 같은 여러 서비스를 실행해야 하는 경우 Docker 컨테이너로 각각 실행하면 훨씬 가볍고 관리하기 쉬운 구조를 만들 수 있으며 또한 Docker Image를 사용하면 애플리케이션
실행 환경을 하나의 패키지로 관리할 수 있기 때문에 내 컴퓨터에서는 되는데 서버에서는 안 되는 문제를 크게 줄일 수
있습니다.
마무리
Docker와 VM의 차이를 정리하면서 느낀 핵심을 다시 정리해보면 다음과 같습니다.
VM은 운영체제 단위의 가상화를 통해 완전히 독립된 환경을 제공하지만 그만큼 리소스 사용량이 큽니다.Docker는OS Kernel을 공유하는 컨테이너 방식으로 애플리케이션 실행 환경만 격리하기 때문에 훨씬 가볍게
동작합니다.Docker는namespace와cgroup을 활용해 환경 격리와 리소스 관리를 수행하며 효율적인 애플리케이션 실행
환경을 제공합니다.




