서비스에 필요한 os, lib, app을 하나의 컨테이너로 패키징할 수 있다.
os(리눅스)에서 컨테이너 기술을 지원하고, 도커는 컨테이너를 실행하기 위한 시스템 라이브러리 같다고 보면 된다(컨테이너 기술을 이용한 오픈소스).
도커는 컨테이너를 이미지 파일로 빌드해서 어디서나 배포하고 실행할 수 있게 해주는 오픈소스다.
그래서 컨테이너는 이미지 단위로 실행된다.
- 도커 이미지를 빌드하기 위해 Dockerfile 을 작성한다(도커 이미지를 어떻게 빌드해 라는 명령들이 있는 텍스트파일).
- Dockerfile 과 함께 도커 빌드 요청을 보낸다.
- 도커 서버에서는 도커 이미지를 빌드하여 그 이미지를 로컬 저장소에 저장한다.
- 도커 push 명령을 받으면 도커 서버는 로컬의 도커 이미지를 도커 레지스트리에 올린다.
- 도커 run 명령을 배포할 도커 서버에 전송한다.
- 도커 run 명령을 받은 도커 서버는 도커 레지스트리에 이미지를 로컬 저장소로 다운 받는다.
- 도커 이미지를 이용하여 컨테이너를 시작한다.
Linux Namespaces 는 프로세스에게 격리된 OS View 를 제공하는 커널 기술이다(컨테이너에 제일 중요한 기술). chroot 같이 디스크 마운트 경로만 다르게 제공하는게 아니라 네트워크, 호스트네임, 사용자 계정, 프로세스 아이디영역도 다르게 보여준다.
Linux Namespaces 는 pid, net, ipc, mnt, uts, user 등의 6개 리소스에 대한 네임스페이스를 제공한다. 프로세스 생성 시점에 어떤 네임스페이스를 사용할지 선택할 수 있고 프로세스는 선택한 네임스페이스 별로 격리된다.
cgroups (Control Group) 은 어플리케이션 (프로세스) 에게 하드웨어 리소스 (ex. CPU, MEM, Disk, Network, …) 를 그룹으로 묶어서 할당하는(제한할 수 있는) 기술이다.
namespace를 통해 서로 안보이는것만으로는 충분하지 않고, 안보이는 얘들끼리 시스템 리소스를 얼마만큼 사용할 것인지 제한을 걸어둬야 한다. 그걸 걸 수 있는게 cgroup이다.
도커 컨테이너가 Namespace 와 Cgroup 에 의해 격리될때 컨테이너가 사용할 파일 시스템도 격리되어야 한다.
Union File System (UnionFS) 은 서로 다른 파일 시스템이나 디렉토리를 합쳐서 하나의 논리적인 파일 시스템으로 컨테이너에게 제공한다.
참고 : edu-docker 이종현님 강의