[Docker] 도커의 기능, 구조, 데이터 관리 장치
1. 도커의 기능
1) 도커 이미지를 만드는 기능 (Build)
도커는 애플리케이션의 실행에 필요한 프로그램 본체, 라이브러리, 미들웨어, OS나 네트워크 설정 등을 하나로 모아 이미지를 만든다. 도커 이미지는 실행 환경에서 움직이는 컨테이너의 바탕이된다. 도커에서는 하나의 이미지에는 하나의 애플리케이션만 넣어두고, 여러 개의 컨테이너를 조합하여 서비스를 구축하는 방법을 권장한다.
도커 이미지는 쉽게 말해 애플리케이션의 실행에 필요한 파일들이 저장된 디렉토리이다. 도커 명령을 통해 이미지를 tar 파일로 출력할 수 있다. 도커 이미지는 도커 명령어나 Dockerfile 설정 파일로 이미지를 만들 수 있다. 도커 이미지는 겹쳐서 사용할 수 있기에 새로 다른 이미지를 만들 수 있다.
2) 도커 이미지를 공유하는 기능 (Ship)
도커 이미지는 도커 레지스트리에서 공유할 수 있다. 실제로 Docker Hub에서는 Ubuntu, CentOS 같은 Linux 배포판의 기본 기능을 제공하는 베이스 이미지를 배포하고 있다. 이 베이스 이미지에 미들웨어나 라이브러리, 전개할 애플리케이션 등을 넣은 이미지를 겹쳐 독자적인 도커 이미지를 만들 수 있다. 깃허브에서 Dockerfile을 관리하고 이미지를 자동으로 생성하여 공개할 수 도 있다. (Automated Build)
3) 도커 컨테이너를 작동시키는 기능 (Run)
도커는 Linux 상에서 컨테이너 단위로 서버 기능을 작동시킨다. 도커 이미지를 통해서는 여러 개의 컨테이너를 기동시킬 수 있으며 도커의 명령에 따라 컨테이너의 기동, 정지, 파기할 수 있다.
도커는 하나의 Linux 커널을 여러 개의 컨테이너에서 공유한다. 컨테이너 안에서 동작하는 프로세스를 하나의 그룹으로 관리하고 그룹마다 각각 파일 시스템이나 호스트명, 네트워크 등을 할당하고 있다. 그룹이 다를 경우 액세스가 불가한 구조를 이용하여 컨테이너를 독립된 공간으로서 관리하고 있다. 이를 위해서는 Linux 커널 기능(namespace, cgroups 등) 기술이 필요하다.
제품 환경에서는 모든 도커 컨테이너를 한 대의 호스트 머신에서 작동시키는 일은 드물며, 시스템의 트래픽 증감이나 가용성 요건, 신뢰도 요건 등을 고려한 후에 여러 대의 호스트 머신으로 된 분산 환경을 구축한다. 그리고 보통 컨테이너 관리에 대해서는 오케스트레이션 툴을 이용하는 것이 일반적이다.
4) 도커 에디션 및 플랫폼
에디션 | 설명 |
Docker Community Edition (CE) | 도커사가 제공하는 무료 에디션이다. 로컬 환경에서 사용하는 경우 및 상용 지원이 불필요한 환경에서 애플리케이션 실행 호나경을 이용할 때 적합하다. |
Docker Enterprise Edition (EE) | 도커사가 지원하고 상용 이용에 적합한 에디션이다. 베이직, 스탠다드, 어드밴스드 3 종류가 있다. |
도커가 지원하는 플랫폼은 에디션마다 다르다. 또한 도커는 에디션 마다 정기적으로 릴리스가 일어난다. 버전 번호는 연도 2자리, 월 2자리로 표현된다.
종류 | 플랫폼 |
서버 OS용 | Ubuntu, Debian, CentOS, Fedora |
퍼블릭 클라우드용 | Microsoft Azure, Amazon Web Services |
클라이언트 OS용 | Microsoft Windows 10, MacOS |
5) 도커 컴포넌트
컴포넌트 | 설명 |
Docker Engine | 도커의 핵심 기능으로 이미지를 생성하고 컨테이너를 가동시키기 위한 기능이다. 도커 명령의 실행이나 Dockfile에 의한 이미지도 생성한다. |
Docker Registry | 컨테이너의 바탕이 되는 도커 이미지를 공개 및 공유하기 위한 레지스트리 기능이다. |
Docker Compose | 여러 개의 컨테이너 구성 정보를 코드로 정의하고 명령을 실행함으로서 애플리케이션의 실행 환경을 구성하는 컨테이너들을 일원 관리하기 위한 툴이다. |
Docker Machine | 로컬 호스트용은 VirtualBox를 비롤하여 AWS EC2, Microsoft Azure와 같은 클라우드 환경에 도커의 실행 환경을 명령으로 자동 생성하기 위한 툴이다. |
Docker Swarm | 여러 도커 호스트를 클러스터화하기 위한 툴이다. Docker Swarm에서는 클러스터를 관리하거나 API를 제공하는 역할은 Manager가, 도커 컨테이너를 실행하는 역할은 노드가 담당한다. (Kubernetes 사용 가능) |
2. 도커 동작 구조
1) namespace
도커는 컨테이너라는 독립된 환경을 만들고, 그 컨테이너를 구획화하여 애플리케이션의 실행 환경을 만든다. 이 컨테이너 구획 기술은 Linux 커널의 namespace 기능을 사용하고 있다. namespace는 '이름공간'이라는 뜻으로 한 덩어리의 데이터에 이름을 붙여 분할함으로 충돌 가능성을 줄이고 쉽게 참조할 수 있게 하는 개념이다.
namespace | 설명 |
PID namespace | PID namespace는 Linux에서 각 프로세스에 할당된 고유한 ID인 PID와 프로세스를 격리한다. |
Network namespace | 네트워크 디바이스, IP 주소, 포트 번호, 라우팅 테이블, 필터링 테이블 등 네트워크 리소스를 격리한다. (호스트 OS 상에서 사용 중인 포트가 있더라도 컨테이너 안에서 동일한 번호의 포트 사용 가능) |
UID namespace | UID, GID를 namespace 별로 독립적으로 가질 수 있다. 보안이 뛰어난 환경으로 격리시킬 수 있다. |
MOUNT namespace | 컴퓨터에 연결된 기기나 기억장치를 OS에 인식시켜 이용 가능한 상태로 만드는 MOUNT를 namespace 안에 격리된 파일 시스템 트리로 만들어 격리시킨다. |
UTC namespace | 호스트명이나 도메인명을 독자적으로 가질 수 있다. |
IPC namespace | 프로세스 간의 통신(IPC) 오브젝트를 namespace 별로 독립적으로 가질 수 있다. |
2) cgroups
도커에서는 물리 머신 상의 자원을 여러 컨테이너가 공유하여 동작한다. Linux 커널의 기능인 'control groups' 기능을 이용하여 자원의 할당 등을 관리한다. cgroups는 프로세스와 스레드를 그룹화하여, 그 그룹 안에 존재하는 프로세스와 스레드에 대한 관리를 수행하기 위한 기능이다. 대표적으로 호스트 OS의 CPU나 메모리와 같은 자원에 대해 그룹별로 제한을 둘 수 있다. cgroups로 컨테이너 안의 프로세스에 대해 자원을 제한함으로 동일한 호스트 OS상에서 동작하는 다른 컨테이너에 영향을 주는 일을 막을 수 있다.
항목 | 설명 |
cpu | CPU 사용량을 제한 |
cpuacct | CPU 사용량 통계 정보를 제공 |
cpuset | CPU나 메모리 배치를 제어 |
memory | 메모리나 스왑 사용량을 제한 |
devices | 디바이스에 대한 액세스 허가/거부 |
freezer | 그룹에 속한 프로세스 정지 및 재개 |
net_cls | 네트워크 제어 태그를 부가 |
bikio | 블록 디바이스 입출력량 제어 |
cgroups는 계층 구조를 통해 프로세스를 그룹화하여 관리할 수 있다. 각각의 그룹에 CPU 사용량을 할당할 수 있으며, 부모자식 관계에서는 자식이 부모의 제한을 물려받는다.
3) 네트워크 구성
Linux는 도커를 설치하면 서버의 물리 NIC가 도커라는 가상 브리지 네트워크로 연결된다. 이 docker0은 도커를 실행시킨 후에 기본으로 만들어진다. 도커 컨테이너가 실행되면 컨테이너에 172.17.0.0/16이라는 서브넷 마스크를 가진 프라이빗 IP 주소가 eth0으로 자동 할당된다. 이 가상 NIC는 OSI 참조 모델의 2계층인 가상 네트워크 인터페이스로 페어인 NIC와 터널링 통신을 한다.
도커에서는 NAPT(IP 마스커레이드)기능을 이용하여 외부 네트워크 통신을 사용한다. 하나의 IP 주소를 여러 컴퓨터가 공유하는 기술로 IP 주소와 포트 번호를 변환하는 기능이다. 도커에서는 NAPT에 Linux의 iptables를 사용하고 있다. 즉, 도커에서는 이 기능을 사용할 때 컨테이너 시작 시에 컨테이너 안에서 사용하고 있는 포트를 가상 브리지인 docker0에 대해 개방한다.
3. 데이터 관리 장치
복사를 요구받아도 바로 복사하지 않고 원래의 데이터를 그대로 참조시켜 원본 또는 복사 어느 쪽에 수정이 가해진 시점에 빈 영역을 확보하고 데이터를 복사하도록 하는 장치를 'Copy on Write'라고 한다. 도커는 이 방식으로 컨테이너의 이미지를 관리한다.
스토리지 디바이스 | 설명 |
AUFS | 다른 파일 시스템의 파일이나 디렉토리를 투과적ㅇ로 겹쳐서 하나의 파일 트리를 구성할 수 있는 파일 시스템이다. |
Btrfs | Linux용 Copy on Write 파일 시스템으로, 오라클에 의해 발표되었다. 과서의 상태로 돌아갈 수 있는 롤백 기능과 어떤 시점에 상태를 저장하는 스냅샷 기능을 보유하고 있다. |
Device Mapper | Linux 커널 2.6에 들어간 Linux의 블록 디바이스 드리아버와 그것을 지원하는 라이브러리들이다. 주로 파일 시스템의 블록 I/O와 디바이스 매핑 관계를 관리한다. Red Hat OS나 Ubuntu 등에서 도커를 이용할 때 사용한다. |
OverlayFS | UnionFS중 하나로, 파일 시스템에 다른 파일 시스템을 투과적으로 머징하는 장치이다. Linux 커널 3.18에 도입되어 읽기 전용 파일 시스템에 읽어 들이기가 가능한 파일 시스템을 겹침으로서 읽기 전용 파일 시스템상의 디렉토리나 파일에 대한 읽어 들이기, 변경이 가능해진다. 도커에서는 overlay, overlay2 2개의 드라이버를 이요할 수 있다. Linux 커널 4.0 이상의 경우에는 overlay2를 권장한다. |
ZFS | 오라클이 개발한 새로운 파일 시스템으로 볼륨 관리, 스냅샷, 체크섬 처리, 리플리케이션 등을 지원한다. 충분한 경험이 없을 경우 권장하지 않는다. |
[참고] 완벽한 IT 인프라 구축을 위한 Docker (2판)