욱'S 노트

Docker - 개요 본문

Programming/Docker

Docker - 개요

devsun 2015. 4. 29. 09:43

What is Docker?


도커는 어플리케이션을 개발, 설치, 실행하기 위한 오픈 플랫폼이다. 도커는 어플리케이션 더빨리 딜리버리하기 위해 설계되었다. 도커를 활용하면 인프라스트럭쳐로부터 어플리케이션을 분리할 수 있고, 인프라스트럭쳐를 어플리케이션처럼 관리할 수 있다. 도커는 코드 설치를 더 빠르게 테스트를 더 빠르게 배포를 더 빠르게 하여 코딩과 코드를 실행하는 사이클을 단축시켜준다.


도커는 경량 컨테이너 가상화 플랫폼과 워크플로우의 결합이다. 그리고 툴로서 어플리케이션을 관리하고 배포하는데 도움을 줄 것이다.


도커의 핵심은 컨테이너내에서 어플리케이션을 격리되고 보안적인 수행하는 방법을 제공하는 것이다. 격리와 보안은 호스트에 많은 컨테이너를 동시에 실행할 수 있다는 것이다. 경량 컨테이너의 핵심은 추가적인 하이퍼바이져가 없다는 것이다.


도커 툴과 플랫폼는 다음과 같은 경우에 활용된다.

  • 어플리케이션을 도커 컨테이너로 가지고 온다.
  • 컨테이너를 개발과 테스트를 위해 분산하고 설치한다.
  • 어플리케이션을 프로덕션 환경에 디플로이한다. 로컬이든 클라우드든 상관없다.

What Can I Use Docker for?

Faster delivery of your applications

도커는 개발 라이프사이클을 완벽하게 지원한다.  어플리케이션과 서비스가 포함된 로컬 컨테이너에서 개발자들이 개발할 수 있다.  그리고 또한 CI 및 배포 워크플로우와 통합할 수도 있다.

예를들어, 개발자가 로컬에 코드를 작성하면 해당 개발 스택을 도커를 통해 동료들과 공유할 수 있다.  또한 코드를 푸쉬하고 테스트 환경으로 적재한 다음 필요한 테스트를 수행할 수 있다. 테스트 환경으로 부터 도커 이미지를 프로덕션으로 푸쉬하여 코드를 배포할 수 있다.

Deploying and scaling more easily

도커 컨테이너 기반 플랫폼은 부하를 해결하는데 많은 도움을 준다. 도커 컨테이너는 개발자 로컬 호스트, 물리적인 서버, 데이터 센터의 가상 머신 또는 클라우드 환경 어디든지 구동될 수 있다.

도커의 이식성과 경량성은 부하에 대해 다이나믹하게 대처할 수 있게 해준다. 도커를 활용해 어플리케이션과 서비스를 재빨리 확장하고 축소시킬 수 있다. 도커의 속도는 스케일링은 거의 실시간으로 수행할 수 있을 정도 이다.

Achieving higher density and running more workloads

도커는 경량이고 빠르다. 하이퍼바이져 기반 가상 머신의 좋은 대안이다. 이것은 특히 high density 환경(클라우드, Paas)에 더욱 유용하다. 또한 소형 및 중형 환경에서도 유용하게 활용할 수 있다.

What are the major Docker components?

도커는 두가지 주요한 컴포넌트를 가진다.
도커 : 오픈소스 컨터이너 가상화 플랫폼
도커허브 : 도커 컨테이너를 공유하고 관리하는 SaaS 플랫폼

What is Docker's  architecture ?

도커는 클라이언트-서버 아키텍처를 이용한다. 도커 클라이언트는 도커 데몬과 통신한다. 도커 데몬은 도커 컨테이너를 생성하고 실행하고 분배하는 어려운 일을 담당한다. 도커 클라이언트와 데몬은 같은 시스템에서 실행 될 수 있고, 원격의 도커 데몬이랑 도커 클라이언트가 연결할 수도 있다. 도커 클라이언트와 데몬은 소켓 또는 RESTful API로 통신한다.


The Docker daemon

도커  데몬은 호스트 머신에서 수행된다. 사용자는 데몬과 직접 통신하지 않고 도커 컨테이너를 통해서 통신한다.

The Docker Client

도커 클라이언트는 docker 바이너리로 구성되며 도커와의 유저 인터페이스가 주 목적이다. 유저로 부터 커맨드를 전달받아 도커 데몬으로 전달한다.

Inside Docker

내부적으로 도커를 이해하기 위해 세가지 컴포넌트에 대한 알아볼 필요가 있다.
  • Docker images
  • Docker registries
  • Docker containers

Docker images

