
왜 컨테이너가 만들어졌고, 왜 도커는 성공했을까?
도커는 개발자의 환경과 사용자의 환경을 최대한 가깝게 만들어준다.
개발
역사적으로 개발자의 환경은 복잡한 프로제스를 포함시킨다. 도커는 이것을 개발자에게 단순 명령, 도커 compsed up, 그리고 윈도우, 맥, 리눅스에서 양립 가능하도록 허용하면서 간단하게 만들어준다.

배포
배포 어플리케이션은 주로 몇가지의 절차를 포함해왔다. 서버를 만들고 dependency를 설정한다음 어플리케이션 코드를 복사했다. 콘테이너는 단순 표준 패키지를 소개했고, 단순히 필요한 컨테이너와 컨테이너 이미지만 가지고 배포를 가능하게 한다.

컨테이너란?
도커 컨테이너 이미지란 가볍고, 독립적인 소프트웨어 실행패키지이다. 어플리케이션을 실행시키기 위한 모든 필요한것을 포함하고 있다.

컨테이너 이미지와 컨테이너의 차이점은 객체지향형 프로그램에서 클래스와 인스턴스의 차이 라고 생각하면 쉽다.
- 컨테이너 이미지 - class
- 컨테이너 - instance
Open Container Initiative (OCI)
OCI는 컨테이너 포멧에 대한 표준을 만들기 위해 만든 업계의 협력이다. Docker, Google, VMware, Microsoft, Dell, IBM, and Oracle 같은 회사들로부터 설립되었다. OCI는 세가지 주요한 스펙을 정의한다.
이미지 Specification: 이미지의 메타데이터와, 직렬 파일 시스템을 포함한 포멧을 정의한다.
런타임 Specification: 이미지 사양을 준수하는 이미지를 사용하여 컨테이너를 실행하는 방법을 설명한다.
분배 Specification: 이미지가 어떻게 분배되어야 하는가에 대한 개요, 예를 들어 레지스트리를 통해 이미지를 푸시하고 가져오는 등의 작업을 수행한다.

가상화의 발전
가상화가 발명되기 전에는 모든 프로그램이 호스트 시스템에서 직접 실행되었다. 사람들은 이것을 베어메탈(Bare Metal)이라고 부르는데, 베어 메탈에서 실행하는 것은 우리가 랩톱/데스크탑 컴퓨터에 프로그램을 설치할 때마다 수행하는 작업이다.


가상 머신은 호스트 리소스를 여러 개의 격리된 가상 하드웨어 구성으로 분할할 수 있는 "하이퍼바이저"라는 시스템을 사용한다. 그런 다음 이를 자체 시스템(각각 OS, 바이너리/라이브러리 및 애플리케이션 포함)으로 처리할 수 있다.

컨테이너는 바이너리/라이브러리 설치 및 구성을 위한 격리된 환경을 제공한다는 점에서 가상 머신과 유사하지만, 하드웨어 계층 컨테이너에서 가상화하는 대신 기본 Linux 기능(cgroups + 네임스페이스)을 사용하여 동일한 커널을 공유하면서 격리를 제공한다.

Linux Building Blocks
컨테이너는 세 가지 Linux 기능을 활용하여 기능을 발휘한다.
네임스페이스
네임스페이스는 전역 시스템 리소스를 추상화로 래핑하여 네임스페이스 내의 프로세스에 전역 리소스의 격리된 인스턴스가 있는 것처럼 보이게 한다.
전역 리소스에 대한 변경 사항은 네임스페이스의 구성원인 다른 프로세스에 표시되지만 다른 프로세스에는 표시되지 않는다.
네임스페이스를 사용하면 컨테이너 런타임은 컨테이너 외부의 프로세스를 컨테이너 내에서 보이지 않게 유지하거나 컨테이너 내부의 사용자를 호스트의 다른 사용자에게 매핑할 수 있다.
cgroup
Cgroup은 프로세스를 계층적 그룹으로 구성하여 다양한 유형의 리소스 사용을 제한하고 모니터링할 수 있는 Linux 커널 기능이다
cgroup을 사용하면 컨테이너 런타임은 컨테이너가 다음을 사용할 수 있도록 지정할 수 있다.
유니온 파일 시스템
통합 파일 시스템을 사용하면 분기라고 알려진 별도의 파일 시스템의 파일과 디렉터리를 투명하게 오버레이하여 일관된 단일 파일 시스템을 형성할 수 있다.
병합된 분기 내에서 동일한 경로를 갖는 디렉터리의 내용은 새로운 가상 파일 시스템 내의 단일 병합 디렉터리에 함께 표시된다.
이 접근 방식을 사용하면 공통 레이어를 공유할 수 있으므로 공간을 효율적으로 사용할 수 있다.
예를 들어, 동일한 이미지의 여러 컨테이너가 단일 호스트에 생성된 경우 컨테이너 런타임은 각 컨테이너에 특정한 씬 오버레이만 할당하면 되며 기본 이미지 레이어는 공유될 수 있다.
각각 리소스 제약 조건과 애플리케이션 격리를 제공하는 Cgroup 및 네임스페이스. 또한 공통 레이어에 이미지를 구축할 수 있는 통합 파일 시스템을 사용하여 이미지를 빠르고 효율적으로 구축하고 공유할 수 있다.

Docker Desktop Architecture

A client application
A Linux virtual machine containing
Registries