앞서 말한 도커를 사용하는 이유 중 다중 컨테이너에 대한 내용이 있다.
각각의 container가 실행하는 image에는 OS도 들어있다고 설명했다.
그렇다면 Docker는 OS를 여러 개 실행하는 것인가? 이는 VM과는 뭐가 다른 것인가?
1. Linux 기반의 Docker
도커는 LXC, 즉 Linux Container를 기반으로 만들어진 플랫폼이기에 이것의 명령어 또한 linux 기반이다.
앞서서 Container라는 것은 cut-down OS를 내장하는 환경을 구축한다고 했지만,
window 환경에서 Docker를 실행하려면 WSL2(Windows Subsystem for Linux)를 설치해야 한다.
왜냐하면 window에서는 linux 기반의 container를 native로 실행할 수 없기 때문이다.
linux의 커널을 실행하기 위해서 WSL 2라는 Hyperviser를 사용한다.
2. Hypervisor?
Hypervisor는 단일 물리적 머신에서 여러 가상 머신을 실행하는데 사용할 수 있는 소프트웨어이다.
물리적 컴퓨팅 리소스를 개별 가상 머신에 할당하는 것을 기준으로 Type1과 Type2 Hypervisor로 나뉜다.
- Type 1 (Baremetal) : 호스트 머신 위에서 하드웨어 리소스에 직접 액세스할 수 있다.
호스트 OS위에서 직접 동작하기에 overhead가 적다. WSL, Hyper-V가 대표 사례이다. - Type 2 (Hosted) : 호스트 OS 위의 소프트웨어 레이어 또는 어플리케이션으로 구동된다.
Type1에 비해 설치 및 구성이 편리하다.
WSL 2와 같은 경우, Type1이지만 경량화 된 Type 1 Hypervisor를 사용한다. ( https://news.ycombinator.com/item?id=25617528 )
3. VM vs Docker
공부해본 결과 Docker와 VM의 차이점의 핵심은 두 개인 것 같다.
- 호스트 OS의 완전성
- VM : 호스트 OS와 별개의 게스트 OS를 완전하게 가상화 한다. 즉, 각 VM이 자체적으로 독립적인 커널과 전체 운영 체제를 갖는다.
그렇기 때문에, VM 내에서 실행되는 어플리케이션은 VM이 속한 OS의 운영체제와만 상호작용하게 된다.- 각 VM이 호스트 OS와 완전히 독립된 환경을 제공하고, 그렇기에 보안적으로 우수한 면도 있다.
- Docker : 호스트 OS의 커널을 공유한다. 컨테이너 별도의 운영체제를 가상화하지 않는다.
- VM보다 경량화되고 빠른 환경을 제공한다.
- VM : 호스트 OS와 별개의 게스트 OS를 완전하게 가상화 한다. 즉, 각 VM이 자체적으로 독립적인 커널과 전체 운영 체제를 갖는다.
- 명시적으로 물리적 자원 할당
- VM : 하드웨어 자원을 명시적으로 할당 받는다.
Hypervisor를 통해서 물리적 하드웨어 자원을 게스트 OS에 할당하고, 각 VM은 할당된 자원 내에서만 작동- 고정된 자원 할당량을 가지므로, 자원이 부족하면 성능에 영향을 줄 수 있다.
- 혹여나 잉여자원이 발생한다고 하더라도, 이는 동적으로 다른 게스트 OS에 할당되지 않는다.
- Docker : 물리적으로 자원을 할당받지 않고, 호스트 OS의 자원을 동적으로 공유한다.
- 자원을 자유롭게 사용하다가 필요에 따라 제한을 설정할 수 있다.
- VM : 하드웨어 자원을 명시적으로 할당 받는다.
4. windows에서 Docker는 WSL2(type 1 hypervisor)를 쓰는데, 명시적 할당 아닌가?
WSL 2가 Docker와 가상화 기술 사이의 경계를 복잡하게 만들었다고 한다.
WSL 2는 리눅스 커널을 경량 가상 머신으로 실행하는 방식이다. Type 1 Hypervisor를 통해 가상화 되지만,
WSL 2는 동적 메모리 할당 기능을 제공한다고 한다. (https://docs.docker.com/desktop/wsl/)
차후 깊게 공부해볼만한 블로그 : https://tamalerhino.github.io/posts/docker-desktop-wsl2-deep-dive/
결론) VM과 Docker, 둘의 차이점 정리(WSL 2 가 주는 애매함을 주지 않는 선에서)
- VM(Virtual Machine)
- Guest OS + Bins/Libs + App 로 환경을 정의
- OS 레벨을 포함한 모든 레벨에서 독립적인 어플리케이션 구동 환경 제공
- 리소스를 많이 사용한다. 그래서 무겁고 느린 편이다.
- Docker Container
- Bins/Libs + App 로 환경을 정의
- Bins/Libs 레벨 독립적 어플리케이션 구동 환경을 제공한다.
- 리소스를 적게 사용한다.
이번 글에서는 Docker가 다수의 컨테이너를 가상화하기 위해 사용하는 방식,
그리고 VM과는 그 부분이 어떻게 다른지를 알아보았다.
다음 글에서는 다중 컨테이너간 통신 방식에 대해 서술하겠다.
https://aws.amazon.com/ko/what-is/hypervisor/
'정보 > Dev' 카테고리의 다른 글
Github Action을 이용한 CI/CD Workflow (1) | 2024.10.24 |
---|---|
Docker (5) - CI/CD with Docker Workflow (3) | 2024.10.21 |
Docker (4) - docker private network (0) | 2024.10.20 |
Docker (3) - 다중 컨테이너를 묶어 정의하기 : docker-compose (0) | 2024.10.18 |
Docker (1) - Docker? (1) | 2024.10.15 |