Docker와 Hypervisor

00_8_3·2022년 9월 3일
0

도입부

도커의 문서를 읽는 도중 CFS라는 스케쥴러가 기본값이라고 한다.
나는 Windows에서 WSL2를 이용하여 Docker를 사용 중에 있는데

어떠한 스케쥴링 방식을 쓰는 것 인지 궁금하여 찾아 보았습니다.

https://docs.docker.com/config/containers/resource_constraints/#cpu

Hypervisor란?

하이퍼바이저는 가상머신(Virtual Machine)을 생성하고 구동하는 소프트웨어 입니다. (VMM이라고도 함)

하이퍼바이저로 사용되는 물리 하드웨어를 호스트
리소스를 사용하는 여러 VM을 게스트 라고 합니다.

하이퍼바이저에는 타입 1과 타입 2, 두 가지 유형이 있습니다.

타입 1

  • 타입 1의 하이퍼바이저의 경우 호스트 하드웨어에서 직접 실행되어
    하드웨어를 제어하고 게스트 VM을 관리합니다.

  • 가상 시스템 또는 게스트 운영 체제 중 문제가 발생하더라도 다른 게스트 운영체제에 영향을 미치지 않습니다.

  • MS의 Hyper-V, VMware 등등.

기존 Hyper-v와 wsl2를 사용하는 경우 VMware 또는 VirtualBox와 같은 서드파티 하이퍼바이저와 동시 실행이 불가능 했지만 MS Hyper-V APIs가 공개되면서 동시성이 지원됩니다.

https://github.com/MicrosoftDocs/WSL/issues/719
https://docs.microsoft.com/en-us/virtualization/api/
https://blogs.vmware.com/workstation/2020/05/vmware-workstation-now-supports-hyper-v-mode.html

타입 2

호스트 된 하이퍼바이저라고 불리며 다른 Application과 마찬가지로 OS에서 실행됩니다.

  • 호스트 운영체제에 전적으로 의존합니다.
    즉, 운영체제의 문제가 시스템에 영향을 줍니다.

  • VitualBox, Parallels Desktop for Mac

WSL2와 Docker

Windows Subsytem Linux 2
https://docs.microsoft.com/en-us/windows/wsl/about

보통 우리가 도커라고 부르는 것은 Docker Client
CLI나 Compose를 지원합니다.
여기서 중요한 점은 Docker는 Linux 환경에서 작동 되는데

Linux 환경을 손쉽게 제공 해주는 것이 Docker Desktop입니다.

Hyper-v + WSL2 위에서 동작.

Docker Desktop은 GUI, k8s, Plugin 등등 제공.

얼마 전 유료화 하겠다고 했던 것이 Docker Desktop.
Docker 자체는 오픈소스입니다.

Docker Desktop을 사용하지 않고 Docker 사용하는 방법은 다음 링크를 참고하세요.
https://blog.bsk.im/2021/09/07/macos-docker-without-docker-feat-minikube-ko/

그래서 결론?

Windows에서 Docker Container는 리눅스의 CFS를 사용하는가요?

Completely Fair Scheduler

하이퍼바이저가 각각의 게스트 OS의 명령을 하드웨어가 이해 가능한 하나의 명령어로 번역을 해준다고 합니다.

따라서 Docker(리눅스)의 CFS가 Hyper-v에 의해 어떻게 번역되는가에 따라 다르다 생각듭니다.

정확하지 않은 제 주관적인 생각입니다. 아시는 분은 댓글 부탁드려요.

Docker Container의 가상메모리 또는 메모리의 Page 크기는 누가 결정하는가요?

메모리는 운영체제에서 관리한다.
하이퍼바이저의 게스트 머신으로 WSL이 있다.
WSL2의 커널이 메모리를 관리한다.
즉, WSL이 메모리 페이지 사이즈도 관리한다.

페이지 사이즈 확인.

윈도우

다음 C 스니펫을 이용해 얻을 수 있습니다.

#include <stdio.h>
#include <windows.h>

int main(void)
{
	SYSTEM_INFO si;
	GetSystemInfo(&si);

	printf("The page size for this system is %u bytes.\n", si.dwPageSize);

	return 0;
}

출처 : https://en.wikipedia.org/wiki/Page_%28computer_memory%29#Windows-based_operating_systems

리눅스

wsl2에서 아래 명령어로 확인가능.
4096 출력. (bytes 단위)

$ getconf PAGESIZE

출처

https://www.redhat.com/ko/topics/virtualization/what-is-a-hypervisor#%EA%B0%9C%EC%9A%94

0개의 댓글