Docker - 1
도커란?
도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
컨테이너는 배에 실는 네모난 화물 수송용 박스를 생각할 수 있는데, 각각의 컨테이너 안에는, 옷, 신발, 전자제품 등 다양한 화물을 넣을 수 있고 규격화되어 다양한 운송수단으로 쉽게 옮길 수 있다.
서버에서의 컨테이너도 이와 비슷하다. 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다. 데이터베이스 서버, 백엔드 프로그램 등 다양한 프로그램을 컨테이너로 추상화할 수 있고 AWS, Google cloude 등 어디에서나 실행할 수있다.
컨테이너

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술이다. 가상화 기술의 하나지만 기존의 방식과 차이가 있다.
기존의 가상화 방식은 주로 OS를 가상화 하였다. VMware나 VirtualBox같은 가상머신은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식이다. 이러한 방식은 여러가지 OS를 가상화 할 수 있고 비교적 사용법이 간단하지만 무겁고 느린 환경에서는 사용할 수 없었다.

전가상화나 반가상화는 추가적인 OS를 설치하여 가상화하는 방법은 성능문제가 있고 이를 개선하기 위해 프로세스를 격리하는 방식이 등장하였다.
리눅스에서는 이 방식을 컨테이너라고 하고 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작한다. CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거의 손실이 없다.
- 도커의 기본 네트워크는 Bridge 모드로 약간의 성능 손실이 있다.
- 네트워크 성능이 중요한 프로그램의 경우 --newt=host 옵션 고려
하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VM을 사용하는 느낌을 준다. 실행중인 컨테이너에 접속하여 명령어를 입력할 수 있고 패키지를 설치, 사용자 추가, 여러개의 프로세스를 백그라운드로 실행할 수도 있다. CPU나 메모리 사용량을 제한할 수 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있다.
이미지

도커에서 가장 중요한 개념은 컨테이너와 이미지이다.
이미지는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있다.
예를 들어 ubuntu 이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고 MySQL 이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보 등을 가지고 있다.
도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다.
레이어 저장방식

도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백메가에 이른다. 처음 이미지를 다운받을 땐 크게 부담이 안되지만 기존 이미지에 파일 하나 추가했다고 수백메가를 다시 매우 비효율적일 수 밖에 없다.
이를 해결하기 위해 Layer를 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다. 이미지는 여러개의 읽기 전용(read only) 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다. 위 그림과 같이 ubuntu 이미지가 A + B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx 가 된다. 더 나아가 webapp 이미지를 nginx 이미지 기반으로 만들었다면 A + B + C + nginx + source 레이어로 구성된다. webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운받으면 되기 때문에 효율적으로 이미지를 관리할 수 있다.
컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그래도 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용한다.
이미지 경로

이미지는 url 방식으로 관리하며 태그를 붙일 수 있다. ubuntu 14.04 이미지는 위 그림과 같이 docker.io/library/ubuntu:14.04 또는 :trusty 이고 docker.io/library는 생략이 가능하기 때문에 ubuntu:14.04 로도 사용할 수 있다.
Dockerfile
# vertx/vertx3 debian version
FROM subicura/vertx3:3.3.1
MAINTAINER chungsub.kim@purpleworks.co.kr
ADD build/distributions/app-3.3.1.tar /
ADD config.template.json /app-3.3.1/bin/config.json
ADD docker/script/start.sh /usr/local/bin/
RUN ln -s /usr/local/bin/start.sh /start.sh
EXPOSE 8080
EXPOSE 7000
CMD ["start.sh"]
도커는 이미지를 만들기 위해 Dockerfile 이라는 파일 자체에 DSL(Domain-specific language)를 사용하여 이미지 생성 과정을 적는다.