namespace(격리), cgroup(자원 분할 할당), union fsys(레이어드 최적화) 특징을 갖는다.
What
Container란
애플리케이션의 코드와 모든 의존성을 패키징하는 소프트웨어 표준 단위이다.
컨테이너는 애플리케이션에서 필요한 모든 것을 담고 있다.
각 컨테이너들은 서로 격리되어 있다.
컨테이너로 패키징된 애플리케이션은 하나의 호스트 위에서 독집적으로 실행된다.
Docker의 컨테이너의 특징
Linux NameSpace - 프로세스에게 격리된 OS VIEW를 제공하는 커널 기술
프로세스 생성 시점에 어떤 네임스페이스를 사용할 지 선택할 수 있고, 프로세스는 선택한 네임스페이스 별로 격리된다.
NameSpace 없이는 모든 프로세스가 동일한 Network Resource를 사용하게 된다.
같은 eth0이더라도 서로 다른 네트워크 리소스를 사용한다.
Cgroup - 프로세스에게 하드웨어 리소스를 그룹으로 묶어서 할당하는 기술
cgroup은 리소스 타입 별로 독립적인 트리 구조를 가진다.
cgroup 노드는 하위에 서브 노드를 가질 수 있으며 Leaf-Node는 프로세스가 된다.
유니온 파일 시스템 - 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해줌 (획기적 IDEA)
처음 이미지를 다운받을 때는 부담이 없지만 기존 이미지에 파일을 추가해서 수백메가를 다시 다운받으면 매우 비효율적일 것 이다.
도커는 이런 문제를 해결하기 위해 레이어라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해준다.
이미지란
컨테이너를 만들기 위한 파일이다.
이미지로 컨테이너를 생성하기 때문에 컨테이너를 이미지 인스턴스라 한다.
효율적인 이유의 예시
이미지는 여러개의 읽기 전용read only 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성됩니다. ubuntu 이미지가 A+ B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx가 됩니다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 예상대로 A + B + C + nginx + source 레이어로 구성됩니다. webapp 소스를 수정하면 A,B,C, Nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있습니다.
Union File System을 사용하면 여러 컨테이너가 하나의 이미지를 사용할 경우 각각의 컨테이너는 자신이 Overwrite할 영역만을 유지할 수 있다.