도커 이미지는 읽기전용 템플릿이다. 예를 들어 이미지는 아파치와 웹어플리케이션이 설치된 우분투의 이미지이다. 이미지는 도커 컨테이너를 생성하기 위해 사용된다. 도커는 새로운 이미지를 만들고 존재하는 이미지를 변경하기 위한 간당한 방법을 제공한다. 다른 사람이 만든 도커 이미지는 다운로드 받을 수 있다. 도커 이미지는 도커의 빌드 컴포넌트 이다.

Docker registries

도커 레지스트리는 이미지를 보관한다. 이미지는 업로드하고 다운로드할 수 있는 퍼블릭 또는 프라이빗 스토어 이다. 퍼블릭 도커 레지스트리는 도커 허브라고 불린다. 도커 허브는 활용할 수 있는 수많은 이미지들을 제공한다. 자신만의 이미지를 만들거나 이미 생성된 다른 이미지를 사용할 수도 있다. 도커 레지스트리는 도커의 분산 컴포넌트이다.

Docker containers

도커 컨테이너는 디렉토리랑 비슷하다. 도커 컨테이너는 어플리케이션을 실행하기 위해 필요한 모든 것들이 저장되어 있다. 각 컨테이너는 도커 이미지로 부터 생성되고, 도커 컨테이너는 실행, 시작, 중지, 삭제, 이동 될 수 있다. 각 컨테이너는 독립적으로 보안성이 있는 어플리케이션 플랫폼이다. 도커 컨테이너는 도커의 실행 컴포넌트 이다.

So how does Docker work?

1. 어플리케이션을 저장한 도커 이미지를 빌드할 수 있다.
2. 도커 이미지로부터 어플리케이션을 실행할 수 있는 도커 컨테이너를 생성할 수 있다.
3. 도커 이미지를 도커 허브나 내부 레지스트리로 공유할 수 있다.

How does a Docker image work?

도커 이미지는 읽기 전용 템플릿이며, 도커 컨테이너를 구동하기 위해서 사용된다고 했다. 각 이미지는 일련의 레이어들로 구성된다. 도커는 이러한 레이어들을 하나의 이미지로 구성하기 위해 유니온 파일 시스템을 사용할 수 있게 작성되었다. 유니온 파일 시스템은 브랜치로 알려진 분리된 파일과 디렉토리에 접근할 수 있게 해준다. 이는 투명하게 오버레이드를 위함이며, 하나의 논리적인 파일 시스템으로 구성한다.

이러한 레이어들이 도커가 경량화된 하나의 이유이다. 도커 이미지를 변경하면 새로운 레이어가 생성된다. 그러므로, 모든 이미지를 대체하거나 새로 리빌드하는 것이 아니라 레이어가 추가되거나 변경되는 것이다. 그러므로 모든 새로운 이미지를 분배할 필요없이 단순하게 업데이트 하는 것으로 도커 이미지 분배가 더 빠르고 심플해진다.

모든 이미지는 베이스 이미지로 부터 시작한다. 예를 들어 ubuntu는 베이스 우분투 이미지가 있고 fedora는 베이스 fedora 이미지가 존재하는 것이다. 또한 자신만의 이미지를 베이스로 새로운 이미지를 생성할 수도 있다. 예를 들어 Apache 이미지가 있다면 해당 이미지를 베이스로 하여 모든 웹어플리케이션 이미지를 생성할 때 활용할 수 있는 것이다.

도커 이미지를 베이스 이미지로 부터 심플하게 생성한 다음, 개별 instruction들을 일련의 스텝으로 서술하면 된다. 각 instruction들은 우리의 미리지에 새로운 레이어를 생성한다. 인스트럭션은 다음과 같은 액션을 포함한다.

커맨드를 실행한다.
파일 또는 디렉토리를 생성한다.
환경 변수를 생성한다.
이미지로 부터 컨터이너 구동시 실행할 프로세스

이러한 지시들은 DockerFile이라고 불리는 파일로 저장된다. 도커는 사용자가 이미지 생성을 요청했을때 도커 파일을 읽어서 지시들을 실행하고, 최종 이미지를 리턴한다.

How does a Docker registry work ?

도커 레지스트리는 도커 이미지의 저장소이다. 도커 이미지를 생성하면 퍼블릭 레지스트리인 도커 허브나 프라이빗 레지스트리로 푸쉬할 수 있다.

도커 클라이언트를 이용하여 레지스트리로부터 배포된 이미지를 찾거나 풀 다운할 수도 도커 호스트로 있다.

도커 허브는 퍼블릭 및 프라이빗 이미지 스토리지를 제공하며 퍼블릭 스토리는 누구나 조회하고 다운로드할 수 있다. 프라이빗 스토리지는 조회 결과에서 제외되며 허용된 유저만 풀다운 할 수 있다. 

How does a container work?

