DevOps/Docker

[ Docker #02 알아보기 2/5 ] -Docker Engine과 용어 이해

Docker Engine Architecture

 

들어가며..

Docker를 공부하다보면 어떻게 구성되어 있는지 궁금하게 됩니다.

기존 포스팅 [Docker #01 알아보기] - 도커란 무엇인가? [1/5] 에서는

도커에 대하여 간단하게 다루었지만, 이번 포스팅에서는 용어부터 상세하게 설명드리도록 하겠습니다.

 

 

도커 엔진이란?

Docker Engine은 클라이언트와 서버 아키텍처를 따르는 애플리케이션이며

호스트 시스템에 설치되어 기본적으로 3가지 구성요소를 가지고 있습니다.

 

Server : Dockered라는 Docker daemon을 통해 도커 이미지를 만들고 관리할 수 있습니다.

REST API : Docker 데몬에게 무엇을 할지 지시하는 용도로 사용됩니다.

CLI (Command Line Interface) : 도커 명령어를 입력하는데 사용되는 클라이언트 입니다.

 

 

도커 객체란?

Docker로 작업할 때는 이미지, 컨테이너, 볼륨, 네트워크를 사용합니다. 이것들을 모두 Docker 객체라고 표현합니다.

 

 

도커 이미지란?

필요한 프로그램과 라이브러리, 소스를 설치한 뒤 만든 하나의 파일입니다.

이미지는 컨테이너를 만드는 설명이 포함된 읽기 전용 템플릿으로

상태값을 가지지 않고 변하지 않는 특성이 있습니다.

 

Docker images는 Docker Hub에서 가져와서 사용하거나

컨테이너로 실행시켜 추가되거나 변하는 값을 다시 이미지로 만들 수 있습니다.

또한 Dockerfile을 사용하여 고유한 Docker 이미지를 만들 수도 있습니다.

컨테이너를 실행시키기 위한 모든 사항들을 Dockerfile에 작성하면 됩니다.

정리하면 컨테이너 실행에 필요한 모든 파일과 설정값을 가진 읽기 전용 템플릿입니다.

 

이미지는 지속적으로 수정사항들을 업데이트할 수 있으며

컨테이너 → 이미지 → 컨테이너 → 이미지 를 반복하는 경우

용량은 200MB 단위부터 20GB 이상도 가능해집니다.

 

이러한 과정에서 Docker는 레이어(Layer)라는 개념을 사용합니다.

기존 이미지 레이어 위에 read-write 레이어를 추가하는 방식으로

유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일 시스템으로 사용할 수 있도록 합니다.

 

* 유니온 파일 시스템 :

읽기전용의 파일을 수정할 때 쓰기가 가능한 파일을 임시로 생성하고

수정이 끝나는 경우 기존의 읽기 파일로 대체되는 방식의 파일 시스템이다.

Docker Layer

위와 같은 Layer가 쌓이는 방식으로 이미지가 만들어지기 때문에

파일이 수정될 때마다 원본 이미지에 대한 중복을 없애고 수정된 값만을 관리합니다.

즉, 새로운 버전 전체를 설치할 필요 없이 추가된 새로운 레이어만 다운받으면 됩니다.

 

 

도커 컨테이너란?

이미지를 기반으로 독립된 공간에서 실행한 가상환경입니다.

일반적으로 컨테이너는 배를 통해 물품들을 유통할 때 사용하는 커다란 수송용 박스를 의미하며

각 컨테이너에는 다양한 종류가 들어갈 수 있으나 철저하게 규격화되어 있으며 쉽게 옮겨 실을 수 있습니다.

 

크게는 시스템 컨테이너와 애플리케이션 컨테이너 총 2가지로 나누어집니다.

시스템 컨테이너는 운영체제 위에 하드웨어 가상화 없이 운영체제를 실행시킵니다.

어플리케이션 컨테이너는 MariaDB, Python 등 필요한 프로그램만 Docker로 별도 실행시킬 수 있습니다.

 

컨테이너는 특히 오버헤드가 적기 때문에 가볍고 고속으로 작동하는 것이 특징입니다.

다수의 컨테이너를 OS커널에서 직접 구동하므로 훨신 가볍게 운연체제 커널을 공유하며

운영체제 전체 부팅보다 메모리를 적게 사용합니다.

 

도커 이미지를 실행하면 컨테이너가 생성됩니다.

모든 애플리케이션 및 환경은 해당 컨테이너에서 실행됩니다.

CLI 또는 Docker API 등을 통해 컨테이너를 실행, 중지, 삭제할 수 있습니다.

 

 

도커 데몬이란?

도커 데몬(dockerd)은 도커의 API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨과 같은 도커 객체를 관리합니다.

데몬은 도커 서비스를 관리하기 위해 다른 데몬들과 통신 할 수 있습니다.

 

 

도커 레지스트리란?

도커 이미지를 업로드해서 공유하는 저장소를 도커 레지스트리(Docker Registry)라고 합니다.

도커의 공식 레지스트리인 Docker Hub를 통해 다른 도커 사용자들의 이미지들을 가져올 수 있으며

docker pull, docker run 등의 CLI 명령어를 실행하여 필요한 도커 이미지를 가져올 수 있습니다.

 

CentOS, Ubuntu 등의 OS 이미지부터

MariaDB, MongoDB, Nginx와 같은 미들웨어 이미지

NodeJS, Golang, OpenJDK 과 같은 플랫폼 이미지도 제공하고 있습니다.

 

위와 같은 베이스 이미지들을 활용한다면 환경 구축을

기존보다도 빠르고 안전하게 자동으로 구축할 수 있습니다.

이에 따라 개발 환경이 맞지 않아 생기는 문제들을 해결할 수 있으며

개인이 만든 애플리케이션도 이미지로 만들어 안전하게 업로드 및 배포할 수 있습니다.

또한 Docker Hub에서 제공하는 이미지 버전관리를 통해 관리하여

언제나 기존 버전으로도 복원이 가능합니다.

 

 

도커 레파지토리란?

도커 레파지토리(Docker Repository)는 이름이 같지만 태그가 다른 도커 이미지들의 논리적 모음입니다.

$ docker images 를 조회하는 경우

동일한 Repository들의 이름을 확인할 수 있으나

각 TAG의 구분으로 독립 된 이미지임을 확인할 수 있습니다.

 

도커 클라이언트란?

호스트에 명령을 내리는 인터페이스이며 보통 Terminal에서 CLI 명령어 기반으로 진행됩니다.

CLI명령어를 통해 실행될 때 클라이언트는 이를 데몬으로 보내어 실행시킵니다.

 

 

도커 볼륨이란? 바인드 마운트란?

도커 컨테이너를 생성하면 컨테이너의 데이터는 기본적으로 볼륨(volume)에 저장됩니다.

기본적으로 생성한 컨테이너를 제거하는 경우 볼륨에 저장된 내부 데이터도 함께 사라지게 됩니다.

 

이러한 컨테이너의 생명주기와 상관없이 데이터를 Host의 저장할 수 있는 기능이 있습니다.

볼륨의 설정을 Host의 특정 폴더 경로를 마운트하는 방법입니다.

데이터를 저장켜 지속적으로 저장할 수 있는 그 기능을 바인드 마운트(bind mount)라고 부릅니다.

자세한 방법은 이후 [Docker 따라하기] 포스팅을 통해 다루도록 하겠습니다.

 

 

도커 네트워크란?

도커 네트워크는 모든 격리된 컨테이너가 통신하는 통로입니다.

도커에는 총 5가지의 네트워크 드라이버가 있습니다.

 

- Bridge : 컨테이너의 기본 네트워크 드라이버입니다. 도커를 설치한 후 Host의 네트워크 인터페이스를 보면 docker0라는 가상 인터페이스가 생깁니다. docker0은 일반적인 가상 인터페이스가 아니며 도커 자체적으로 제공하는 드라이버로 어플리케이션이 독립형 컨테이너에서 실행될 때에 이 네트워크를 사용합니다.

 

- Host : Docker 컨테이너와 Docker 호스트간의 네트워크 격리를 제거합니다. 호스트와 컨테이너 사이에 네트워크 격리가 필요하지 않을 때 사용합니다.

 

- Overlay : 컨테이너가 다른 Docker 호스트에서 실행 중이거나 Swarm 서비스가 여러 어플리케이션에 의해 형성될 경우에 사용됩니다.

 

- None :  모든 네트워킹을 비활성화 합니다.

 

- Macvlan : 물리적 주소처럼 보이도록 하기위해 Mac 주소를 컨테이너에 할당합니다. 네트워크 트래픽은 컨테이너간 mac 주소를 통해 라우팅 됩니다. 이 네트워크는 VM 설정을 마이그레이션 하는 동안 컨테이너를 물리적 장치처럼 보이게 하려는 경우에 사용됩니다.

 

 

 

다음 포스팅 : [ Docker #02 알아보기 2/5 ] -Docker Engine과 용어 이해