Docker를 알기전에 우선 컨테이너의 개념을 알아야 한다.
컨테이너(container)란, 공통 기능 세트를 충족하는 단일 호스트에서 실행되는 격리된 프로세스 그룹이며, 이런 기능 중 일부는 Linux 커널에서 찾을 수 있다.
어떻게 도커 컨테이너를 격리시키는가
이를 위해서는 Linux의 cgroup(control groups)과 네임스페이스(namespaces)에 대해 알아야 한다.
Linux Namespaces(ns)
네임스페이스는 2002년 리눅스 2.4.19와 함께 도입된 리눅스 커널 기능이다. (도커 역시 리눅스 커널 기능을 이용해 컨테이너를 격리한다.) 이 기능은 추상화 계층에서 특정 전역 시스템 리소스를 래핑하는 것이다. 이렇게 하면 네임스페이스 내의 프로세스에 리소스의 자체 격리 인스턴스가 있는것처럼 보이게 할 수 있으며, 쉽게 말해 네임스페이스의 주요 기능은 프로세스를 서로 격리한다는 것인거다.
개발자는 컨테이너를 사용하면 완전한 VM처럼 보이고 느껴지는 격리된 환경을 제공하지만, 사실 VM이 아니라 어딘가에 있는 서버에서 실행 중인 프로세스이며, 두 개의 컨테이너를 시작하면 어딘가의 단일 서버에서 두 개의 프로세스가 실행되고 있지만 서로 격리되어 있는 것이다.
현재 사용 가능한 네임스페이스는 여러 개의 고유한 네임스페이스(mnt, pid, net, ipc, uts, user 등)가 구현되어 있다.
•
user : root가 같은 사용자 공간 내에서 권할을 가질 수 있게 된다.
•
pid : 다른 네임스페이스의 pid세트로부터 독립적인 프로세스의 pip세트를 할당한다.
•
net : 독립적인 네트워크 스택을 가지고 자신의 개인 라우팅 ip 주소 세트 테이블, 소켓 연결 테이블, 방화벽, 기타 네트워크 관련 자원 추적 목록을 가질 수 있다.
•
mnt : 호스트 파일 시스템에 영향을 주지 않고 마운트 네임스페이스에서 파일 시스템을 마운트 및 언마운트 할 수 있다.
•
ipc : 자신의 ipc자원이 아닌 posix 메시지 큐이다.
•
uts : 하나의 시스템이 다른 프로세스에 다른 호스트 및 도메인 이름을 가지고 있는 것처럼 보일 수 있다.
cgroup
제어 그룹(cgroup)은 프로세스 모음의 리소스 사용량(CPU, 메모리, 디스크 I/O, 네트워크 등)을 제한, 설명 및 격리하는 리눅스 커널 기능이며, 아래와 같은 기능이 있다.
•
리소스 제한: 프로세스가 사용할 수 있는 특정 리소스의 양을 제한하도록 cgroup을 구성할 수 있다.
•
우선 순위: 리소스 경합이 있을때 다른 cgroup의 프로세스와 비교하여 프로세스가 사용할 수 있는 리소스의 양을 제어할 수 있다.
•
회계: 리소스 제한은 cgroup 수준에서 모니터링 되고 보고된다.
•
제어: 단일 명령으로 cgroup에 있는 모든 프로세스의 상태(고정, 중지, 다시시작)를 변경할 수 있다.
Linux 컨테이너(LXC)와 Docker 컨테이너의 차이점은 무엇인가
위 내용만 봐서는 도커는 리눅스의 ns와 cgroup을 사용해서 구축했기 때문에 큰 차이가 없을거 같지만 목적이 다르다. LXC는 OS 컨테이너화에 중점을 두는 반면 Docker 컨테이너는 애플리케이션 컨테이너화에 중점을 둔다. 또한 LXC는 다목적 운영체제의 가상화이며, 도커는 단일 목적 애플리에키션의 가상화이다.