도커의 컨테이너 기술은 리눅스의 컨테이너(LXC)
를 활용한 기술로, 컴퓨터에 독립적인 컴퓨팅 공간을 만들어낸다. 이는 기존의 VM(가상머신)과 비교하여 가상환경 구조에 근본적인 차이가 있다. 아래 그림을 보면 좌측의 VM은 환경자체(OS)를 가상화 해버리는 반면, 도커 컨테이너는 호스트 OS의 커널을 공유
하며 단순히 하나의 격리되어 있는 프로세스로써 동작한다.
도커는 컨테이너라는 가상의 '격리 환경'
을 만들기 위해 리눅스의 namespace
와 cgroup
이라는 기능을 사용한다. (namespace와 cgroup으로 만들어진 컨테이너를 LXC라고 부른다.)
namespace
: 프로세스를 독립시켜주는 가상화 기술이다. 각 컨테이너에서 실행된 프로세스가 시스템(user, 파일, 네트워크, 호스트명, 프로세스)
등에 대해 독립할 수 있게 해준다.
cgroups
: 자원(CPU, 메모리, network bandwidth)
에 대한 제어를 가능하게 해주는 리눅스 커널의 기능이다.
pid
name spaces: 프로세스 격리 처리 (독립된 프로세스 공간 할당)net
name spaces: 네트워크 인터페이스ipc
name spaces: IPC 자원에 대한 엑세스 관리mnt
name spaces: 파일 시스템 포인트 관리uts
name spaces: host name 할당
Control Groups
의 약자로 프로세스들이 사용할 수 있는 컴퓨팅 자원들을 제한하고 격리시킬 수 있는 리눅스 커널의 기능이다. namespace와 더불어 도커 컨테이너에서 완벽한 격리 환경을 만드는 데에 쓰이는 중요한 기능이다.
cgroup을 이용하면 다음 자원들을 제한할 수 있다.
메모리
CPU
Network
Device
I/O
즉, 도커는 프로세스를 격리
하고, 프로세스에 필요한 컴퓨팅 자원을 독립적으로 할당/격리
하여 완벽히 격리된 가상 환경을 구축하게 해준다.