이야기박스
What is the difference between a process, a container, and a VM? 본문
What is the difference between a process, a container, and a VM?
박스님 2022. 10. 10. 16:53
Overview
예전에 쿠버네티스 공부하면서 Container, VM 차이점을 간단하게 짚고 넘어간 적이 있습니다.
오래되기도 하였고 복습할 겸 여러 문서들 보는데 아래와 같은 포스팅도 보여 이번 포스팅을 작성하게 되었습니다.
Process
대학교때 배웠던 내용이 있죠. `실행 중인 프로그램 = 프로세스`
프로세스는 Memory, Data structre를 가지고 있죠. 예전에 제가 작성한 포스팅 참고를 하셔도 좋습니다.
1개의 cpu는 동시에 오직 하나의 프로세스만 돌릴 수 있습니다. 그래서 여러 프로세스가 하나의 cpu에서 동작하려면 서로 스위칭을 하여야 하죠.
# 프로세스의 제약 조건
- 자신만의 메모리 공간을 가짐
- 실행 유저와 동일한 권한을 가짐
- 그 이외에는 운영체제 레벨에서 리소스를 그다지 격리하지 않음. 예시로 포트 바인딩이 중복되면 에러를 뱉는 점..
Container
문제의 컨테이너.. 면접 때도 물어보면 사람마다 답변이 조금씩 다릅니다.
왜 그런가 생각을 해보면, 유명한 사이트에서 정의하는 내용이 다 조금씩 다르기 때문이 아닐까 싶습니다.
하지만 자세히 살펴보면 중복되는 키워드들이 있습니다.
격리된 커널, 가상화, 시스템
이중 격리된 커널을 가능하게 하는 요소들을 아래와 같이 정의할 수 있습니다.
# namespaces
a feature of the Linux kernel that partitions kernel resources such that one set of processes sees one set of resources while another set of processes sees a different set of resources.
# cgorups
a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, network, etc.) of a collection of processes.
# capabilites
A list of the superuser privileges that can be enabled or disabled for a process.
컨테이너를 사용했을 때의 장점은 어떤 것이 있을까요?
하나의 서버에서 여러 서비스를 생성하는 경우, 각 컨테이너는 자체가 하나의 운영체제인 것처럼 보이게 할 수 있습니다.
그러므로 각 컨테이너 내 서비스(프로세스)가 위와 같은 격리된 환경에서 프로세스 그룹을 실행할 수 있죠. 위 프로세스 제약조건 예시의 포트 바인딩 문제도 이러한 프로세스 그룹 격리고 해결할 수 있습니다.
또한 호스트 시스템의 OS에서 실행되기 때문에 VM보다 가벼운 점을 장점으로 들 수 있을 것 같습니다.
VM
Virtual Machine; Hypervisor위에서 실행되는 GuestOS.
하이퍼바이저는 VM과 하드웨어 사이에 추상화 계층을 제공합니다.
VM은 호스트로부터 하드웨어 자원만 공유받기 때문에, Process, Container보다 높은 수준의 격리를 제공합니다.
하지만 그렇기 때문에 더욱 무겁죠.. 자원을 더 많이 소모하게 됩니다.
Container + alpha
컨테이너는 운영체제 레벨에서 격리가 되는 것이 아니기 때문에, 호스트 OS에서도 프로세스를 확인할 수 있습니다.
예시로 도커에서 샘플 앱으로 자주 사용하는 `docker/getting-started` 이미지를 활용하였습니다.
$ docker run -d -p 80:80 docker/getting-started
80 포트로 바인딩하고, LISTEN 되고 있는 해당 서비스를 찾아봅니다.
$ netstat -anv | grep LISTEN | grep "80"
tcp46 0 0 *.80 *.* LISTEN 131072 131072 5356 0 0x0100 0x00000006
발견된 5356 pid를 한번 검색해보겠습니다.
$ ps 5356
PID TT STAT TIME COMMAND
5356 ?? S 13:35.20 /Applications/Docker.app/Contents/MacOS/com.docker.backend -watchdog -native-api
이런 식으로 완전 격리가 아니기 때문에 호스트 OS에서도 확인이 가능하긴 합니다.
Review
오랜만에 기초 지식들 복습을 해봤습니다. 최대한 간략하게 작성해보려고 하다 보니, 부족한 내용이 많을 수 있습니다.
부족한 내용은 댓글을 통해 요청 주시거나, 직접 내용을 작성해주셔도 좋을 것 같습니다.
포스팅 대표 이미지는 무엇으로 할까 고민하다가 만만한 도커 아이콘으로 결정하였습니다. ㅎㅎ
'Computer & Data > Orchestration' 카테고리의 다른 글
Network Containers (0) | 2022.10.23 |
---|---|
Kubernetes. Skaffold를 활용하여 개발환경을 꾸려보자 (0) | 2022.05.19 |
Kubernetes. 고급 스케줄링 (1) | 2022.01.12 |
Kubernetes. 소스 IP 주소 구하기 (0) | 2020.06.29 |
Kubernetes. Ingress and TLS Setting (0) | 2020.01.28 |