선요약
- VM은 GuestOS를 각각 할당하고, Docker는 GuestOS를 할당하지않는다.
- 그러나 프로세스를 돌리기 위해서는 Kernel이 필요한데, VM에서는 각각의 GuestOS를, Docker에서는 공유된 Linuxkernel을 사용한다.
- 사진에서 보이는 Linuxkernel은 사실 DockerEngine이고, DockerEngine은 VM이라서 OS를 가질수있다(LinuxOS를 사용한다)
- Linuxkernel의 controlgroups && namespace기능으로 가상의 벽을 만들어서, DockerContainers은 각각의 프로세스를 가졌다.
Virtual Machine (가상환경)
가상화 기술은 대체로 하이퍼바이저 기반의 가상화방식을 사용한다.
하이퍼바이저는 논리적으로 분할된 공간에서, VM이라는 독립된 가상환경을 만들고, 호스트시스템에서 VM에 깔린 게스트OS를 구동및 모니터링 하는 역할이다
- VM : 분할공간에서의 가상환경
- Host System OS : 서버OS
- GuestOS : 서버OS에서 띄운 VM의 OS
- Hypervisior : 게스트OS를 구동 및 모니터링
논리적으로 분할된 공간에서, 독립된 가상의 하드웨어를 할당받았으므로 VM은 서로에게 어떠한 영향도 미치지않는다.
하나의 가상환경에서 에러가 발생해도, 다른 가상환경들까지 피해가가지않는다는것이다.
Docker, VM의 차이
쉽게말해서 VM은 GuestOS를 가지고있고, Docker는 GuestOS를 가지지 않는다.
VM은 하나씩 늘릴때마다 GuestOS자원을 할당해주어야하는 반면
Docker는 어플리케이션을 구동하는데 필요한 모든 패키지만 있으면 컨테이너를 구동시킬 수 있다
Docker의 작동원리
Docker 컨테이너는 HostOS의 커널을 공유한다.
커널이란 하드웨어 자원을 관리하고, 하드웨어와 프로세스 사이의 인터페이스 역할을 수행하는 OS의 핵심 구성요소다. 컴퓨팅 자원을 가상화시키고, 이를 프로세스에 할당한다.
Docker에서는 하나의 리눅스커널을 공유하고있고, 이때문에 Host에서도 Container내부를 확인할수 있다
Docker의 독립공간
Host에서 Container프로세스를 확인할수 있는데, 어떻게 만들었을까?
Linuxkernel의 control groups과 namespace기능을 사용하여 구현을 했고
해당 기능을 사용해서 프로세스끼리 격리된 환경을 제공할수 있었다
그 덕분에 가상화에 대한 오버헤드가 적어져서, 동일한 용량이어도 훨씬 더 많은 애플리케이션을 배포할수 있었다
DockerContainers은 하나의 Linuxkernel을 사용한다.
만약 Host OS로 리눅스를 쓰는것이 아닌 macOS / Windows를 쓴다면 어떻게 컨테이너를 분리할수 있을까?
DockerEngine
DockerEngine은 사실 또다른 하나의 VM이다.
DockerEngine은 GuestOS를 가지고있고, GuestOS가 리눅스가 되고, 이 위에 쌓이는 컨테이너에는 GuestOS를 새로 깔지않는다.
DockerEngine은 사실상 리눅스기때문에, Linuxkernel을 가지고있고, 이때문에 추가적으로 GuestOS를 컨테이너에서 만들 필요가 없는것이다.
'CS지식' 카테고리의 다른 글
RAID 전략에 대해서 알아보기 (0) | 2022.11.12 |
---|---|
VM vs Container (0) | 2022.11.12 |
In-Memory 는 왜 쓸까? (0) | 2022.11.01 |
캐시메모리가 빠른 이유 (0) | 2022.07.04 |
파이썬이 C언어보다 느린 이유 (0) | 2022.07.02 |