본문 바로가기

Python/Docker Intro

Docker Intro - 2. Docker 개념

Docker Container를 왜 쓰는지, 어떠한 장점을 지니는지 간략하게 알아봤기 때문에

 

이제 Docker Container에서 사용되는 용어들에 대해서 알아보도록 하겠습니다.

 

도커의 전체 구조입니다.

 

 

Docker Client

도커의 엔드 유저 즉, 실 사용자를 말합니다.

보통은 도커 CLI를 통해 클라이언트에게 명령어를 전달하면, 이를 도커 데몬에게 전달합니다.

 

Docker Daemon

도커 데몬은 빌드, 실행, 배포등 클라이언트에게 받은 명령어를 수행합니다.

도커 데몬은 호스트 머신에서 돌아가나 유저가 직접 도커 데몬을 컨트롤 하지는 않습니다.

도커 클라이언트가 일반적으로는 호스트 머신에서 실행되지만,

다른 머신에 있는 동안 호스트 머신에 있는 도커 데몬과도 소통이 가능하기 때문입니다.

 

Dockerfile

도커파일은 어떠한 도커 이미지를 생성할 것인지 정의하는 파일입니다.

클라이언트가 작성된 도커파일을 가지고 빌드하여 이미지를 생성할 수 있습니다.

 

여기서 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있어야 하기 때문에, 용량이 수백MB까지 되기도 합니다.

처음 이미지를 받을 땐 괜찮으나, 계속해서 조금 변경 된 부분을 반영하고자 모든 부분을 저장한다면 상당히 비효율적이게 됩니다.

 

도커는 이런 부분을 Layer 개념을 활용하여 해결하고 있습니다.

이를 쉽게 생각하면 AWS EBS Snapshot 저장 구조와 거의 동일하다고 보실 수 있을 것 같습니다.

 

간단하게, 예시를 하나 보도록 하겠습니다.

 

FROM ubuntu:14.04
MAINTAINER Foo Bar <foo@bar.com>

RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx

VOLUME ["/data", "/etc/nginx/site-enabled", "/var/log/nginx"]

WORKDIR /etc/nginx

CMD ["nginx"]

EXPOSE 80
EXPOSE 443

 

위의 도커파일을 Docker build해 준 후 Layer를 살펴보면 아래와 같습니다.

 

 

위의 Layer를 살펴 보면,

CMD, LABEL, ENV, EXPOSE, STOPSINAL과 같은 메타데이터를 다루는 부분은 레이어로 저장되지 않고

ADD나 RUN이 일어나는 3단계만이 레이어로 저장됩니다.

이는 풀 받을 때 출력되는 레이어 갯수와 일치합니다.

 

그림으로 보면 위의 도커 파일로 만든 Image Layer는 아래와 같습니다.

 

 

즉, 이 부분들에 대한 레이어를 각각 저장하고 있다가

수정되는 부분들을 조합하여 이미지를 생성하기 때문에 도커 이미지에 대한 저장공간을 최적화 할 수 있습니다.

 

도커가 어떠한 구조로 되어있고, 어떠한 방식으로 작동하는지 간단하게 알아봤습니다.