✔️ Hypervisor와 Docker
Hypervisor(가상화)의 목적은 무엇인가 ?
가장 핵심이 되는 목적은 isolation(분리)이다.
그렇다면 무엇을 분리
시키기 위해 사용하는가 ?
리소스를 분리 시키기 위해서 사용한다.
하나의 HW에 하나의 OS가 올라가면 그 위에 여러개의 app이 배치된다.
app의 동작, 즉 프로세스들이 여러개 존재하게 되는데 이때 프로세스들 간의 격리가 되지 않는다.
이렇게 되면 프로세스가 다른 프로세스에게 영향을 미칠 수 있고 운영체제에도 영향을 미칠 수 있다.
→ 한마디로 어플리케이션 간에 분리가 되지 않으면 서로의 동작에 영향을 미칠 수 있다.
그래서 우리는 하나의 큰 하드웨어에 Hypervisor를 통해 가상화를 하고 VM이라는 개념을 만들어 논리적으로 app을 격리 시켰다.
VM 역시 운영체제가 다르므로 서로에게 영향을 미칠 수 없다.
운영체제의 분리를 통해 어플리케이션의 분리를 이룬 것이다.
VM을 통해 여러 프로세스(동작하는 app)들의 격리를 성공적으로 이뤘는데 왜 Container
라는 기술이 대두됐을까 ?
이는 컨테이너의 목적을 잘 생각해보면 되는 부분인데,
그렇다면 컨테이너의 사용 이유는 무엇이냐 ? VM을 사용하는 이유와 같다. isolation이다.
✔️ Docker의 사용 이유
그렇다면 컨테이너 기술을 왜 사용하는가 ?
VM에 큰 단점이 존재하기 때문이다.
VM의 단점은 무엇인가 ?
우리가 간단하게 웹 서버를 열기위해 사용하는 apache app은 얼마의 용량이 필요할까 ?
약 100M라고 한다면, 100M 짜리 어플리케이션을 실행하기 위해서 배보다 배꼽이 더 큰 운영체제가 있어야 한다.
운영체제의 크기는 보통 8 ~ 10G 이다.
극단적으로 말하면 10M 짜리 어플리케이션 하나를 동작 시키기 위해 운영체제 10G가 필요하다.
어플리케이션 하나를 분리시키려고 너무 큰 오버헤드가 생긴다.
VM에 Hypervisor 라는 계층이 존재하는 것과 달리 Docker에서는 실제로 존재하는 계층은 아니다.
컨테이너에서는 Host의 운영체제를 공유한다.
그리고 app 끼리의 격리를 보장하기 위해 Container 라는 개념을 사용한다.
운영체제가 없기 때문에 실제로 사이즈가 상당히 작다.
프로세스와 개념은 같은데, 격리된 공간을 가지게 된다는 차이가 있다.
→ 이를 Docker가 수행해준다.
app이 실행되기 위한 바이너리, 라이브러리를 포함한다.
이 용량이 아주 작기 때문에 컨테이너를 띄우는데 수 초면 된다.
VM은 제조사 별로 다른 Hypervisor를 가지므로 서로 호환이 쉽지 않다. (물론 Converter가 있긴 하다.)
컨테이너는 항상 표준화된 구성으로 되어 있기 때문에 어떤 시스템에서든 컨테이너는 동일하게 작동할 수 있다.
✔️ Container 핵심 기술
- Cgroup : Control Group
- Namespace : Isolation
- IPC NS - Inter process communication, 프로세스 간 통신하는 내장 큐
- PID NS - 프로세스
- Network NS - 네트워크
- UID NS - User Group
- Mount NS - Mount Point
- UTS NS - 호스트 네임
- Layered Filesystem
✔️ Cgroup
Cgroup
- Controll group, 리소스의 양을 제한, 제어 해준다.
systemctl status httpd 같은 명령어로 시스템의 상태를 확인할 때 최하단에 Cgroup이 등장한다.
제어를 위한 그룹, 프로세스를 그룹핑 시켜놓고 제어한다.
쉽게 얘기해서 어떤 서비스가 실행되고 있을 때 어떤 PID를 가지고 있는 프로세스에게 할당해 줄 리소스의 양을 제어할 수 있다.
보통 일반적으로 리소스의 양을 제어하는 영역은 HW, CPU, Memory, Disk, Network 등이다.
controll은 운영체제에 내장된 기능이다.
Cgroup
기능 자체가 리눅스 커널에 대략적으로 20년 전부터 있었다.
기본적으로 리소스의 양에 제한이 걸려있지는 않다. 무제한으로 사용 할 수 있다.
✔️ Namespace
Namespace
- app을 isolation 해준다.
Namespace라는 여러가지 형태로 존재한다.
VM과 유사한 환경으로 격리 시키기 위해서 컨테이너의 격리는 Namespace가 하게된다.
컨테이너 간의 영향을 미치지 않게 격리를 시켜주는 것이 Namespace이다.
✔️ 컨테이너 기술과 Hypervisor와의 차이점 ?
Hypervisor의 경우 하드웨어 자체를 가상화한다. 하드웨어를 물리적으로 구분해서 가상화한다.
따라서 Hypervisor 위에 올라가는 Guest OS는 서로 물리적으로 구분된 공간에서 돌아간다.
하지만 Namespace는 하드웨어를 분리하지는 않는다. 동일한 OS 및 커널(Kernel)을 깔고 그 위에서 돌아간다.
하드웨어 자원을 가상화 하는 것이 아닌 Linux 내의 자원을 가상화 하는 것이다.
✔️ Namespace 의 종류
- IPC NS
- PID NS
- Network NS
- UID NS
- Mount NS
- UTS NS
1. PID namespace
- 프로세스에 할당된 고유한 ID를 말하며 이를 통해 프로세스를 격리할 수 있다
- namespace가 다른 프로세스 끼리는 서로 액세스할 수 없다
2. Network namespace
- 네트워크 디바이스, IP 주소, Port 번호, 라우팅 테이블, 필터링테이블 등의 네트워크 리소스를 namespace마다 격리시켜 독립적으로 가질 수 있다. 이 기능을 이용하면 OS 상에서 사용중인 Port가 있더라도 컨테이너 안에서 동일한 Port를 사용 가능하다.
3. UID namespace
- UID, GID를 namespace 별로 독립적으로 가질 수 있도록 한다.
- namespace 안과 호스트 OS 상에서 서로 다른 UID, GID를 가질 수 있다.
4. Mount namespace
- 호스트 OS와 namespace가 서로 다른 격리된 파일시스템 트리를 가질 수 있도록 한다
(마운트는 컴퓨터에 연결된 기기나 기억장치를 OS에 인식시켜 사용가능한 상태로 만드는 것을 의미한다)
5. UTS namespace
- namespace 별로 호스트명이나 도메인 명을 독자적으로 가질 수 있다
6. IPC namespace
- 프로세스간 통신(IPC) 오브젝트를 namespace 별로 독립적으로 가질 수 있다
참고
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker(도커)의 기본 명령어 (0) | 2022.05.07 |
---|---|
[Docker] Docker(도커) 설치 (0) | 2022.05.06 |
[Docker] Monolithic 구조와 MicroService 구조 (0) | 2022.05.06 |
Docker(도커)란 무엇인가 ? (1) | 2022.03.07 |
컨테이너란 무엇인가 ? (1) | 2022.03.07 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!