1. Docker란?
도커(Docker)는 리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트이다.
-위키백과
쉽게 말해서 컨테이너 작업 환경을 제공해주는 오픈 소스 프로젝트다. Go 언어로 작성되었으며 2013년에 공개되고 지금까지도 핫한 기술이다. 컨테이너는 호스트OS 위에서 가상화된 공간이다.
하지만 기존의 가상화 기술들은 이미 존재했다. 하이퍼바이저를 이용해 호스트OS 위에 여러 개의 운영체제(가상머신)를 돌리며 완전한 독립성과 시스템 자원을 할당 받는 방법이다.
그렇다면 컨테이너는 기존의 방식과 무엇이 다를까?
가상머신과 컨테이너의 구조 비교
VM은 확실한 격리 수준을 보장하며 각각의 머신마다 완벽한 운영체제를 생성할 수 있다는 장점을 가졌다. 하지만 그에따라 프로세스가 무거워지며 일반 호스트에 비해 오버헤드가 발생한다. 배포를 위한 이미지 또한 용량이 커짐을 피할 수 없다. 그러한 단점을 컨테이너는 해결한다.
docker의 컨테이너는 가상화된 공간을 생성하기 위해 리눅스의 자체 기능인 chroot, 네임스페이스(namespace), cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만든다.(그래서 기본적으로 docker는 리눅스 기반 컨테이너다.)
컨테이너 안에는 애플리케이션을 구동하는데 필요한 기본적인 라이브러리 및 실행 파일만 존재하기 때문에 가상 머신에 비해 성능이 빠르며 오버헤드 또한 거의 없다. 이미지도 가볍다.
VM과 컨테이너는 서로 간의 통신에서도 차이를 보인다. VM은 머신마다 하이퍼바이저에서 스위치를 제공하여 서로 통신이 가능하다. 반면 컨테이너는 IPC(시그널, 소캣, 파이프 등)을 통해 통신한다. 호스트 커널을 공유하고 있기 때문에 가능하다.
요약하자면 컨테이너는 'VM에 비해 낮은 격리 수준을 보여주지만, 더 가볍고 효율적인 독립된 가상화 환경을 제공하는 프로세스'이며, 도커는 이러한 컨테이너 작업 환경을 제공하는 오픈소스 프로젝트이다.
2. Docker의 구성 요소
1) 구조적 관점
도커의 기본적인 사용법은 이미지를 불러와서(또는 만들어서) 컨테이너를 생성해 사용하는 것이다. 이미지는 컨테이너의 설계도이며 그 설계도를 보며 메모리에 올리면서 컨테이너가 만들어진다.
위에서 서술했듯이 도커 이미지는 기존의 vm에 비해 훨씬 가볍다. 그래서 외부로 내보내거나 땡겨오는작업들이 활발하다. Docker에서 공식적으로 제공하는 이미지 저장소가 docker hub이다. Github처럼 계정을 생성하고 이미지를 커밋, 풀, 푸쉬를 하여 관리하며 다른 사용자의 공개된 이미지를 받아 올 수도 있다. 공식 hub 외에도 개인 저장소에서도 관리가 가능하다.
2) 내부적 관점
도커 데몬과 클라이언트 딴의 CLI는 REST API로 요청이 전해진다. 사용자는 CLI를 통해 컨테이너, 이미지, 네트워크 및 데이터 볼륨을 설정할 수 있다.
앞으로 각 요소들과 사용법에 대해 알아보자.