본문 바로가기
컨테이너

컨테이너란 무엇인가? (VM vs Container)

by sangyeon 2021. 7. 26.
728x90

엔지니어로서 컨테이너의 첫 걸음을 시작하려고 한다.

컨테이너를 공부하기 위해 여기저기 검색해보았지만, 개념이 잘 이해가 되지 않아 이 공간에 이해하기 쉽도록 풀어 써보려고 한다.

나와 같이 헤매고 있는 사람들에게 큰 도움이 되기를 바란다.

도커(Docker)를 공부하기에 앞서 먼저 컨테이너에 대한 개념을 정립하는 것이 중요하다.

1. 컨테이너란?

리눅스 커널 기반의 기술인 cgroup과 namespace를 이용하여 < 격리된 공간 > 에서 프로세스가 동작하도록 하는 것을 뜻 한다.

벌써부터 어려워지기 시작하는데, 그럴 필요 없다.

먼저 cgroup과 namespace에 대해 알아보자.

1-1. cgroup (Control Group)

: 컨트롤 그룹이라고도 불리며, 자원 사용(CPU, 메모리, I/O, 네트워크 등)을 프로세스 단위로 제어할 수 있도록 하는 리눅스 커널 기능이다.

1-2. namespace (네임스페이스)

: 네임스페이스란, 시스템 리소스를 프로세스의 전용 자원처럼 보이게 하고 다른 프로세스와 격리시키는 리눅스 커널 기능이다.

아래 표는 네임스페이스의 6가지 항목을 나타낸다.

종류 내용
mnt 독립적으로 파일시스템을 마운트하거나 언마운트
pid 독립적인 프로세스 공간을 할당
net namespace간 network 충돌 방지
ipc 프로세스 간의 독립적인 통신통로 할당
uts 독립적인 hostname 할당
user 독립적인 사용자 할당

즉, 컨테이너는 위의 리눅스 커널 기능 이용하여 프로세스(컨테이너) 별로 리소스를 할당하여 어플리케이션을 동작하게 하는 기능이다.

 

아래 < 그림 1-1 > 은 컨테이너를 더 쉽게 이해할 수 있도록 도움을 줄 것이다.

그림 1-1, 왼쪽은 VM 오른쪽은 Container 환경이다.

 

2. VM과 컨테이너의 차이점

2-1. VM

VM의 경우에는 어플리케이션 하나를 실행하기 위해 VMware나 VBox같은 하이퍼바이저를 통해 호스트 OS 위에 다시 독립된 게스트 OS를 설치한다.

각각의 독립적인 게스트 OS는 독립적인 커널을 사용하기 때문에 서로 의존적이지 않지만, 게스트 OS의 I/O 기능이 호스트 OS를 거쳐서 이루어지기 때문에 속도가 느리다. 뿐만 아니라 게스트 OS 자체가 완전히 새로운 운영체제로 동작해야하기 때문에 아무리 가벼운 OS를 설치해도 용량이 GB 단위로 크고 무겁다.

2-2. 컨테이너

반면에, 컨테이너의 경우에는 하나의 어플리케이션을 실행하기 위해 Docker 엔진 위에 어플리케이션 실행에 필요한 바이너리 파일과 라이브러리만 존재하면 된다. (VM과 비교했을 때 상당히 가볍다, MB 단위)

Q. 그렇다면 컨테이너에서 어플리케이션을 서비스하기 위해 필요한 각종 시스템의 자원은 어떻게 구할까?

A. 그것은 바로 호스트 OS의 커널을 공유하여 사용한다.

이게 앞에서 컨테이너에 대해 설명한 이유이다.

즉, 각각의 컨테이너들은 호스트 OS의 커널을 공유하며, 호스트 OS 리눅스 커널 기능인 cgroup과 namespace를 사용하여 VM을 여러 대 띄운 것과 같이 각각의 컨테이너가 독립적으로 시스템 리소스를 할당할 수 있다.

바로 그 독립적인 시스템 리소스(디스크/메모리/CPU 등)를 이용하여 어플리케이션을 올린다.

* 오늘의 정리

- 컨테이너는 프로세스(어플리케이션)를 실행하기 위한 최소 단위이다.

- 어플리케이션을 실행하기 위한 시스템 리소스는 호스트 OS의 커널을 공유한다.

끝.

728x90