컨테이너를 구획화하는 장치(namespace)
Docker는 컨테이너라는 독립된 환경을 만들고, 그 컨테이너를 구획화하여 애플리케이션의 실행 환경을 만든다. 이 컨테이너를 구획하는 기술은 Linux 커널의 namespace(이름공간)라는 기능을 사용한다.
namespace란 한 덩어리의 데이터에 이름을 붙여 분할함으로써 충돌 가능성을 줄이고, 쉽게 참조할 수 있게 하는 개념이다. 이름과 연결된 실체는 그 이름이 어떤 namespace에 속해 있는지 고유하게 정해진다. 그래서 이름공간이 다르면 동일한 이름이라도 다른 실체로 처리된다.
PID namespace
PID란 Linux에서 각 프로세스에 할당된 고유한 ID를 말한다. PID namespace는 PID와 프로세스를 격리시킨다. namespace가 다른 프로세스끼리는 서로 액세스할 수 없다.
Network namespace
Network namespace는 네트워크 디바이스, IP 주소, 포트 번호, 라우팅 테이블, 필터링 테이블 등과 같은 네트워크 리소스를 격리된 namespace마다 독립적으로 가질 수 있다. 이 기능을 사용하면 호스트 OS 상에서 사용 중인 포트가 있더라도 컨테이너 안에서 동일한 번호의 포트를 사용할 수 있다.
UID namespace
UID namespace는 UID(사용자 ID), GID(그룹ID)를 namespace 별로 독립적으로 가질 수 있다. namespace 안과 호스트 OS상의 UID/GID가 서로 연결되어 이름공간 안과 밖에서 서로 다른 UID/GID를 가질 수 있다. 예를 들어 namespace 안에서는 UID/GID가 0인 root 사용자를, 호스트 OS 상에서는 일반 사용자로서 취급할 수 있다. 이것은 namespace 안의 관리자 계정은 호스트 OS에 대해서는 관리 권한을 일절 갖지 않는다는 것을 의미하므로 보안이 뛰어난 환경으로 격리시킬 수 있다.
MOUNT namespace
Linux에서 파일 시스템을 사용하기 위해서는 마운트가 필요하다. 마운트란 컴퓨터에 연결된 기기나 기억장치를 OS에 인식시켜 이용 가능한 상태로 만드는 것을 말한다. MOUNT namespace는 마운트 조작을 하면 namespace 안에 격리된 파일 시스템 트리를 만든다. 다른 namespace 기능과 마찬가지로 namespace 안에서 수행한 마운트는 호스트 OS나 다른 namespace에서는 액세스할 수 없게 되어있다.
IPC namespace
IPC namespace는 프로세스 간의 통신(IPC) 오브젝트를 namespace별로 독립적으로 가질 수 있다. IPC는 System V 프로세스 간의 통신 오브젝트라고 하는 공유 메모리나 세마포어/메시지 큐를 말한다. 세마포어란 프로세스가 요구하는 자원 관리에 이용되는 배타제어 장치이며, 메시지 큐란 여러 프로세스 간에서 비동기 통신을 할 때 사용되는 큐잉 장치이다.
Docker는 이러한 namespace 장치를 사용하여 호스트 상에서 컨테이너를 가상적으로 격리시킨다. Docker를 사용할 때 특별히 의식하지 않아도 되지만, Docker의 구조를 이해하 두는 것이 좋다.
참고
'About > Docker' 카테고리의 다른 글
[Docker] Docker의 작동 구조 (3) (네트워크 구성) (0) | 2020.12.27 |
---|---|
[Docker] Docker의 작동 구조 (2) (cgroups) (0) | 2020.12.27 |
[Docker] Docker 컴포넌트 (1) | 2020.12.13 |
[Docker] Docker의 기능 (1) | 2020.12.07 |
[Docker] Docker의 개요 (1) | 2020.12.07 |