컨테이너는 OS, 유저 생성 파일 및 메타데이터로 구성된다.  각 컨테이너는 이미지로부터 생성된다. 이미지는 컨테이너가 유지하고 있어야 할 것들과 컨테이너가 구동되었을때 수행되어야 할 프로세스 그리고 다양한 설정관련 데이터가 기술되어 있다. 도커 이미지는 읽기 전용이다. 이미지로부터 도커가 컨테이너를 실행하면 이미지에 read-write 레이어가 추가되며 어플리케이션은 실행될수 있다.

What happens when you run a container?

도커 바이너리를 이용하거나 API를 통해서 도커 클라이언트는 도커 데몬에게 컨테이너를 실행하라고 명령할 수 있다.

$ sudo docker run -i -t ubuntu /bin/bash

커맨드를 자세히 살펴보자. 도커 클라이언트는 도커 바이너리를 이용하고 run 옵션을 통해서 새로운 컨테이너를 실행하라고 한다. 도커 데몬이 컨테이너를 실행하기 위해서 최소한의 정보들이 필요한데 다음과 같다.

  • 컨테이너를 생성할 때 사용할 도커 이미지, 여기서는 우분투 베이스 이미지이다.
  • 컨테이너가 구동되었을때 실행시키고 싶은 커맨드 여기는 /bin/bash 이다.

도커는 다음과 같이 수행한다.

  • 도커는 우분투 이미지를 풀한다. : 도커는 현재 우분투 이미지가 있는지 체크하고 로컬에 존재하지 않는다면, 도커 허브로 부터 다운로드 한다. 만약 이미지가 있다면 도커는 새로운 컨테이너를 위해 사용한다.
  • 새로운 컨테이너를 생성한다. : 도커가 이미지를 가지고 있다면 컨테이너를 생성할때 해당 이미지를 사용한다.
  • 파일시스템 할당 및 read-write 레이어 마운트 : 파일 시스템 상에 컨테이너가 생성되고 이미지에 read-write 레이어가 추가된다.
  • 네트워크/브릿지 인터페이스 할당 : 로컬호스트와 도커 컨테이너간 연결을 위한 네트워크 인터페이스 생성
  • IP 주소 셋업 : 풀로부터 사용가능한 IP 주소를 찾아내서 할당한다.
  • 명시된 프로세스 수행 : 어플리케이션을 수행한다.
  • 어플리케이션 결과 캡쳐 및 제공 : 어플리케이션 수행에 대한 로그를 제공하기 위해 표준 입출력과 연결한다.

The Underlying technology
Namespaces

도커는 namespaces라고 불리는 기술을 체택했으며, 이는 컨테이너라고 불리는 독립된 워크스페이스를 제공하기 위함이다. 컨테이너를 실행시키면 도커는 컨테이너를 위한 일련의 네임스페이스를 생성한다.

격리된 레이어를 제공한다. 컨테이너의 각 관점은 자신의 네임스페이스내에서 수행하고 외부로 접근할 수 없다. 

도커가 사용하는 몇몇의 네임스페이스는 다음과 같다.

pid : 프로세스 isolation을 위해 사용한다.
net : 네트워트 인터페이스를 관리하기 위해 사용한다.
ipc : ipc 리소를 관리하기 위해 사용한다.
mnt : 마운트 포인트를 관리하기 위해 사용된다.
uts : 커널과 버젼 분리를 위해 사용된다.

Control groups

도커는 cgroups 또는 control groups라고 불리는 기술을 사용한다. 독립된 환경에서 어플리케이션을 실행하는 키는 당신이 원하는 리소스만 사용하게 하는 것이다. 이것은 호스트에서 컨테이너가 좋은 multi-tenant citzen임을 의미한다. 컨트롤 그룹은 도커 컨테이너에 사용가능한 하드웨어 리소스를 공유하게 해준다. 필요하다면 제약 조건도 걸 수 있다. 예를 들어 특정 컨테이너에 메모리 사용량을 할당할 수 있다.

Union file systems

유니온 파일 시스템은 레이어 생성을 매우 가볍고 빠르게 만들어 준다. 도커는 컨테이너에 빌딩 블록을 제공하기 위해 유니온 파일 시스템을 사용한다. 도커는 다양한 유니온 파일 시스템을 사용할 수 있다 : AUFS, btrfs, cfs, DeviceMapper

Container format

도커는 컨테이너 포맷이라고 불리는 랩퍼로 컴포넌트들을 조합한다. 디폴트 컨테이너 포맷은 libcontainer이다. 도커는 또한 전통적인 리눅스 컨테이너 LXC를 지원한다. 미래에는 다양한 컨테이너 포맷을 지원할 것이다. : BSD, Solaris


'Programming > Docker' 카테고리의 다른 글

Docker - Build your own imag  (0) 2015.10.12
Docker - whalesay 이미지 찾아서 실행하기  (0) 2015.10.07
Docker - Images & Containers  (0) 2015.10.02
Docker - 설치  (0) 2015.04.29
Docker - 소개  (0) 2015.04.28
Comments