Docker의 작동 구조
Docker가 작동하기 위한 기초 기술을 알아보자.
Namespace(컨테이너를 구획화하는 장치)
Docker는 Linux 커널의 namespace라는 기능을 사용하여 컨테이너라는 독립된 환경을 만든다. namespace는 한 덩어리의 데이터에 이름을 붙여 분할함으로써 충돌 가능성을 줄이고, 쉽게 참조할 수 있게하는 개념으로 같은 이름의 객체라도 namespace가 다를 경우 다른 실체로 처리된다.
Docker는 아래의 namespace 장치들을 사용하여 Host 상에서 컨테이너를 가상적으로 격리시킨다.
-
PID namespace
- PID와 프로세스를 격리시킴
- namespace가 다른 프로세스끼리는 서로 액세스 불가
-
Newtwork namespace
- 네트워크 디바이스, IP 주소, 포트 번호, 라우팅 테이블, 필터링 테이블 등과 같은 네트워크 리소스를 격리된 namespace마다 독립적으로 가질 수 있음
- 이 기능을 사용하면 Host OS상에서 사용 중인 포트가 있어도 컨테이너 안에서 동일한 번호의 포트 사용 가능
-
UID namespace
- UID, GID를 namespace 별로 독립적으로 가질 수 있음
- namespace 안과 Host OS상의 UID/GID가 서로 다른 UID/GID를 가지지만 서로 연결될 수 있음
- 예를 들어 namespace 안에서의 root 사용자를 Host OS 상에서 일반 사용자로 취급할 수 있음
-
Mount namespace
- namespace 안에 격리된 파일 시스템 트리를 만들수 있음
- 다른 namespace와 같이 namespace 안에서 수행한 마운트는 Host OS나 다른 namespace에서는 액세스할 수 없게 되어있음
-
UTS namespace
- namespace별로 호스트명이나 도메인명을 독자적으로 가질 수 있음
-
IPC namespace
- 프로세스 간의 통신(IPC) 오브젝트를 namespace 별로 독립적으로 가질 수 있음
cgroups(릴리스 장치 관리)
Docker에서는 물리 머신 상의 자원을 여러 컨테이너가 공유하여 작동한다. 이때 Linux 커널의 기능인 cgroups 기능을 사용하여 자원의 할당 등을 관리한다.
cgroups는 프로세스와 스레드를 그룹화하여, 그 그룹 안에 존재하는 프로세스와 스레드에 대한 관리를 수행하기 위한 기능
cgroups의 주요 서브 시스템
항목 | 설명 |
---|
cpu | CPU 사용량을 제한 |
cpuacct | CPU 사용량 통계 정보를 제공 |
cpuset | CPU나 메모리 배치를 제어 |
memory | 메모리나 스왑 사용량을 제한 |
devices | 디바이스에 대한 액세스 허가/거부 |
freezer | 그룹에 속한 프로세스 정지/재개 |
net_cls | 네트워크 제어 태그를 추가 |
blkio | 블록 디바이스 입출력량 제어 |
가상 브리지 / 가상 NIC(네트워크 구성)
- Linux는 Docker를 설치하면 서버의 물리 NIC가 docker0라는 가상 브리지 네트워크로 연결되는데 이 docker0은 Docker를 실행시킨 후에 디폴트로 만들어진다.
- Docker 컨테이너가 실행되면 컨테이너에 172.17.0.0/16이라는 서브넷 마스크를 가진 프라이빗 IP 주소가 eth0으로 자동으로 할당된다.
- Docker 컨테이너와 외부 네트워크가 통신을 할 때는 가상 브리지 docker0과 Host OS의 물리 NIC에서 패킷을 전송하는 장치가 필요하고, Docker에서는 NAPT 기능을 사용해 연결한다.
NAPT(Network Address Port Translation)
- 하나의 IP 주소를 여러 컴퓨터가 공유하는 기술로, IP 주소와 포트 번호를 변환하는 기능
- 프라이빗 IP 주소와 글로벌 IP 주소를 투과적으로 상호 변환하는 기술로, TCP/IP의 포트 번호까지 동적으로 변환하기 때문에 하나의 글로벌 IP 주소로 여러 대의 머신이 동시에 연결할 수 있다.
- Docker에서는 NAPT에 Linux의 iptables를 사용한다.
Docker 이미지의 데이터 관리 장치
- Docker에서는 'Copy on Write'방식으로 컨테이너의 이미지를 관리한다.
Copy on Write
- 복사를 요구받아도 바로 복사하지 않고 원래의 데이터를 그대로 참조시켜, 원본 또는 복사 어느 쪽에 수정이 가해진 시점에 비로소 새로운 빈 영역을 확보하고 데이터를 복사하는 방식
References