도커와 기존의 가상화 기술과의 차이를 통한 컨테이너의 이해
- 가상화 기술이 나오기 전
- 한대의 서버를 하나의 용도로만 사용해 서버의 공간이 남아도 그대로 방치할 수 밖에 없었다.
- 하나의 서버, 하나의 운영체제, 하나의 프로그램만을 운영해 안정적이나 자원을 비효율적으로 사용한다. - 하이퍼 바이저 기반의 가상화 출현
- 논리적으로 공간을 분할하여 VM이라는 독립적인 가상 환경의 서버를 이용할 수 있다.
- 하이퍼 바이저는 호스트 시스템에서 다수의 게스트 OS를 구동할 수 있게 하는 소프트/하드웨어를
가상화해 각각의 VM을 모니터링하는 중간 관리자이다.
하이퍼 바이저가 하드웨어를 직접 제어하기에 자원을 효율적으로 사용 가능하며, 별도의 호스트 OS가 없으므로 오버헤드가 적다.
하지만 여러 하드웨어 드라이버를 세팅해야 하므로 설치하기가 어렵다.
일반적은 소프트웨어처럼 호스트 OS 위에서 실행되며, 하드웨어 자원을 VM 내부의 게스트 OS에 에물레이트 하는 방식으로 하기 때문에 오버헤드가 크다.
하지만 게스트 OS 종류에 대한 제약이 없고 구현이 다소 쉽다.
많이 쓰이는 방식
하이퍼 바이저 기반의 VM 구조
- 하이퍼바이저에 의해 구동되는 VM은 각 VM마다 독립된 가상 하드웨어 자원을 할당 받는다.
- 논리적으로 분리되어 있어 한 VM에서 발생한 오류는 다른 VM으로 퍼지지 않는다는 장점이 있다.
이러한 가상화 기술에서 나온 컨테이너 가상화 기술
- VM과 비교했을 때 컨테이너는 하이퍼바이저와 게스트 OS가 필요하지 않으므로 더 가볍게 관리할 수 있다.
- 애플리케이션 실행 시 컨테이너 방식은 호스트 OS 위에 애플리케이션 실행 패키지인 이미지를 배포하기만 하면 된다.
하지만 VM의 경우 VM을 띄우고 자원을 할당한 후, 게스트 OS를 부팅 해 애플리케이션을 실행해야 한다.
또한 게스트 OS를 포함하기 때문에 훨씬 복잡하고 무겁게 실행을 해야한다. - 공통점은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법이다.
- 차이점은 격리된 환경을 얼마나 격리 시키는지에 대한 차이이다.
도커 커널 공유
도커 컨테이너의 애플리케이션은 컨테이너가 제공하는 격리 기능 내부에 샌드박스가 있지만, 여전히 같은 호스트 운영체제의 다른 컨테이너와 동일한 커널(도커 엔진)을 공유한다. 결과적으로, 컨테이너 내부에서 실행되는 프로세스는 호스트 운영체제(모든 프로세스를 나열할 수 있는 충분한 권한 있음)에서 볼 수 있다.
VM의 하이퍼바이저와의 독립 (사용방법은 간단하다 굉장히 느리다)
가상머신과 함께 VM 내부에서 실행되는 모든 것은 호스트 운영 체제 또는 하이퍼바이저와 독립되어 있다.
가상 머신 플랫폼은 특정 VM 가상화 프로세스를 관리하기 위해 프로세스를 시작하고, 호스트 시스템은 그것의 하드웨어 자원 일부를 VM에 할당한다.
도커 컨테이너를 통해 컴퓨터에 실행되고 있는 프로세스들
도커 컨테이너의 격리를 이해하기 전 리눅스의 Cgroup, 네임스페이스에 이해
- Cgroup(control groups)과 네임스페이스(namespaces)는 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널의 기술들이다.
- Cgroup : CPU, 메모리, Network bandWith, HD i/o 등 프로세스 그룹의 시스템 리소스 사용량을 관리한다.
=> 특정 어플의 사용량이 크면 Group에 포함시켜 하드웨어의 사용제한을 걸 수 있다. - 네임스페이스 : 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술이다. 즉 별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술이다.
Cgroup, 네임스페이스를 도커에서 사용할 수 있는 이유
Cgroup, 네임스페이스를 통해 컨테이너를 격리 시킬 수 있다. 하지만 해당 기술들은 리눅스 기반의 기능들인데 도커에서 사용할 수 있는 이유가 무었일까? 터미널을 켜 현재 도커 엔진의 정보를 확인하자.
참고자료
'BackEnd > Docker' 카테고리의 다른 글
[Docker] 컨테이너 (0) | 2024.04.29 |
---|---|
[Docker] 도커 이미지로 컨테이너 만들기 (0) | 2024.04.29 |
[Docker] Docker를 사용할 때의 흐름 (0) | 2024.04.26 |
[Docker] Docker 설치하기 (window) (0) | 2024.04.26 |
[Docker] 도커, 컨테이너, 이미지 (0) | 2024.04.26 |