-
도커와 VM의 차이를 통한 컨테이너 이해Cloud/Docker 2021. 4. 14. 00:14
본 글은 "따라하며 배우는 도커와 CI환경" 강좌를 토대로 작성되었습니다.
가상화 기술 나오기 전
- 한대의 서버를 하나의 용도로만 사용
- 남는 서버 공간 그대로 방치
- 하나의 서버에 하나의 운영체제, 하나의 프로그램만을 운영
- 안정적이지만 비효율적
하이퍼 바이저 기반의 가상화 출현
- 논리적으로 공간을 분할하여 VM이라는 독립적인 가상 환경의 서버 이용 가능
- 하이퍼 바이저는 호스트 컴퓨터에서 다수의 게스트 OS를 동시에 실행할 수 있게 하는 소프트웨어이자, 하드웨어를 가상화하면서 하드웨어와 각각의 VM을 모니터링하는 중간 관리자다.
- 하이퍼 바이저 종류
- native
- 하이퍼 바이저가 하드웨어를 직접 제어하여 자원을 효율적으로 사용 가능.
- 별도의 호스트 OS가 없어 오버헤드가 적다.
- 여러 하드웨어 드라이버를 세팅해야 하므로 설치가 어렵다.
- hosted
- 일반적인 소프트웨어처럼 호스트 OS 위에서 실행된다.
- 하드웨어 자원을 VM 내부의 게스트 OS에 에뮬레이트 하는 방식으로 오버헤드가 크다.
- 게스트 OS 종류에 대한 제약이 없고 구현이 다소 쉽다.
- native
- 하이퍼바이저에 의해 구동되는 VM은 각 VM마다 독립된 가상 하드웨어 자원을 할당 받는다. 논리적으로 분리되어 있어 한 VM에 오류가 발생해도 다른 VM으로 퍼지지 않는다는 장점이 있다.
도커와 VM
공통점
도커 컨테이너와 가상 머신은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법이다.
차이점
컨테이너는 하이퍼바이저의 게스트 OS가 필요하지 않아 더 가볍다.
또 어플리케이션을 실행할 때, 컨테이너 방식에서는 호스트 OS 위에 어플리케이션의 실행 패키지인 이미지를 배포하기만 하면 된다.
반면 VM은 어플리케이션을 실행하기 위해서 VM을 띄우고 자원을 할당한 다음, 게스트 OS를 부팅하므로 훨씬 복잡하고 무겁게 실행해야 한다.
도커 컨테이너에서 돌아가는 애플리케이션은 같은 호스트의 다른 컨테이너와 동일한 커널을 공유한다.
컨테이너 내부에서 실행되는 프로세스는 호스트 시스템(모든 프로세스를 나열할 수 있는 권한 있음)에서 볼 수 있다.
예를 들어, 도커와 함께 MongoDB 컨테이너를 시작하면 호스트(도커 X)의 일반 쉘에 ps -e grep 프로세스이름 을 실행하면 프로세스가 표시된다. 또한 컨테이너가 전체 OS를 내장할 필요가 없어, 컨테이너는 매우 가볍고 일반적으로 약 5-100MB다.
가상 머신과 함께 VM 내부에서 실행되는 모든 것(게스트 OS 등)은 호스트 OS 또는 하이퍼바이저로부터 독립되어 있다. 가상 머신 플랫폼은 특정 VM에 대한 가상화 프로세스를 관리하기 위해 프로세스를 시작하고, 호스트 시스템은 그것의 하드웨어 자원 일부를 VM에 할당한다.
특정 VM을 위한 커널을 부팅하고 운영 체제 프로세스 세트를 시작하여, 응용 프로그램만 포함하는 일반적인 컨테이너보다 VM의 크기를 훨씬 크게 만든다.
어떻게 해서 위처럼 도커 컨테이너를 격리 시킬까? → Cgroups(control groups)와 네임스페이스(namespaces)는 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능이다. 도커 클라이언트 / 서버는 결국 리눅스 환경에서 돌아가고 있기 때문에 리눅스 커널 기능을 사용할 수 있다.
Cgroups
CPU 시간, 시스템 메모리, 네트워크 대역폭, HD i/o 등 프로세스 그룹의 시스템 자원 사용량을 관리. 어떤 어플이 사용량이 너무 많으면 Cgroup에 집어 넣어서 CPU와 메모리 사용을 제한할 수 있다. = 프로세스들의 자원 사용량을 제한하고 격리시킴.
네임스페이스
하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술. 별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술.
'Cloud > Docker' 카테고리의 다른 글
Docker 기본 (0) 2021.04.07 EC2 인스턴스에 Docker 설치 및 서버 배포하기 (0) 2020.06.04