Container, Process, 그리고 VM (번역)

Jay Jang·2022년 8월 2일
0

Docker

목록 보기
2/2
post-thumbnail

Introduction

medium 블로그
What is the difference between a process, a container, and a VM? | Jessica G을 번역, 참조했습니다.


"VM(Virtual Machine)container의 차이가 뭔데?" 라는 많은 궁금증이 있다.
그런데 내 생각에 더 중요한 질문은..

"process와 container의 차이가 뭔데?"

컨테이너가 주목받기 시작한 2013년으로 돌아가보면, "컨테이너는 작은 VM과 같다" 라는 설명을 흔히 들을 수 있었다.
이 말은 사람들이 VM 대신에 컨테이너를 사용했었으므로 타당했다.

하지만 개인적으론 기술적으로 더 적절한 설명은 컨테이너는 프로세스라는 것이다.

이 게시글은 프로세스란 무엇이고, 컨테이너란 무엇이며, 또한 VM이 무엇인지에 대해 설명할 것이다.

그 다음 이 세 가지를 비교할 것이다.


실제로, 컨테이너는 VM 같기도 하고, 또한 VM 같지 않기도 하다. 무엇에 중점을 두느냐에 따라 다르다.

이를 위해 두 가지 다른 기준이 존재한다.

  1. 각각의 기술이 어떤 문제를 해결하는가; 최종 사용자/시스템이 어떻게 상호 작용하는가.
    이는 "VM 같은 컨테이너"에 대한 이야기이다.
  2. 기술 구현 방식이 어떻게 다른가. 주로 각 기술이 OS에서 어떻게 분리되는지 자세히 살펴본다.
    이는 "VM과 다른 컨테이너"에 대한 이야기이다.

Overview


이 게시글의 이후 단락은 다음과 같이 구성된다.

  • 프로세스란 무엇이며, 우린 왜 프로세스를 필요로 하는지.
  • 컨테이너란 무엇이며, 어디에 쓰이는지.
  • VM(가상 머신)이란 무엇이며, 사용 사례는 무엇인지.
  • 프로세스를 컨테이너와 VM에 비교

What is a process?


프로세스는 실행중인 프로그램을 나타낸다(represent). 실행중인 프로그램의 인스턴스이다.
프로세스는 메모리와 데이터 구조 집합으로 구성된다.

커널은 이러한 데이터 구조를 사용하여 프로그램 상태에 대한 중요 정보를 저장한다.

What problem is a process solving? Why do we need them?


CPU는 한번에 한 개의 프로그램만 실행할 수 있으므로, CPU를 많은 프로그램과 공유해야 하며 작업 전환도 해야 한다.
CPU는 프로그램 실행 중 멈춘 부분을 기억해야 한다. 프로세스는 실행 중인 프로그램의 상태를 저장하는 추상화이다.

Isolation for a process


기본적으로 프로세스는 운영체제 자원으로부터 거의 격리(분리)되지 않는다.
예를 들어, 여러 서비스를 같은 포트에서 실행하려 하면 쉽게 오류가 발생할 수 있다. 프로세스에서 기본적으로 분리되는 두가지 주요 사항이 있다.

  1. 프로세스는 자체 메모리 공간을 가진다.
  2. 프로세스는 제한된 권한을 가진다. 프로세스는 프로세스를 생성한 사용자와 동일한 권한을 가진다.

What is a container?


컨테이너가 무엇인지에 대해 많은 정의가 있다.

Nigel Poulton은 "자원 사용이 제한된 OS의 격리(분리)된 영역"이라고 말했고,

위키피디아에서는 "컨테이너는 OS 수준 가상화의 총칭이다. ...Docker, Ixc 및 rkt를 포함한 여러 가지 구현이 있다." 라고 설명하고 있으며,

Unix/Linux 시스템 관리자 책에서는 컨테이너가 개인 루트 파일 시스템과 프로세스 네임스페이스로 제한된 프로세스들의 분리된 그룹이라고 설명하고 있다.

컨테이너에 대한 내 개인적인 정의는 프로세스가 자신의 개별 장치에서 실행되는 것처럼 행동할 수 있는(pretend) 몇 가지 훌륭한 커널 기능을 가진 프로세스 그룹이다.
호스트 시스템은 컨테이너가 실제로 프로세스임을 알고 있지만, 컨테이너는 컨테이너 스스로가 별도의 시스템인것처럼 여긴다.

이를 가능하게 하는데는 다음과 같은 훌륭한 커널 기능이 있다.

  • namespaces: namespace는 컨테이너가 완전히 별개의 장치인것처럼 보이고 느껴지도록 하는 기능이다.
  • cgroups: 커널에서 프로세스를 그룹화하고 해당 그룹에 대한 리소스를 제한하는 방법이다. 2006년 구글에서 개발되었으며 "프로세스 컨테이너"라고 처음 불렸다.
  • capabilities: 프로세스에 대해 활성화 또는 비활성화 할 수 있는 수퍼유저 권한 목록이다.

커널에서 내가 가장 좋아하는 기능은 네임스페이스이다. 서로 다른 리소스에 대해 7개의 서로 다른 리눅스 네임스페이스가 있다. Linux man 페이지에 namespace에 대한 훌륭한 설명이 있다:

네임스페이스는 글로벌 시스템 자원을 추상화함으로써 네임스페이스 내의 프로세스에 글로벌 자원의 분리된 인스턴스가 있는 것처럼 보이게 한다.

