Docker란

Docker

컨테이너 기반의 오픈소스 가상화 플랫폼

Docker

도커는 컨테이너라고 하는 느슨한 환경에서 어플리케이션을 개발, 배포, 실행하는 플랫폼이다. 리눅스 컨테이너는 어플리케이션 배포에 쓰이며, containerization으로 불린다. 컨테이너 자체는 새로운 개념은 아니다. 도커 컨테이너는 hypervisor의 로드가 필요 없기 때문에 lightweight (경량) 이지만, host 시스템의 커널 내에서 직접 실행된다. 즉, 주어진 하드웨어에서 가상 머신을 사용할 때 보다 더 많은 도커 컨테이너를 실행할 수 있다.

hypervisor

호스트 컴퓨터 1대에서 다수의 운영 체제를 동시에 실행할 수 있도록 해주는 가상 플랫폼 기술을 말한다.

VMM (Virtual Machine Monitor) 라고도 불린다. 하이퍼바이저는 여러 개의 OS가 단일 하드에어 호스트를 공유할 수 있도록 하는 프로그램이다.

Docker Engine

1544419645363

Docker Engine은 하기의 세 가지 요소들로 구성된 client-server 어플리케이션이다.

  • Server : daemon process 라고 하는 장기 실행 프로그램 유형의 서버
  • REST API : 프로그램이 daemon과의 주고 받을 인터페이스를 지정
  • CLI client : Command Line Interface (docker 이용)

CLI는 Docker REST API를 사용하여 command 를 통해서 또는 스크립트를 통해서 Docker daemon을 제어한다.

Docker Architecture

도커는 client-server 구조를 이용한다. Docker client는 command를 통해 Docker daemon과 상호작용한다. Docker daemon은 Docker container를 빌드, 실행 및 배포하는 작업을 수행하는 역할을 한다.

Docker client 와 Docker daemon은 같은 시스템 상에서 동작할 수도 있고, Docker client를 원격 Docker daemon에 연결할 수도 있다. Docker client와 Docker daemon은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다,

1544420253744

Docker Daemon

Docker daemon (dockerd) 은 Docker API request 를 받고, 도커 이미지, 도커 컨테이너, 네트워크 및 볼륨과 같은 Docker object를 관리한다. Docker daemon은 Docker service를 관리하는 다른 daemon과도 통신할 수 있다.

Docker Client

Docker client(docker) 는 Docker 사용자가 Docker와 소통하는 주요 방식이다.

docker run 이라는 command를 통해 client는 dockerd로 보낸다. docker command는 Docker API를 사용한다. Docker client는 하나 이상의 daemon과 통신할 수 있다.

Docker registries

Docker registry는 Docker image를 저장하는 저장소이다. Docker Hub, Docker Cloud가 누구나 사용할 수 있는 public registry 이며, Docker는 기본적으로 Docker Hub에서 도커 이미지를 찾도록 구성되어있다. Docker Hub를 사용하지 않고, 개인적인 저장소를 사용해도 된다. Docker Datacenter(DDC)를 사용하는 경우, Docker Trusted Registry (DTR)이 포함된다.

docker pull 이나 docker run 커맨드를 이용하는 경우, 설정된 레지스트리에서 docker image를 땡겨온다.

docker push 커맨드를 이용하면, 해당 레지스트리에 도커 이미지를 push 한다. Git 과 비슷하다고 보면된다.

Docker objects

Docker를 사용하면, image를 만들거나, image, container, network, volume, plugin 등의 Docker object를 사용한다. Docker object에는 image, container, network 등이 있는데, image와 container 에 대해서만 소개하겠다.

Docker images and containers

도커에는 Image와 Container라는 중요한 개념이 있다.

Docker image

도커 이미지는 어플리케이션을 실행시키기 위해 필요한 모든 코드, 라이브러리, 환경 변수, 설정 파일 등을 포함하고 있는 실행 가능한 패키지 라고 할 수 있다. 도커 컨테이너를 만들기 위한 명령어가 들어있는 read-only template이다.

도커 이미지는 다른 이미지를 기반으로 할 수도 있고, 사용자가 직접 이미지를 만들 수도 있으며, 다른 사람이 만들어 registry에 올린 이미지를 사용할 수도 있다. 직접 이미지를 만들기 위해선, 이미지를 만들고 실행할 수 있는 Dockerfile 을 작성해야 한다. Dockerfile은 파일 내 명령어를 통해 이미지 내 layer를 만든다. 도커에서는 Dockerfile 수정을 하고 image를 다시 빌드했을때, 수정된 부분의 layer 만 변경이된다. 이러한 특성으로, 도커는 다른 가상 머신보다 가볍고, 빠르다고 할 수 있는 것이다.

Docker Container

도커 컨테이너는 도커 이미지의 실행 가능한 인스턴스라고 할 수 있다. 도커 컨테이너는 Docker API나 CLI를 사용하여 create, start, stop, move, delete 할 수 있다. 도커 컨테이너는 하나 이상의 네트워크에 연결할 수도 있고, 저장소를 붙일 수도 있고, 현재 상태에 기반하여 새로운 이미지를 생성할 수도 있다.

기본적으로, 도커 컨테이너는 다른 컨테이너, host machine 으로부터 상대적으로 잘 분리되어있다.

1. Docker image

Docker image는 필요한 프로그램과 라이브러리, 소스를 설치한 뒤 파일로 만든 것이다. 즉, 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로, 상태값을 가지지 않고 변하지 않는다.

2. Docker Container

Docker Container는 이미지를 실행한 상태로, 이미지로 여러 개의 컨테이너를 만들 수 있다. OS로 비유해보면, Docker image는 실행 파일이고, Docker Container는 프로세스라고 할 수 있다.

새로운 서버가 추가되면, Docker image를 다운 받고 컨테이너 생성만 하면 된다.

참고 : https://docs.docker.com/get-started/

https://docs.docker.com/engine/docker-overview/#docker-architecture