등장배경 (시대의 발전)
- 과거엔 메어메탈 시스템에 여러 application 을 동작시킴.
- 소프트웨어 운영 플랫폼이 하드웨어는 좋아지고, 가성비가 좋아지고 있음.
- 대용량 시스템에 HyperviosrX 라는 가상 시스템을 사용하여 VM Computer 를 사용 (가상화)
- scale-in/out 요구사항에 따라 자유 확장/축소를 요구됨.
- OS 위의 Container Engine 을 이용하여 Container application 을 동작시킴.
- 적은 용량으로 Container 를 이용할 수 있음.
- isolate, 적은용량의 장점 → 확장성에 용이.
컨테이너의 특징
- Application을 운영 한다고 하면 동작에 필요로하는 환경을 구성 해줌 (library, platform … )
왜 굳이 리눅스에?
아래 리눅스의 커널 기능을 사용해야함.
chroot
: 독립된 공간 형성
💡 Chroot는 "change root"의 약어로, 프로세스가 실행될 루트 디렉토리를 변경하는 리눅스 시스템 기능입니다. 이를 이용하여 독립적인 파일 시스템을 구성하여 프로세스가 해당 디렉토리를 벗어나지 못하도록 하는데 사용됩니다. 이를 통해 프로세스가 가상화된 파일 시스템 내에서 동작하도록 할 수 있으며, 여러 프로세스를 격리된 환경에서 실행할 수 있습니다.
namespace
: 6가지 isolate 기능 지원
💡 Namespace는 프로세스의 가상화된 환경을 구성하는 기술입니다. 네임스페이스는 프로세스가 사용하는 리소스를 격리된 환경으로 분리할 수 있도록 합니다. 이를 통해 각각의 컨테이너는 자신만의 가상화된 환경을 갖게 되며, 호스트 시스템에서 실행되는 프로세스와 격리됩니다. 이러한 Namespace에는 프로세스, 마운트, IPC, 네트워크, 사용자 등이 있습니다.
- more
다음과 같은 6가지 isolate 기술이 있습니다.- PID Namespace: 각 컨테이너에게 고유한 프로세스 ID 공간을 할당하여 프로세스 간 충돌을 방지합니다.
- Network Namespace: 각 컨테이너에게 고유한 네트워크 인터페이스와 IP 주소 공간을 할당하여 네트워크 상에서 완전히 격리된 환경을 제공합니다.
- Mount Namespace: 각 컨테이너에게 고유한 파일 시스템 마운트 포인트 공간을 할당하여 파일 시스템 접근을 격리합니다.
- IPC Namespace: 각 컨테이너에게 고유한 System V IPC와 POSIX IPC 공간을 할당하여 프로세스 간 통신을 격리합니다.
- System V IPC는 메시지 큐, 세마포어, 공유 메모리와 같은 IPC 방식 중 하나로, 시스템 전체에서 전역적으로 사용되는 IPC 메커니즘입니다. 이에 반해 POSIX IPC는 메시지 큐, 세마포어, 공유 메모리와 같은 IPC 방식 중 하나로, 특정 프로세스나 스레드 간에만 사용되는 IPC 메커니즘이며, POSIX 규격에 따라 정의되어 있습니다.
- IPC Namespace를 사용하면, 컨테이너 내부의 프로세스들은 같은 IPC Namespace 내에서만 프로세스 간 통신이 가능하며, 호스트나 다른 Namespace 내의 프로세스와는 독립적으로 IPC 자원을 사용할 수 있습니다. 따라서, 같은 호스트에서 여러 개의 컨테이너를 실행할 때, IPC Namespace를 사용하면 각각의 컨테이너 간에 IPC 자원 충돌을 방지하고 서로 독립적인 환경을 구성할 수 있습니다.
- IPC Namespace는 Inter-Process Communication(프로세스 간 통신) Namespace의 약자로, 각각의 Namespace에는 고유한 System V IPC와 POSIX IPC 공간이 존재합니다.
- UTS Namespace: 각 컨테이너에게 고유한 호스트 이름과 도메인 이름 공간을 할당하여 호스트 시스템과 분리된 식별자를 가집니다.
- User Namespace: 각 컨테이너에게 고유한 사용자 ID 공간을 할당하여 호스트 시스템과 분리된 사용자 권한을 부여합니다.
cgroup
필요한만큼 HW 지원.
💡 Cgroup은 "control group"의 약어로, 리눅스 커널에서 프로세스 그룹에 대한 자원 할당을 제어하는 기능입니다. Cgroup은 각각의 프로세스에 대해 CPU, 메모리, 디스크 I/O 등의 자원 사용을 제한할 수 있습니다. 이를 이용하여 컨테이너 내에서 실행되는 애플리케이션의 자원 사용량을 제한하고, 호스트 시스템과의 충돌을 방지할 수 있습니다.
- more
- Cgroup은 다양한 자원 제한 및 제어 방법을 제공합니다. 예를 들어, CPU cgroup에서는 각각의 그룹에 CPU 사용량을 제한하는 방법으로 CPU 할당량, CPU 사용 시간 제한 등이 제공됩니다. 또한, 메모리 cgroup에서는 메모리 사용량 제한, 블록 I/O cgroup에서는 디스크 I/O 제한 등이 가능합니다.
- Cgroup은 Docker와 같은 컨테이너 가상화 기술에서 핵심적으로 사용되며, 컨테이너 내에서 실행되는 애플리케이션의 자원 사용량을 제한하고 호스트 시스템과의 충돌을 방지하는 데 매우 유용합니다.
- Cgroup은 계층적인 구조를 가지며, 각 그룹은 다른 그룹의 부모가 될 수 있습니다. 이를 통해 하위 그룹의 자원 할당을 상위 그룹에서 제어할 수 있으며, 그룹 간의 우선순위를 설정하여 자원 할당을 조정할 수 있습니다.
커널의 기능으로 독립된 공간의 Container 들을 만들 수 있음.
+)windows, mac 경우 Hypervisor 활성화해야함.
그냥프로그램 vs 컨테이너
- 하는일 같음. 단, 구조(모양)이 다름.
왜 사용?
- 개발자가 만든 코드를 어디서든 돌릴 수 있음.
- 확장 / 축소가 쉬움.
- MSA, Devops 영역에 적합
예시 1.
- 개발자 container기반 프로그램 개발
- 여러 고객사에서 운영하기 쉬움.
- 운영하는 곳에서 똑같이 운영할 수 있음. (환경 제약이 없음)
예시 2.
- 베어메탈에 node 설치 등등을 한다면 확장할때 그대로 똑같은 환경으로 구성되어야하므로 오버헤드가 매우 큼.
- 컨테이너 환경에서는 서비스 연속성 지원, 확장성 지원
- devops : 개발부터 운영까지 자동화 하는 것.
이 문서는 컨테이너에 대한 개념과 특징, 리눅스에서의 사용 이유, 일반적인 프로그램과의 차이, 그리고 사용하는 이유에 대해 설명합니다. 또한, 컨테이너의 예시와 DevOps 영역에서의 활용도에 대해 다룹니다.
'👨🏻💻 Development > 🐳 Docker' 카테고리의 다른 글
3. 도커 컨테이너 만들어보기: 이론편 (0) | 2023.03.26 |
---|---|
2. 도커 컨테이너 살펴보기: 이론편 (0) | 2023.03.26 |