귀염둥이의 메모

[Docker] 도커의 작동 구조(namespace, cgroups) 본문

Infra & Devops/Docker

[Docker] 도커의 작동 구조(namespace, cgroups)

겸둥이xz 2021. 9. 14. 18:55
반응형

Docker의 작동 구조

컨테이너라는 독립적인 환경을 만들기 위해 Linux 커널의 namespace라는 기능을 사용한다.
또한, 물리 머신 상의 자원을 여러 컨테이너가 공유하여 작동하게 된다. 이때 Linux 커널 기능인 cgroups(control groups) 기능을 사용하여 자원의 할당 등을 관리한다.

 

 

컨테이너를 구획화하는 장치 (namespace)

namespace는 한 덩어리의 데이터에 이름을 붙여 분할 함으로써 충돌 가능성을 줄이고, 쉽게 참조할 수 있게 하는 개념이다. 이름과 연결된 실체는 그 이름이 어떤 이름 공간에 속해 있는지 고유하게 정해진다. 그래서 이름 공간이 다르면 동일한 이름이라도 다른 실체로 처리된다.

 

  • PID namespace
    • PID와 프로세스를 격리시키고, namespace가 다른 프로세스끼리는 서로 액세스 할 수 없다
  • Network namespace
    • 네트워크 디바이스, IP 주소, 포트 번호, 라우팅 테이블 등과 같은 네트워크 리소스를 격리된 namespace마다 독립적으로 가짐
    • 호스트 OS 상에서 사용 중인 포트가 있더라도 컨테이너 안에서 동일한 번호의 포트 사용 가능
  • UID namespace
    • UID, GID를 namespace 별로 독립적으로 가질 수 있다
    • namespace 안과 호스트 OS상의 UID/GID가 서로 연결되어 namespace 안과 밖에서 서로 다른 UID/GID를 가질 수 있다
      • namespace 안에서는 UID/GID가 0인 root 사용자를, 호스트 OS 상에서는 일반 사용자로서 취급할 수 있다, 이것은 namespace 안에서 관리자 계정은 호스트 OS에 대해서 관리 권한을 일절 갖지 않는 것을 의미한다
  • MOUNT namespace
    • 마운트 조작 시 namespace에서 격리된 파일 시스템 트리를 만든다
    • 다른 namespace 기능과 마찬가지로 namespace 안에서 수행한 마운트는 호스트 OS, 다른 namespace에서 액세스 불가능
  • UTS namespace
    • namespace 별로 호스트명이나 도메인명을 독자적으로 가질 수 있다
  • IPC namespace
    • 프로세스 간의 통신(IPC) 오브젝트를 namespace 별로 독립적으로 가질 수 있도록 한다
    • IPC는 System V 프로세스 간의 통신 오브젝트라고 하는 공유 메모리(Shared Memory)세마포어(Semaphore) 또는 메시지 큐(Message Queue)를 말한다

 

 

릴리스 관리 장치 (cgroups)

Linux 커널 기능인 'control groups' 기능을 사용하여 컨테이너 자원 할당 등을 관리한다. 프로세스는 하나 이상의 스레드를 가질 수 있다. cgroups는 프로세스와 스레드를 그룹화하여, 그 그룹 안에 존재하는 프로세스와 스레드 관리를 수행하기 위한 기능이다.

  • ex) 호스트 OS의 CPU나 메모리와 같은 자원에 대해 그룹별로 제한을 둘 수 있다.

 

cgroups의 주요 서브 시스템

항목 설명
cpu CPU 사용량을 제한
cpuacct CPU 사용량 통계 정보 제공
cpuset CPU나 메모리 배치를 제어
memory 메모리나 스왑 사용량 제한
devices 디바이스에 대한 액세스 허가/거부
freezer 그룹에 속한 프로세스 정지/재개
net_cls 네트워크 제어 태그를 부가
blkio 블록 디바이스 입출력량 제어
  • cgroups는 계층 구조를 사용하여 프로세스를 그룹화하여 관리할 수 있다. 예를 들어 사용자 애플리케이션과 서버와 같은 데몬 프로세스를 나눠, 각각의 그룹에 CPU 사용량을 할당할 수 있다.
  • cgroups의 부모 자식 관계에서는 자식이 부모의 제한을 물려받는다. 자식이 부모의 제한을 초과하는 설정을 하더라도 부모 cgroups의 제한에 걸리게 된다.


<참고자료>

'완벽한 IT 인프라 구축을 위한 Docker 2판'

반응형
Comments