컨테이너가 독립된 기계인 것처럼 보이게 하기 때문에 네임스페이스를 가장 좋아한다.
7가지 네임스페이스 유형은 컨테이너에서 자체 분리된 인스턴스를 가져오는 7가지 리소스와 관련이 있다.

  1. cgroups - 루트 디렉토리를 분리한다.
  2. IPC - 프로세스간 통신을 분리한다.
  3. Network - 네트워크 스택을 분리한다.
  4. Mount - mount point를 분리한다
  5. PID - 프로세스 ID들을 분리한다.
  6. User - 사용자, 그룹 ID들을 분리한다.
  7. UTS - 호스트 이름과 도메인 이름을 분리한다

이 부분에 대해 더 자세한 설명을 듣고 싶다면, Wes Gigbees의 "What is a Container?" 강좌의 "Containers and Images: The Big Piture."를 들어볼 것을 강추한다.


What problem is a container solivng?


컨테이너를 사용하면 하나의 서버에서 많은 애플리케이션을 실행할 수 있지만, 유사 격리(pseudo-isolated) 환경이다.

컨테이너는 자체 OS인 것처럼 가장하며, 분리된 환경에서 프로세스 그룹을 실행할 수 있다.
컨테이너는 호스트 시스템과 동일한 OS에서 실행되므로 VM보다 리소스 오버헤드가 적다.

Container Isolation 컨테이너 분리(격리)

요약하자면, 컨테이너를 만들기 위해 c그룹을 사용하여 프로세스를 네임스페이스로 그룹화한다.

cgroups는 그룹에 사용할 수 있는 리소스(ex: CPU, 메모리)를 제한한다.

네임스페이스가 7개의 서로 다른 리소스(즉, 네트워크 스택, hostname, mount, 등)의 분리된 인스턴스를 생성함에 따라 컨테이너는 별도의 운영 체제라는 인상을 준다.


What is a virtual machine(VM)?


"virtual machine"은 원래 Popek과 Goldberg에 "실제 컴퓨터 장치의 효율적이고 분리된 복제품"으로 정의되었다.

VM은 서버 가상화의 한 유형이다.

VM에 대해서 이야기하자면 1) 하이퍼바이저 및 2) 실제 VM(게스트 OS)과 같은 몇 가지 중요한 부분이 있다.

하이퍼바이저는 VM을 실행하는 소프트웨어이다. 하이퍼바이저는 하드웨어와 VM 사이의 추상화 계층을 제공하여 더 많은 유동성을 제공하고 호스트의 하드웨어 리소스를 더 잘 사용할 수 있도록 한다.

VM Isolation


VM은 호스트의 OS와 완전히 분리되며 하드웨어만을 공유한다.

프로세스와 컨테이너 모두 호스트 OS에 의존하여서, VM의 격리(분리) 수준은 프로세스와 컨테이너보다 훨씬 더 높다.

이 완전한 격리(분리)는 장단점이 있다는 것을 기억하자. 더 많은 자원을 사용한다.
따라서 더 분리되고 안전하지만 자체 OS를 실행하는 데 더 많은 호스트 자원을 사용한다.

관련하여 더 자세한 설명을 원한다면 Nigel PoultonDocker Containers - The Big Picture 강좌의 "What are Containers?" 섹션을 적극 추천한다.


Process vs Container vs VM


기술 구현을 중점적으로 본다면 컨테이너가 VM이라기보다는 프로세스에 가깝다고 말하는 것이 더 적절하다.

그러나 유즈 케이스와, 최종 사용자와 프로덕트가 상호 작용하는 방식을 중점적으로 본다면 컨테이너는 하나의 서버에서 많은 애플리케이션을 실행할 수 있는 격리된 환경을 제공하는 동일한 문제를 해결한다는 점에서 VM에 가깝다.

기술이 구현되는 방식을 통해 호스트 시스템으로부터의 분리 수준은 다음 사항을 평가하는 주요 측면이다.

  • 프로세스는 운영 체제(OS) 레벨에서 기본 분리가 거의 없으며, 주로 분리된 메모리 공간과 사용자 권한만 있다.
  • 컨테이너는 프로세스(또는 프로세스 그룹)이지만 일반 프로세스보다는 OS로부터 분리(격리)되는 레벨이 높다. 그러나 VM보다는 분리 수준이 낮으며 보안 수준이 낮다.
  • 가상 머신은 OS로부터 완전히 분리되므로 호스트의 하드웨어 위에 완전한 새 OS를 생성한다.
    더 많은 자원을 사용하는 대신 VM을 실행하여 완전한 분리를 가질 수 있다.

문제 해결 측면에서 살펴보면 최종 사용자/최종 시스템의 상호작용하는 방법을 평가할 수 있다.

  • 프로세스: CPU는 실행 중인 프로그램에 대한 상태를 저장하기 위한 구성, 즉 프로세스가 필요하다.
  • 컨테이너: 응용프로그램을 실행할 분리(격리)된 환경을 만든다.
  • VM: 동일한 호스트 시스템에서 서로 다른 운영 체제를 실행하고 완전히 분리된 환경에서 여러 애플리케이션을 실행할 수 있는 방법을 제공한다.

따라서 컨테이너는 프로세스, VM과 비슷하지만, 비슷하지 않다. 어디에 초점을 맞추고 있는지에 따라 다르다.


REFERENCE


https://jessicagreben.medium.com/what-is-the-difference-between-a-process-a-container-and-a-vm-f36ba0f8a8f7#:~:text=Processes%20have%20little%20default%20isolation,of%2Dthe%2Dmill%20process

profile
그때는맞고지금은틀리다

0개의 댓글