Docker(도커)란
- 컨테이너 기반의 오픈소스 가상화 플랫폼
- 즉, 어플리케이션을 패키징, 배포, 실행 하기 위한 플랫폼
Docker의 주요 구조
Docker Image(이미지)|engine
- 어플리케이션과 해당 환경을 패키지화한 것
- 어플리케이션에서 사용할 수 있는 파일시스템과 이미지가 실행될 때 실행되야 하는 실행파일 경로와 같은 메타데이터가 포함됨
- Server(서버)는 Docker engine 으로 불린다
Docker Registries(레지스트리)
- 도커 이미지를 저장하고 다른 사람이나 컴퓨터 간에 해당 이미지를 쉽게 공유할 수 있는 저장소
- 이미지를 빌드할 때 빌드하는 컴퓨터에서 이미지를 실행하거나 이미지를 레지스트리 푸시(push) 또는 업로드한 다음 다른 컴퓨터에서 이미지를 풀(pull)할 수 있다
- 일부 공개 레지스트리는 누구나 이미지를 가져올수 있으나, 비공개 레지스트리는 특정 사용자나 컴퓨터만 액세스할 수 있다
Docker Containers(컨테이너)
- 도커 기반 컨테이너 이미지에서 생성된 일반적인 리눅스 기반 컨테이너
- 각 컨테이너는 격리되어 관리하고 각 프로세스가 실행되는 형태
- 프로세스는 리소스 사용이 제한되어 있으므로, 할당된 리소스의 양(CPU, RAM등)만 엑세스하고 사용가능
- MSA(Micro Service Architecture) 기반으로 도커를 설계 시, docker는 한 컨테이너 당 하나의 application이나 프로세스를 실행하는 것을 권한다
Docker Client-Server
- 도커는 클라이언트와 서버 구조로 이루어져 있다
- 클라이언트가 서버에 명령을 전달하고 서버는 이 명령을 실행한다
- Docker binary 커맨드가 Docker 클라이언트이고, Dockerd가 docker daemon 혹은 dokcer enine이다.
Docker Image
- 컨테이너 싱행에 필요한 파일과 설정값등을 포함하고 있는 것.
- 상태값을 포함하지는 않는다.(Immutable)
- 컨테이너는 이미지를 실행한 상태를 볼수 있거나 추가되거나 변경된 값은 컨테이너에 저장.
- 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있음.
- Base가 되는 image를 부모image라고하며, 맨 위의 이미지 부터 가장 밑 부분의 image까지 횡단 하는 구조로 되어있다.
- filesystem / image를 수정하는 구조가 아니라 read-only filesystem / image 들을 서로 위에 layer 시키되 union mount 기법으로 마지막에는 하나의 파일 시스템으로 보이는 구조를 가지고 있다.
- 이러한 패턴을
copy on write
패턴이라고 함.
copy on write
패턴구조는 Dockerfile 을 이용해 docker image 를 빌드할때 효과적.
Docker image layer
Boot Layer(boot filesystem bootfs)
- 일반적인 Linux boot 파일시스템으로 이루어져 있음
- 사용자가 직접 사용할 일은 없으며, 컨테이너가 부팅이 되면 메모리영역으로 옮겨져서 boot 파일시스템은 unmount된다
Root Layer(rootfs)
- 실제 OS가 설치되는 Layer
- root filesystem은 처음 mount될 때 read-only로 mount되고, integrity check후 read-write 모드로 변경된다
- 하지만 Docker에서는 read-only모드
images
Boot Layer
그리고 Root Layer
가 올라가고 image들이 올라간다
- 어플리케이션 image들이 이에 해당한다.
- 빌드 할때 처음부터 빌드하는 것이 아니라 최종적으로 올라간 image만 read-write모드로 mount한다.
- 도중에 실패하더라도 마지막으로 성공한 instruction은 빌드된 상태임으로, image shell에서 debuging이 가능하다.
Container(컨테이너)란
- 격리된 공간에서 프로세스를 동작하는 기술
- 즉 프로세스들을 한정된 리소스 안에서 각각 격리 시키는 것
- 가상화 기술이지만 가상머신과는 다른 방식
- Docker container는 하나 혹은 그 이상의 프로세스를 실행 시킬수 있다 (하지만 하나의 프로세스만 실행시키는 것을 권장)
- 리눅스 네임스페이스(namespace)으로 각 독립된 뷰로 시스템을 나누고,
리눅스 컨트롤 그룹(Group)으로 프로세스가 사용할 수 있는 리소스(CPU, 메모리, 네트워크 대역폭 등)을 제한한다
리눅스 네임스페이스(namespace)
- 리눅스 시스템이 초기 구동 시 하나의 네임스페이스가 존재
- 각 네임스페이스를 생성하고 리소스를 구성한다
네임스페이스 종류
- 마운트(mnt)
- 프로세스ID(pid)
- 네트워크(net)
- 프로세스 간 통신(ipc)
- 호스트와 도메인 이름(uts)
- 사용자ID(user)
Container(컨테이너)와 VM(가상머신) 비교
- VM(Vitrual Machine)기술은 한정된 호스트 OS위에 게스트 OS를 가상하여 여러개를 운영하는 방식
- 호스트 OS위에 OS를 설치하든, CPU의 가상화 기술(Hypervisor Vitual Machine)을 사용하여 OS설치하든, 오버헤드(Overhead)의 리소스가 필요함
- 하지만 컨테이너 방식으로 각각의 리소스를 나누고 프로세스를 격리화 시킴으로 VM보다는 가볍고 빠르게 동작을 함
- VM에서 어플리케이션을 실행하고자 하면 게스트OS의 부팅이 필요한데, 컨테이너 방식은 실행 즉시 프로세스만 실행되는 형태
- 따라서 컨테이너 방식이 오버헤드도 낮고 가볍고 빠르게 동작한다
- 즉, 호스트OS위에 OS를 실행하느냐, 프로세스를 실행하느냐의 차이