Docker #2. Docker 기초

Docker 기초

Docker란

Docker는 애플리케이션과 그에 필요한 라이브러리들을 Docker Images로 패키징하여 Container라는 표준화된 규격으로 패키징한 애플리케이션을 신속하게 실행 및 배포할 수 있는 오픈소스 플랫폼이다.

쉽게 말해, Docker Image를 이용하여 Container를 실행하기 위한 플랫폼이다.

Docker editions

Docker는 2가지 형태의 Edition을 제공한다.

  • Community Edition (CE)
  • Enterprise Edition (EE)

Docker Community Edition (CE)은 무료버전으로 개인 및 작은 팀단위로 Docker를 활용할때 유용하다.

Docker Enterprise Edition (EE)은 기업용 유료버전으로 운영환경을 염두해둔 Docker버전으로 CE버전에 비해 보다 많은 기능을 제공한다.

Capabilities Docker Engine - Community Docker Engine - Enterprise Docker Enterprise
Container engine and built in orchestration, networking, security yes yes yes
Certified infrastructure, plugins and ISV containers   yes yes
Image management     yes
Container app management     yes
Image security scanning     yes

Docker를 사용해야하는 이유

신속성

Docker는 VM과는 달리 Hypervisor의 로딩없이 Host Linux Machine의 Kernel안에서 Container를 실행하기 때문에 가볍고 빠르게 동작한다.

Docker엔지니어링

확장성

Docker가 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하기 때문에 Docker를 사용하는 Linux서버환경이라면 어디서나 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있다.

신속한 배포

예전에는 새로운 하드웨어를 준비하고, 실행하고, 프로비저닝하고, 사용할 수 있게 하려면 일반적으로 며칠이 소요됐었다.

Docker 기반 컨테이너는 Registry와 Image 기반의 배포로 컨테이너를 생성함으로써 표준화되고, 신속한 배포를 가능하게 해준다.

비용절감

Docker는 패키징된 애플리케이션을 신속하게 배포하기위해 Host Infrastructure로부터 분리되어 있다.

또한, Hypervisor의 로딩없이 Host Linux Machine의 Kernel안에서 실행하기 때문에 가볍고 빠르게 동작한다.

동일한 하드웨어 리소스하에서 가상머신(VM)을 이용하는 것보다 상당히 많은 수의 애플리케이션을 실행할 수 있어 비용 측면에서 VM에 비해 유리하다.

이는 수많은 서비스를 사용하는 MSA에서 굉장한 이점으로 작용한다.

Docker Architecture

Docker는 기본적으로 클라이언트-서버 아키텍처로 구성되어있다. Client는 사용자의 인터페이스를 담당하는 부분이고 Server인 Docker daemon은 Client로부터온 요청(컨테이너 다운로드, 실행 및 배포 등)을 수행한다.

Docker Architecture Diagram

Docker Client와 Daemon은 같은 Host에서 구성되거나 Docker client를 원격 daemon에 연결할 수도 있다.

The Docker daemon

Docker daemon (dockerd)은 Docker Object(Container, Network, Volume 등)에 대한 Docker API 요청을 요청받아 처리하는 서비스다.

The Docker client

Docker client (docker) 는 Docker 유저와 인터렉션하는 주요 사용자 인터페이스다. 사용자가 docker run 과 같은 명령어를 사용하면 Docker Client는 이 명령어를 dockerd로 전송하는 역할을 수행한다.

Docker registries

Docker registry는 Docker image들을 저장하는 저장공간이다.

Docker를 사용해 서버에 배포를 한다는 것은 일반적으로 사용자가 어떠한 형태로든 docker pull, docker run 등과 같은 명령어로 Docker registry에서 이미지를 Docker Host에 다운로드 받아 Container를 수행한다는것을 의미한다.

Docker registry는 Docker Hub와 같은 누구나 사용가능한 Public 레지스트리와 팀이나 기업내에서 자체 구축할 수 있는 Private 레지스트리로 구분될 수 있다.

Container

Container는 Linux 커널의 여러 기능을 활용하여 Container라는 격리된 공간 안에서 프로세스가 동작하는 기술이다.

가상머신(VM)과 동일한 효과를 보이지만 다른 점이 있다.

기존의 가상머신은 호스트의 하드웨어와 OS전체를 가상화하여 무겁고 느리지만, 컨테이너는 호스트 OS(리눅스) 커널의 기능을 공유하여 서버의 운영 체제를 프로세스의 격리/가상화를 통하여 가상머신에 비해 월등히 빠른 실행속도를 보인다.

Docker는 이러한 컨테이너를 위한 운영 체제(또는 런타임) 역할을 수행한다.

즉, Docker는 Linux 커널의 여러 기능을 활용하여 프로세스를 격리시켜 Container를 생성하고, 생성된 Container에서 Docker이미지를 실행한다.

Image

Image는 애플리케이션을 실행하기 위한 Runtime, libraries, Source 등이 포함되어 단독으로 실행가능한 SW패키지이다.

Docker엔지니어링

Image Layer

Image 파일은 일련의 계층인 Layer로 이루어져 있으며 이 계층들은 단일 이미지로 결합된다.

여기서 일련의 계층, Layer란 애플리케이션을 구동하기위한 runtime, lib, src 등으로 구성된 파일시스템으로 아래 dockerfile에서 FROM, RUN, COPY 명령어가 이루어질때마다 각각의 Layer가 추가된다.

FROM alpine:latest
RUN apk add --update curl && rm -rf /var/cache/apk/*
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["curl"]

Read Only + Read Write Image Layer

Docker에서 컨테이너가 실행되면, 실행 또는 복사와 같은 명령을 저장할 수 있는 R/W 계층이 생성되고, 그 하위의 Layer들은 R/O 속성을 지닌다.

Read Write Image Layer

Docker엔지니어링

이렇게 함으로써, 하나의 이미지로부터 여러개의 서로 다른 Container 프로세스를 실행할 수 있게 되었다. 원본 이미지의 수정없이 Container마다 생성된 R/W 레이어를 수정함으로써 컨테이너마다 다른 정보를 저장할 수 있게 된 것이다.

또한, 같은 이미지를 여러개의 Container로 실행하게 되면 읽기만 가능한 Layer들은 컨테이너를 여러개 실행해도 아래 그림과 같이 공유해서 사용할 수 있기 때문이다.

이것은 배포단계에서 큰 장점을 가지고 있다.

이미 로컬에 Layer가 존재하는 것은 다시 다운로드 받지 않기 때문에 Container가 실행될 때 작은 Size로 이미지를 Pull해 실행하여 하드웨어 자원측면에서 유리하다. 또한, 별도의 다운로드를 받지 않으므로 빠른 속도로 배포/실행되기 때문에 실행측면에서도 상당히 유리하다.

신규로 이미지를 만들때도 아래와 Layer 형태로 구성되는 것도 알아두면 좋다.

참고

  1. Get started with Docker Desktop for Mac
  2. Docker Desktop for Mac
  3. Docker Containers - Talk Linux Day 2015

태그:

카테고리:

업데이트:

댓글남기기