쿠버네티스를 공부하다가 기본적인 도커에 대해서도 이해도가 있어야 편할 것 같아 정리해본다.
1.Docker와 가상화(하이퍼바이저) 차이
1. 가상화 이전
- 한 대의 서버 → 하나의 운영체제(OS) → 하나의 프로그램만 실행
- 안정적이지만, 사용하지 않는 자원(CPU·메모리·디스크)은 그대로 낭비
- 즉, 안정성은 높으나 자원 활용 효율이 낮음
2. 가상화 기술의 등장
- 하이퍼바이저 기반 가상화 출현 → 물리 서버를 논리적으로 분할
- 여러 개의 독립된 VM(Virtual Machine) 실행 가능
- 각 VM은 자체 OS + 애플리케이션을 가짐
- 물리 서버 하나로 마치 여러 대의 서버를 운영하는 효과
3. 하이퍼바이저(Hypervisor)란?
- 호스트 시스템 위에서 다수의 게스트 OS를 실행할 수 있게 해주는 소프트웨어
- 하드웨어 자원을 가상화하여 VM에 할당
- 하드웨어와 VM 사이에서 중간 관리자 역할 수행
- VM의 실행·격리·모니터링 담당
3.1 네이티브 하이퍼 바이저
네이티브 하이퍼 바이저는 하드웨어를 직접 제어하기에 효율적인 자원 사용과, 별도의 호스트 OS설치가 없기에 오버헤드가 적다.
그러나, 각각 사용하고자하는 드라이버를 세팅하는 것 자체가 어려운 점이 있다.

3.2 호스트형 하이퍼 바이저
호스트형 하이퍼 바이저는 호스트 OS 위에서 실행되며, 하드웨어 자원을 VM 내부의 게스트 OS에 에뮬레이트 하는 방식으로 오버헤드가 크다.
그러나, 게스트 OS 종류(window, linux)에 대한 제약이 없고 구현이 다소 쉬워 가장 많이 사용하는 방식이다.

3.3 하이퍼 바이저 구조
결론적으로 하이퍼바이저에 구동되는 VM은 VM마다 독립된 가상 하드웨어 자원을 할당받는다.
논리적으로 분리되어 있어 VM 간에 영향도가 없고, 각 다른 OS 사용할 수 있는 점이 있다.
도커도 이러한 가상화 기술에서 나온 컨테이너 가상화 기술이다.

2. 컨테이너 가상화 vs 기존 가상화

1. 공통점
- 기본 하드웨어 위에 격리된 환경을 만들어 애플리케이션을 실행
- 서로 다른 애플리케이션이 간섭하지 않도록 분리된 실행 공간 제공
2. 컨테이너 (Docker)
- 하이퍼바이저, 게스트 OS 불필요 → 호스트 OS 커널 공유
- 애플리케이션 실행 = 컨테이너 이미지 배포만 하면 됨
- 컨테이너 내부 프로세스는 호스트에서 확인 가능 (커널 공유)
- 전체 OS 불필요 → 매우 가볍고 빠르게 실행
- 실행 속도: 수 초 이내
3. 가상 머신 (VM)
- 하이퍼바이저 위에서 동작, 각 VM마다 게스트 OS 필요
- 애플리케이션 실행 절차:
- VM 생성 및 자원 할당
- 게스트 OS 부팅
- OS 위에서 애플리케이션 실행
- 애플리케이션 격리 수준은 높지만, OS를 포함해야 해서 무겁다
- 실행 속도: 수 분 이상
- 컨테이너보다 리소스 차지 큼 (게스트 커널 + OS 프로세스 포함)
3. 컨테이너 격리 원리 및 Host 작동 원리

1. 컨테이너 격리 원리
-
cgroup (Control Groups)
- CPU, 메모리, 네트워크 대역폭, 디스크 I/O 등
프로세스 그룹의 시스템 리소스 사용량을 제한/관리하는 기술
- 예: 특정 애플리케이션이 CPU를 과도하게 쓰면 cgroup으로 제한 가능
-
namespace
- 프로세스를 독립된 환경에서 실행되도록 격리하는 기술
- PID, 네트워크, 파일시스템, 마운트 포인트 등을 분리
- 경량 프로세스 가상화 → 마치 별도 OS처럼 동작
컨테이너는 cgroup으로 리소스 제한, namespace로 환경 격리하여
호스트 커널 위에서 독립된 실행 공간을 제공한다.
2. MacOS/Windows에서 Docker 사용 시 의문
- 우리가 쓰는 Host OS는 보통 MacOS나 Windows
- 그런데 cgroup과 namespace는 리눅스 커널 기능
- "그렇다면 Mac/Windows 환경에서 Docker가 어떻게 가능할까?" 라는 궁금증이 생김
3. Docker의 실제 동작 방식
-
Docker는 결국 리눅스 환경에서만 네이티브 동작
-
MacOS/Windows에서 Docker Desktop을 실행하면 내부적으로 경량 리눅스 VM이 뜬다.
-
이 VM 위에서 Docker 엔진(containerd + runc)이 동작하고,
→ 리눅스 커널의 cgroup과 namespace를 활용해 컨테이너를 격리
4. Docker Image -> Container 과정
1. Docker 이미지란?
- 프로그램 실행에 필요한 모든 것 포함
- 컨테이너 시작 시 실행되는 명령어
- 파일 스냅샷(예: 스프링 부트 실행용 jar 파일 등)
2. 컨테이너 생성 과정
docker run <이미지> 실행
- 컨테이너가 생성되고, 이미지의 파일 스냅샷을 컨테이너 디스크에 복사
- 이미지에 정의된 명령어를 실행하여 애플리케이션 시작
